pizzaplanet

바이낸스 실시간 tick 가져오기 본문

Univ./Trading Program Project

바이낸스 실시간 tick 가져오기

scio 2018. 4. 18. 00:51

바이낸스(binance) api를 이용, 소켓(socket)을 열어 틱(tick)을 수집해보자! 티커(ticker)를 구현해보자!


CANDLESTICK



이 포스트를 이용하면 원하는 시간대의 캔들(봉)을 가져올 수 있다.

하지만 매매가 이루어 지는 프로그램을 만들기 위해선 실시간 거래 기록들을 알아야 한다.

캔들은 특정 시간대 동안 일어난 각각의 거래기록(Tick) 종합하여 [ High, Open, Close, Low ]를 나타낸다.


실제 상황에서 예로 들자면,

Binance에게 캔들을 요청하면 아래와 같이 Response가 반환된다.

[
  [
    1499040000000,      // Open time
    "0.01634790",       // Open
    "0.80000000",       // High
    "0.01575800",       // Low
    "0.01577100",       // Close
    "148976.11427815",  // Volume
    1499644799999,      // Close time
    "2434.19055334",    // Quote asset volume
    308,                // Number of trades
    "1756.87402397",    // Taker buy base asset volume
    "28.46694368",      // Taker buy quote asset volume
    "17928899.62484339" // Ignore
  ]
]


이 데이터가 특정시간동안 각각의 거래기록(Tick)의 종합이란 것이다. 즉 Tick들이 모여 캔들이 되는 것이다.

Tick을 5분간격으로 표현하면 5분봉, 1시간 간격으로 표현하면 1시간 봉.

매매는 실시간으로 가격을 알고 매수 매도를 걸어야 하므로 실시간 가격을 알아한다. 이를 위해 Tick 기록이 필요한데 rest-api에서는 실시간으로 tick을 받는 기능이 없다.


Tick Response



하지만! web-socket-streams에서 ticker 기능을 제공하여 실시간 거래기록을 볼 수 있다. 

바이낸스 공식 API 문서 中 web-socket-streams을 보면 Trade Streams이 있다. 이부분이 바로 실시간으로 tick를 가져오는 것에 대한 설명이다.


{
  "e": "trade",     // Event type
  "E": 123456789,   // Event time
  "s": "BNBBTC",    // Symbol
  "t": 12345,       // Trade ID
  "p": "0.001",     // Price
  "q": "100",       // Quantity
  "b": 88,          // Buyer order Id
  "a": 50,          // Seller order Id
  "T": 123456785,   // Trade time
  "m": true,        // Is the buyer the market maker?
  "M": true         // Ignore.
}

이제 ticker로 tick을 수집하여 train, test 데이터로 쓸 수 있게 되었다.

사실 가격 예측을 위한 training 단계에서는 Buyer order ID, Seller order ID 따위는 필요 없다 생각한다.

분석을 위해 필요한건  Event time, Trade ID, Price, Quantity, Trade time, Is the buyer the market maker?

이 6개라 생각한다. 


Trade ID는 왜 필요한가?



짧게 생각하면 Trade ID도 필요 없어 보이지만 결론부터 말하면 데이터의 완전성을 위해 필요하다.

DB 설계 입장에서 생각해보면 Trade ID가 primary key가 되는 셈. 

primary key를 Trade ID로 설정한 이유는 안정적인 tick 수집을 위해서다.


처음엔 연구실에 설치한 서버에서만 ticker를 돌리고 있었으나 어떤 사연으로 인해 ticker가 멈추어버렸다.

캔들정보는 과거 정보 요청도 가능하지만 tick은 그렇지 않다. 그리고 tick은 한개의 tick이라도 빠진다면 tick에 대한 신뢰도가 깨진다.

그러므로 tick을 수집하기로 마음을 먹었다면 빠짐 없이 tick이 수집되어야 하고 이를 위해 안전하게 서로 다른 서버에서 동시에 tick이 돌아가야 한다.

그래야 한쪽이 down 되더라도 추후에 trade id를 이용해 데이터 공백을 채워 tick의 완전성을 지킬 수 있다.




Ticker code



rest-api 이용시에는 Binance의 공식 API를 사용했으나 Ticker 구현시에는 package를 이용했다.

바로 sammchardy 의 python-binance인데 연관 package 중 가장 많은 스타를 받았다. 이를 이용하여 Ticker를 구현하였다. 정말 간단.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from binance.client import Client
import binance_api_key as bak 
import time
import json
from binance.websockets import BinanceSocketManager
 
def process_message(msg):
    msg_= msg['E'], msg['t'],msg['p'],msg["q"],msg["T"],msg["m"#pre-processing
    msg_=json.dumps(msg_)
    with open("ticker.json""a") as data:
        data.write(msg_)#,msg_['t'],msg_['p'],msg_["q"],msg_["T"],msg_["m"])
        data.close()
 
if __name__ == "__main__":
    BTC = 'BTCUSDT'
    start_time = time.time()
    client = Client(bak.__Api__(), bak.__Sign__())
    bm = BinanceSocketManager(client)
    conn_key = bm.start_trade_socket(BTC, process_message)
    bm.start()
cs


8-12 line: 앞서 필요하다 언급했던 6개의 정보만 필터링하여 json 형태로 저장한다.

19 line: api key를 넣어야 하기에 노출방지를 위해 따로 파일로 빼두어 import 해주었다

'Univ. > Trading Program Project' 카테고리의 다른 글

AI Trading Model Research  (0) 2018.05.08
바이낸스 과거 캔들 가져오기  (2) 2018.04.18
Binance rest-api 이용해보기  (2) 2018.03.13
팀 분배 및 팀 이슈  (0) 2018.03.13
Server ssh, ftp setting  (2) 2018.03.10
Comments