본문 바로가기
프로젝트/자동매매

가상화폐 트레이딩봇 제작기 - 프롤로그

by 굿햄 2022. 5. 8.

Subject

이번 글에서는 바이낸스(Binance)에서 자동매매가 가능한 파이썬(Python) 기반의 트레이딩 봇(AI Trading Bot)을 제작해보고자 합니다.

24시간 돌아가는 가상화폐 특성 상 새벽에도 강한 매수/매도 신호가 나타날 수 있는데 사람이 계속 차트를 볼 수만은 없으니 봇 관련 여러 자료를 찾았고,

2021년 6월 약세장 당시에 기초 지식이 없는 상태로 트레일링 형식의 매수/매도 봇을 제작했으나 계속 손실만 나는 것을 보고 골든크로스, 데드크로스 등의 매매기법과 인공지능을 활용한 방법까지 이 글에서 다뤄볼 것 입니다.

Product Dev Process

  • POC (Proof of concept) 프로토타입 -> 검증 -> 실현여부 판단의 단계를 거쳐 실제 사용가능할 수준의 콘솔기반 프로그램을 제작합니다.

목차

자동화 필요조건 (봇이 판단해야 할 값)
  Position (Long, Short, Non-Position)
  Stop Profit & Loss
  Leverage & Amount

패널티

  수수료&슬리피지
  펀딩비

데이터 수집
  차트 데이터 다운로드
  데이터 표준화

글쓰기에 앞서 2021년 트레일링 방식의 매수/매도 봇을 만들었었는데 코인의 변동성이 매우 큰 나머지 손실만 발생하던 일이 있었습니다. 그래서 최대한 이 방식은 피해서 제작하려하는데 이 또한 위험을 동반한 행동이므로 이 글을 보고 무작정 투자를 시작하는 일은 없었으면 합니다.

자동화 필요조건 (봇이 판단해야 할 값)

  • Position

본 글에서는 선물(Future)을 이용한 거래를 진행할 것이므로 롱, 숏, 무포지션을 판단할 수 있어야 합니다.

  • Stop PR

코인은 변동성이 매우 큰 시장입니다. 프로그램이 동작중 오류가 발생할 수도 있습니다.

따라서 예상치 못한 상황을 항상 대비하여야 손실을 줄일 수 있습니다.

  • Leverage & Amount

레버리지와 투자금액은 본인이 선택하거나 봇이 선택합니다.

Cross(교차)거래를 이용하여 높은 레버리지를 선택할 경우 모든 재산이 청산될 수 있으며 이는 재도전을 할 수 없는 상태가 됩니다.

마틴게일 베팅법에 따라 8회차 게임까지의 패배율은 0에 수렴합니다.

총 재산의 몇 퍼센트만 투자할 지 결정할 수 있어야 합니다.

첫번째 게임의 패배률은 50%입니다. 그러나 두번째 게임까지 패배할 확률은 25%로 크게 감소합니다.
이와 같은 원리로 8회차까지 게임에서 패배할 확률은 0.390625%가 됩니다.
유동적인 차트 그래프에서 승/패의 기준을 잡을 수는 없다는 의견 또한 많아 신뢰가 크지는 않습니다.

패널티

  • 수수료 & 슬리피지

바이낸스의 경우 Size에 따라 Taker(시장가 거래)는 0.04%, Maker(지정가 거래)는 0.02%의 수수료를 가져갑니다.

 

세계 1위 거래량인 만큼 호가창에 빈자리가 있을 가능성의 낮지만 지정가 거래가 체결되지 않을 확률이 있으므로 여기선 예상 슬리피지를 2%로 주어 시장가 체결로 진행합니다.

  • 펀딩비

선물거래는 무기한인 대신 8시간마다 롱/숏 비율에 따라 펀딩비를 내거나 받습니다. 

대체로 0.01% 수준이나 추세의 연속성이 길어질 경우 0.1%까지 크게 늘어나기도 합니다.

다만 이 금액은 Size에 영향은 미치지 않고 증거금에서 증감이 이루어지기 때문에 여기선 위의 슬리피지로 대체합니다.


데이터 수집

바이낸스에서 데이터를 가져오기 위해 API 신청 과정을 거칩니다.

코인 시장은 숫자가 매우 중요한 자리입니다. 따라서 일반적인 부동소수점이 아닌 Decimal 라이브러리를 사용하여 정확한 소수점을 표현합니다.

 

혹여나 연산 속도를 높히겠다거나 반올림을 사용하는 경우가 발생할 수도 있는데 Python3부터는 Banker's rounding 방식을 사용하면서 원치않는 결과가 유도될 수 있으니 주의하여야 합니다.

Ex) 1.5와 2.5의 반올림 값은 2로 동일합니다.
num_list = [1.5 + i for i in range(0, 10)]

str_lst = ['sum(num_list)', ## 일반적인 덧셈
           'sum(round(x) for x in xs)', ## banker's rounding
           'sum(round(x+0.01) for x in xs)', ## 일반적인 반올림
          ]

print(num_list)
print("_______")
print(f"{round(1.5) = }")
print(f"{round(2.5) = }")
print("_______")
for s in str_lst:
    print(f"{s} ==> {eval(s)}")
    
___________________________Result______________________________

[1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5]
_______
round(1.5) = 2
round(2.5) = 2
_______
sum(num_list) ==> 60.0
sum(round(x) for x in xs) ==> 60
sum(round(x+0.01) for x in xs) ==> 65

 

  • 차트 데이터 다운로드

바이낸스의 Rest API나 거래소에 특화된 라이브러리인 'cctx' 통해 OHLCV (Open, High, Low, Close, Volume) 차트 데이터를 가져올 수 있으나 Limit이 걸려있으므로 Binance Market Data 를 통해 CSV파일을 다운로드합니다.

잦은 호출로 인한 IP Block

1분 단위의 시간에 따른 데이터와 1틱마다 기록된 데이터가 있는데 여러 보조지표의 활용에 용이하고 더욱 세밀한 분석이 가능하도록 1분당 데이터를 활용합니다.

https://data.binance.vision/?prefix=data/futures/um/monthly/klines/BTCUSDT/1m/

저는 여기서 2021년 7월부터 올해 2월까지의 데이터를 사용하겠습니다.

디렉토리 안의 csv파일을 numpy array로 호출

  • 데이터 표준화

회귀분석을 진행한다면 저희가 구한 Sample 데이터셋은 여기서 독립변수 그리고 모수(Parameter)이고, 상승과 하락 여부는 독립변수에 의한 결과이므로 종속변수입니다.

엄밀히 말하면 kline 데이터셋도 사회의 영향에 따라 변동이 생기지만 여기선 차트에 모든 것이 반영된다는 가정하에 설계합니다.

 

그렇다면 일반적으로 제공되는 'datetime', 'open', 'high', 'low', 'close', 'volume'만으로 회귀분석이 가능할까요? 

저희는 투자를 할 때 시세보다 시세의 변화에 주목합니다. 따라서 MA지표와 볼린저밴드, RSI 그리고 거래량을 토대로 딥러닝을 할 수 있다고 추측합니다. 

 

저희의 데이터셋은 Result값을 갖고 있지 않습니다. 한마디로 모수는 있지만 매수해야하는지 매도해야하는지 정답은 없습니다. 따라서 지도 학습은 불가능하지만 어떤 특징이 있는지 작성하였습니다.


선형 회귀 분석(Linear regression model)은 수치형 레이블 예측에 특화되어 있습니다.

모수(parameter)을 주어주면 아래와 같은 수식을 만들어 x를 통해 y값을 유추합니다.

마치, 시대에 따른 집 값의 변화처럼 선형 그래프가 그려질 때 유리합니다.

하지만 저희 차트 그래프는 상승과 하락이 공존하므로 불가능합니다.

 

로지스틱 회귀 모형(Logistic regression model) 의 경우 범주형 레이블 예측에 특화된 모델로

위와 비슷한 원리로 선형을 만들어 선형보다 위에 있으면 긍정, 밑에 있으면 부정을 나타냅니다.

즉, 모수가 정규분포(normal distribution)의 특성을 가져야하는데, 지표들을 통해 상승 하락을 구분하는 것은 가능하지만 저희가 구한 데이터셋만으로는 언제 보상을 치뤄야 할 지 result 값을 알 수 없습니다. 

임의로 매수 타이밍과 매도 타이밍을 데이터셋 행에 0과 1로 내포할 수 있으나 이것은 사람이 내린 판단으로 정확도가 심히 떨어지며,

회귀 모형보단 아래와 같은 이유로 정해진 규칙에 따라 판단하는 의사 결정 트리(Decision Tree)를 개인적으로 더 권장합니다.

Decision tree
장점
- 데이터 전처리 불필요
- 범주형 변수에 대한 코딩(one-hot-encoding) 불필요
- 결정에 이른 과정 설명이 가능
단점
- 다른 기법보다 성능이 떨어지므로 앙상블 기법 사용 필요

또한 대부분의 트레이더들이 자기만의 규칙을 갖고 거래를 진행하는 것으로 알고있고, 인간의 감정적인 요소인 불안감과 기대감에 의해 불안정한 거래를 하는 것을 막는 것이 봇을 사용하는 주 이유라고 생각하기 때문입니다.


우리는 여기서 상승할 확률과 하락할 확률을 구할 수 있는 기법을 사용하거나, 강화학습을 통해 봇이 스스로 롱/숏/무 포지션을 선택할 수 있도록 학습시켜, 가장 잘 맞추는 모델을 찾아야합니다.

 

흔히 사용하는 RNN-LSTM을 이용한 시계열 데이터 기법은 현 시점이 t일 때 t-1, t-2...등 이전 은닉 상태(hidden state)를 입력값으로 가져오므로 보조지표들을 따로 데이터셋에 추가할 필요가 없다는 장점이 있습니다.

https://wikidocs.net/22886

문제는 LSTM 결과물 대부분이 후반영된 차트라는 점입니다.

이것에 관련해서는 이 분이 설명은 되게 잘해놓으셔서 꼭 읽어보라고 하고 싶네요..

https://codingapple.com/unit/deep-learning-stock-price-ai/

 

(칼럼) 딥러닝 초보들이 흔히하는 실수 : 주식가격 예측 AI - 코딩애플 온라인 강좌

(강의 전체 목록) 딥러닝 입문자들이 LSTM 배우면 꼭 도전해보는 분야가 바로 주식가격 예측입니다. LSTM은 연속된 sequence 데이터를 다룰 때 좋은 레이어라고 하지 않았습니까. 그래서 주식가격 흐

codingapple.com

여기서 저희가 주목해야하는 건 주식 가격 예측이 아닙니다. 주식의 시세는 중요하지 않습니다. 상승할지 하락할지 무포지션 상태가 안정할 지 판단해야 하는 겁니다.

 

다음 2편에서 이어집니다.


 

ⓒ 굿햄 2022. daryeou@gmail.com all rights reserved.

댓글