선물시장이란 내가 코인을 보유하고 있지 않아도 매도를 누를 수 있고, 내가 보유하고 있는 현금보다 더 많은 양의 주문을 할 수 있게 해주는 상품입니다. 선매수하는 포지션을 롱, 선매도하는 포지션을 숏이라고 부릅니다. 이 롱과 숏의 포지션 비율데이터를 이용하여 전략을 만들어보고 텔레그램 알림까지 진행해 보겠습니다.
롱/숏 비율
선물 지표 종류
바이낸스 선물 차트에서 지표 아이콘을 클릭 후 Sub-Trading Data 탭을 클릭하면 선물과 관련된 지표들이 나옵니다. 총 5가지로 이번 글에서는 롱/숏 비율과 관련된 위에서부터 4가지를 다루어 볼 것입니다. 참고로 마지막 'B.S Vol.'은 시장가로 체결된 롱과 숏의 거래량으로, 저는 이것이 유의미한 지표는 아니라고 보기 때문에 넘어가도록 하겠습니다.
Save를 눌러 지표를 추가하면 다음과 같이 4개의 지표를 제공받을 수 있습니다. 비트코인 1시간 봉으로 나타낸 예시이며, 확실히 시세의 변동에 따라 지표가 움직이는 것을 볼 수 있습니다. 본인이 차트의 시세와 이 지표들의 유의미한 관계성을 발견했다면 그에 따라 전략을 만드시고 알림 기능을 사용하여 시간을 아낄 수 있게 하는 것이 이번 포스팅의 목적입니다.
롱/숏 계정 수 비율
흔히들 말하길 롱이 늘어났다, 숏이 늘어났다는 표현을 쓰곤 합니다. 그런데 간혹 "롱 물량이 늘어났다.", "숏 물량이 늘어났다."라고 말하는 사람들이 있습니다. 이것은 잘못된 표현입니다. 왜냐하면 롱포지션의 물량과 숏포지션의 물량은 항상 Open Position기준(진입 기준) 1:1이기 때문입니다. 특정코인의 롱 포지션이 1억테더가 있다면 반대편인 숏도 1억테더의 포지션이 잡혀있는 것입니다. 그러므로 바이낸스에서는 단순히 '롱/숏 비율'이 아닌 '롱/숏 계정수 비율'을 지표로 제공하는 것입니다.
롱과 숏의 물량이 같다는 것을 알았으니 이제 포지션을 보유하고 있는 계정 수를 비교하게 되는데, 일반적으로 롱의 계정 수가 더 많다면 개미들이 롱 포지션에 몰려 있는 것이고 숏은 상대적으로 고래가 많이 포진되어 있다고 해석하실 수 있습니다. 그렇다고 개미가 많은 포지션의 방향으로 가지 않는다는 보장은 없습니다. 오히려 경험상 롱 계정 수가 정점을 찍을 때 위로 간다거나 숏 계정 수가 피크를 찍고 다시 줄어들 때 더 이상 상승하지 않고 하락하는 경우가 빈번합니다. 한쪽의 견해로만 치우치지 않고 경험적 데이터로 관계성을 찾으시는 것을 추천드립니다.
비율은 1 이상일 경우 롱이 더 많은 것이고, 1 이하일 경우 숏이 더 많은 것입니다. 위의 그림을 보시면 계정 비율에 대한 지표가 2개 있는데 하나는 마진밸런스(선물 계정 자본)가 상위 20%인 계정만을 집계한 것이고, 다른 하나는 전체의 계정을 대상으로 비율을 계산한 것입니다. 다음 설명은 바이낸스에서 정의한 것을 가져온 것이니 참고하시길 바랍니다.
L.S Acco. - Long/Short Account Ratio
The proportion of net long and net short accounts to total accounts of the top 20% users with the highest margin balance. Each account is counted once only. Long Account % = Accounts of top traders with net long positions / Total accounts of top traders with open positions. Short Account % = Accounts of top traders with net short positions / Total accounts of top traders with open positions. Long/Short Ratio (Accounts) = Long Account % / Short Account %.
L.S Ratio - Long/Short Ratio
The proportion of net long and net short accounts to total accounts with positions. Each account is counted once only. Long Account % =Accounts with net long positions / Total Accounts with positions. Short Account % =Accounts with net short positions / Total Accounts with positions. Long/Short Ratio = Long Account % / Short Account %.
미체결약정 Open Interest
줄여서 'O.I.'라고도 하는 미체결약정은 아직 정리되지 않은 숏과 롱 포지션의 물량입니다. 캔들은 해당 코인의 개수, 라인은 National Value로 간단하게 거래대금처럼 테더 기준으로 환산한 것이라고 생각하시면 됩니다. 물론 이것도 진입했을 때의 사이즈가 기준으로 적용된 것입니다.
그러므로 미체결약정이 늘어난다는 것은 롱, 숏 모두 동일하게 진입하는 물량이 늘어났다는 뜻이며, 반대로 미체결약정이 줄어든다는 것은 롱, 숏 모두 동일하게 물량이 빠져나갔다는 뜻으로 해석할 수 있습니다. 제 경험을 예시로 들자면, 전고점이나 전저점처럼 기준선을 돌파하거나 CPI발표처럼 변동성이 강할 때 순간적으로 OI가 줄어들었습니다. 아마 누군가 청산당할 때 쏟아지는 물량을 기회로 자신의 포지션을 정리했다는 것을 예상할 수 있습니다. 마찬가지로 어떻게 해석할지는 본인 매매내공으로 판단하시는 것이 좋다고 생각합니다.
롱/숏 마진밸런스 비율
L.S Posit. - Long/Short Position Ratio
The proportion of net long and net short positions to total open positions of the top 20% users with the highest margin balance. Long Position % = Long positions of top traders / Total open positions of top traders. Short Position % = Short positions of top traders / Total open positions of top traders. Long/Short Ratio (Positions) = Long Position % / Short Position %.
위의 설명 중에 주목할 부분은 마진밸런스 상위 20% 유저의 포지션 비율이라는 것입니다. 전체 포지션 비율(open 기준) 은 항상 1:1이라고 말했지만 상위 20% 유저들의 포지션만을 비교하게 된다면 차이가 나게 되는 겁니다.
The Margin Balance is the balance of your Binance Futures account, including your unrealized PnL (Profit and Loss)
여기서 마진밸런스란, 선물계정에 남아있는 잔고와 현재 가지고 있는 포지션의 unrealized PnL(미실현 손익)을 더한 값입니다. 간단하게 현재 선물계정의 예상 잔고입니다. 상위 20%라면 상대적으로 큰 자산을 보유하고 있는 유저라는 뜻이고 그들이 어느 포지션에 더 많은 돈이 몰려있는지 알 수 있는 것입니다.
주의할 점은 상위 20%라고 해도 워낙 허수가 많기 때문에 상대적으로 많은 자본이라고 보는 것일 뿐 이것을 고래나 세력의 움직임이라고 해석하는 것은 조금 무리가 있는 것 같습니다.
파이썬 코드
HTTP요청
우선 바이낸스에서 HTTP요청을 하여 선물 지표 데이터를 받아와야 합니다. 자세한 것은 이전 글을 참고해 주시길 바랍니다.
[python]코인 알림 봇 만들기(4편) : 비트코인 선물 지표 데이터 추출
이번 4편은 3편(웹스크래핑)의 응용 편입니다 저번 3편에서는 비트코인의 시가, 고가, 저가, 종가, 거래량처럼 차트의 기본적인 데이터만을 가져왔다면 이번 3.5편은 다른 다양한 지표도 추출할
goldfishman.tistory.com
import requests
import pandas as pd
def oi(symbol, interval):
url = "https://www.binance.com/futures/data/openInterestHist?symbol=" +symbol+ "USDT&period=" +interval+ "&limit=500"
headers = {"User-Agent": "본인의 유저에이전트"}
res = requests.get(url, headers=headers)
res.raise_for_status()
value = res.json()
OPEN_INTEREST = pd.DataFrame(value)
return OPEN_INTEREST
def account_ratio(symbol, interval):
url = "https://www.binance.com/futures/data/topLongShortAccountRatio?symbol=" + symbol + "USDT&period=" + interval + "&limit=500"
headers = {"User-Agent": "본인의 유저에이전트"}
res = requests.get(url, headers=headers)
res.raise_for_status()
value = res.json()
ACCOUNT_RATIO = pd.DataFrame(value)
return ACCOUNT_RATIO
def position_ratio(symbol, interval):
url = "https://www.binance.com/futures/data/topLongShortPositionRatio?symbol=" + symbol + "USDT&period=" + interval + "&limit=500"
headers = {"User-Agent": "본인의 유저에이전트"}
res = requests.get(url, headers=headers)
res.raise_for_status()
value = res.json()
POSITION_RATIO = pd.DataFrame(value)
return POSITION_RATIO
print(oi("BTC", "1h"))
print(account_ratio("BTC","1h"))
print(position_ratio("BTC","1h"))
각각 미체결약정, Top20% 롱/숏 계정 비율, Top20% 롱/숏 포지션 비율입니다. 위의 코드를 실행하게 되면 다음과 같은 데이터프레임을 얻으실 수 있습니다.
symbol sumOpenInterest sumOpenInterestValue timestamp
0 BTCUSDT 102833.18200000 2869764007.11447240 1679835600000
1 BTCUSDT 103207.64200000 2903953422.95400000 1679839200000
2 BTCUSDT 103090.98600000 2864372736.91140000 1679842800000
3 BTCUSDT 102506.46900000 2849480694.70656000 1679846400000
4 BTCUSDT 102149.92700000 2827121809.63740000 1679850000000
.. ... ... ... ...
495 BTCUSDT 101691.70600000 3076072414.79400000 1681617600000
496 BTCUSDT 101586.70000000 3076792868.24685760 1681621200000
497 BTCUSDT 101296.66500000 3068954670.50550000 1681624800000
498 BTCUSDT 101493.34700000 3074142136.61770000 1681628400000
499 BTCUSDT 101201.13800000 3069501356.33660000 1681632000000
symbol longAccount longShortRatio shortAccount timestamp
0 BTCUSDT 0.4433 0.7963 0.5567 1679835600000
1 BTCUSDT 0.4408 0.7883 0.5592 1679839200000
2 BTCUSDT 0.4449 0.8015 0.5551 1679842800000
3 BTCUSDT 0.4463 0.8060 0.5537 1679846400000
4 BTCUSDT 0.4455 0.8034 0.5545 1679850000000
.. ... ... ... ... ...
495 BTCUSDT 0.4637 0.8646 0.5363 1681617600000
496 BTCUSDT 0.4665 0.8744 0.5335 1681621200000
497 BTCUSDT 0.4685 0.8815 0.5315 1681624800000
498 BTCUSDT 0.4629 0.8619 0.5371 1681628400000
499 BTCUSDT 0.4635 0.8639 0.5365 1681632000000
symbol longAccount longShortRatio shortAccount timestamp
0 BTCUSDT 0.5313 1.1337 0.4687 1679835600000
1 BTCUSDT 0.5286 1.1214 0.4714 1679839200000
2 BTCUSDT 0.5301 1.1281 0.4699 1679842800000
3 BTCUSDT 0.5296 1.1260 0.4704 1679846400000
4 BTCUSDT 0.5310 1.1321 0.4690 1679850000000
.. ... ... ... ... ...
495 BTCUSDT 0.5257 1.1082 0.4743 1681617600000
496 BTCUSDT 0.5257 1.1083 0.4743 1681621200000
497 BTCUSDT 0.5248 1.1042 0.4752 1681624800000
498 BTCUSDT 0.5228 1.0956 0.4772 1681628400000
499 BTCUSDT 0.5233 1.0976 0.4767 1681632000000
행은 500개로 동일하고, OI는 4개의 열, 나머지는 5개의 열을 가지고 있습니다. 이제 이 데이터를 바탕으로 전략을 짜고 알림 조건식을 설정하시면 됩니다.
계정수 비율 지표의 경우 전체 비율과 Top20% 비율이 거의 커플링이며 유의미한 차이가 없기 때문에 저는 주로 Top20% 지표 하나만을 사용합니다. 전체 계정의 비율을 사용하고 싶으신 분들은 아래의 url 양식을 써주시길 바랍니다.
url = https://www.binance.com/futures/data/globalLongShortAccountRatio?symbol=BTCUSDT&period=15m&limit=500
전략 세우기(조건식 설정)
위 차트는 비트코인의 1시간 봉 차트입니다. 롱/숏 계정 비율을 보시면 지표가 고점일 때 비트코인이 저점을 형성한 듯합니다. 그러므로 롱/숏 계정 비율이 일정기간 기준 최댓값을 갱신하고 하락하는 차트를 잡아내는 것을 목표 전략으로 삼겠습니다.
위에 HTTP요청으로 얻은 데이터프레임 중 Top20% 계정 비율 지표만을 사용할 것이며, 또한 그중 'longShortRatio' 칼럼만 사용하도록 하겠습니다.
import binance as bn
import threading
tickers = bn.tickers("future")
def run():
for i in tickers:
try:
ratio = bn.account_ratio(i,"1h")['longShortRatio'].astype(float)
ratio497 = ratio.iloc[-3]
ratio498 = ratio.iloc[-2]
range = ratio[-168:]
ratio_max = range.max()
if ratio497 == ratio_max and ratio497 > ratio498:
bn.tel_text(i + " 롱/숏 비율: " + str(ratio497))
except Exception as e:
bn.tel_text(i + " " + str(e))
else:
pass
threading.Timer(3600, run).start()
run()
위에 만들었던 지표 HTTP요청 함수들은 binance.py에 저장 후 import binance as bn으로 필요한 함수만 불러와서 사용하였습니다. 선물시장에 상장된 코인들의 심벌들로 리스트를 만든 후 for반복문으로 매개변수 symbol을 입력하게 만들었습니다. if문은 (1) 총 1주일(168시간) 동안 ratio의 최댓값이 ratio497일 경우와 (2) 다음 캔들의 ratio값이 줄어들 경우를 조건식으로 만들었습니다.
이해 안 되는 부분이 있으면 이전 포스팅이나 코인 봇 만들기 카테고리를 참고해 주시길 바랍니다.
'기술/코인 알림 봇 만들기 (기초)' 카테고리의 글 목록
코인 금붕어의 코인 반성문
goldfishman.tistory.com
'기술/지표 알림 봇 (응용)' 카테고리의 글 목록
코인 금붕어의 코인 반성문
goldfishman.tistory.com
텔레그램 결과물
CELO 코인이 조건식에 부합하여 위와 같이 알림이 왔습니다.
일단 계정 비율이 최댓값을 찍은 것을 확인할 수 있었습니다. 하지만 이 차트가 상승한다는 확신은 아직 들지 않네요.
다들 자신만의 관점으로 지표와 차트의 관계를 파악하고 필승전략을 세우고 성투하시길 바랍니다.
'기술 > 지표 알림' 카테고리의 다른 글
VWAP(거래량가중평균가격) 지표 계산 및 알림 (410) | 2023.05.12 |
---|---|
볼린저밴드 BOLL 텔레그램 알림 (451) | 2023.05.10 |
MACD 알림 설정하는 방법 (415) | 2023.04.13 |
지수이동평균(EMA) 가중이동평균(WMA) 계산 (457) | 2023.04.11 |
이동 평균(MA) 골든크로스 알림 (398) | 2023.04.09 |
댓글