[암호화폐 자동매매] 체결강도 흐름 추적
업비트 REST API를 파이썬을 활용합니다.
업비트 거래창을 보면 "체결강도" 항목이 있습니다. 경험상 거래가 체결되는 가격이 매도자 우위인 경우 100%보다 큰 수이고, 매수자 우위인 경우 100%보다 작았습니다. 다시 말해 매도자 우선인 경우 가격이 상승 추세이고 매수자 우선인 경우 하락 추세입니다. 이 내용을 검증하기 위해 파이썬을 활용하여 체결강도를 추적해 보았습니다.
코드를 보기 전에, 업비트에서 API 상으로 받는 체결강도 데이터와 업비트 매매창에서 나오는 체결강도 데이터는 다소 차이가 있을 수 있음을 알려드립니다.
첨부되는 코드는 사용자 환경에 따라 구동되지 않을 수 있으며, 주요 로직에 대한 참고용으로 사용하시면 됩니다.
import ccxt
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import argparse
import datetime
import time
# 업비트 API 설정
with open("upbit.txt") as f:
api_key, secret_key = [line.strip() for line in f.readlines()]
exchange = ccxt.upbit({
'apiKey': api_key,
'secret': secret_key,
})
# 데이터 가져오기
def fetch_data(symbol, timeframe='1m', limit=200):
ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
return df
# 체결 강도 계산
def calculate_order_flow(symbol):
trades = exchange.fetch_trades(symbol)
buy_volume = sum(trade['amount'] for trade in trades if trade['side'] == 'buy')
sell_volume = sum(trade['amount'] for trade in trades if trade['side'] == 'sell')
if buy_volume + sell_volume == 0:
return 0 # 거래가 없으면 0 반환
return buy_volume / (buy_volume + sell_volume)
# 그래프 업데이트
def update_graph(frame, ax1, ax2, ax3, symbol):
global order_flow_history, current_price_history
# 체결 강도 계산
order_flow = calculate_order_flow(f'{symbol}/KRW')
order_flow_history.append(order_flow)
# 최근 200개 데이터만 유지
if len(order_flow_history) > 1200:
order_flow_history = order_flow_history[-1200:]
# 가격 데이터 가져오기
df = fetch_data(f'{symbol}/KRW', timeframe='1m', limit=1)
current_price = df['close'].iloc[-1] # 최신 종가
# 가격 데이터를 history에 추가
current_price_history.append(current_price)
# 최근 200개 데이터만 유지
if len(current_price_history) > 1200:
current_price_history = current_price_history[-1200:]
# 첫 번째 그래프 (체결 강도)
ax1.clear()
ax1.plot(order_flow_history, label='Order Flow Intensity', color='blue')
ax1.set_title(f'{symbol} Order Flow Intensity')
ax1.set_ylim(0, 1) # 체결 강도는 0과 1 사이
ax1.set_ylabel('Intensity')
ax1.set_xlabel('Time (latest trades)')
ax1.legend()
# 두 번째 그래프 (스무딩된 체결 강도 - 60과 20 윈도우)
smoothed_order_flow_60 = pd.Series(order_flow_history).rolling(window=60).mean()
smoothed_order_flow_20 = pd.Series(order_flow_history).rolling(window=20).mean()
ax2.clear()
ax2.plot(smoothed_order_flow_60, label='Smoothed Order Flow Intensity (60)', color='red')
ax2.plot(smoothed_order_flow_20, label='Smoothed Order Flow Intensity (20)', color='orange')
ax2.set_title(f'{symbol} Smoothed Order Flow Intensity')
ax2.set_ylim(0, 1)
ax2.set_ylabel('Intensity')
ax2.set_xlabel('Time (latest trades)')
ax2.legend()
# y=0.5에 점선 추가
ax2.axhline(y=0.5, color='black', linestyle='--', label='y=0.5 Line')
# 세 번째 그래프 (현재 가격)
ax3.clear()
ax3.plot(current_price_history, label='Current Price', color='green')
ax3.set_title(f'{symbol} Current Price')
ax3.set_ylabel('Price (KRW)')
ax3.set_xlabel('Time (latest trades)')
ax3.legend()
# 메인 함수
def main(symbol):
global order_flow_history, current_price_history
order_flow_history = []
current_price_history = []
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(8, 9)) # 3개의 그래프
ani = animation.FuncAnimation(fig, update_graph, fargs=(ax1, ax2, ax3, symbol), interval=1000) # 1초 간격 업데이트
# 그래프 간격 조정 (수평 간격은 0.3, 수직 간격은 0.5)
plt.subplots_adjust(hspace=0.5)
plt.show()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='업비트 체결 강도 그래프')
parser.add_argument('symbol', type=str, help='거래할 암호화폐 심볼 (예: BTC)')
args = parser.parse_args()
symbol = args.symbol # 명령행 인자로 받은 symbol 설정
main(symbol)
위 코드 실행결과는 아래와 같습니다.
맨 위 그래프는 체결강도를 1초 단위로 추적한 데이터입니다. 두 번째 그래프는 체결강도 데이터의 단순이동평균 20, 60선입니다. 0.5 이상이면 매수자 우위를 의미한다고 판단할 수 있습니다. 세 번째 그래프는 현재 리플의 가격입니다.
프로그램을 실행하고 모니터링 해 본 결과 단순이동평균 값이 0.5 이상인 경우 가격이 시간이 흐름에 따라 상승하는 경향이 있습니다. 또한 그래프의 기울기로 가격 변화량이 급격한지 완만한지 추적할 수 있습니다.
가격이 급락하는 경우 이동평균값이 0.5 이하로 떨어지는 경향이 있었습니다. 급락 후 횡보를 거쳐 다시 상승기로 접어들게 되면 0.5 이상의 값으로 상회하는 경향이 있습니다. 이 시점을 매수 포인트를 확정하는데 참고할 계획입니다.
끝.
댓글
댓글 쓰기