[암호화폐 자동매매] 체결강도 흐름 추적

업비트 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 이상의 값으로 상회하는 경향이 있습니다. 이 시점을 매수 포인트를 확정하는데 참고할 계획입니다.

끝.

 

댓글

이 블로그의 인기 게시물

전력(kW) 계산하기 (직류, 교류 단상, 교류 삼상)

[PLC] PLC 아날로그 입출력 기본

제너 다이오드에 저항을 연결하는 이유

공압 속도 제어: 미터인 vs 미터아웃

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)

[python] 파이썬 pyplot 2차원 그래프 샘플 코드

3상 모터 전력에서 전류 계산하기 (How to Convert Three-Phase Power to Amps)

3선 결선식 센서의 타입 PNP, NPN

[PLC] 릴레이 잔류전압와 블리더 저항

[PLC] PLC 입출력 타입 - 싱크 & 소스 (Sink & Source)