우리가 만들고자 하는 자동매매프로그램 또한 업비트에서 제공하는 API 를 이용해서 종목의 현재가를 감시하고 서버에 직접 매수/매도 주문을 넣는 프로그램이다. 백 테스팅또한 API 를 통해 종목의 과거 체결가를 조회해서 정리하고, 사용하고자 하는 전략을 적용했을 때 얼마의 수익을 냈을 지 예측하는 것이므로, 모든 것에 앞서서 API 에 대해서 짚고 넘어가고자 한다.

요즘 대부분의 플랫폼들은 API 를 제공한다. API 는 (Application Programming Interface) 의 약자로 프로그래밍 언어가 해당 플랫폼에서 제공하는 기능을 제어할 수 있게 만들어주는 인터페이스다. 개발을 하고있는 사람이라면 API 가 무엇인지 잘 알겠지만, 개발자가 아니라면 API 건 프로그래밍 언어건 도통 무슨 말인지 모를것이다.
우선 우리가 사용하는 Python 이나 Java, C++ 등을 우리는 프로그래밍 언어라고 부른다. 프로그래밍 언어를 이용해서 프로그램을 작성하고 기계는 프로그램 Input 을 읽어서 Output 을 내어준다. 마치 식당의 종업원과 같은 역할로 비유하곤 한다.

이미지출처 : wishket 블로그

API 의 작동방식은 다음과 같다. 우리는 식당에서 원하는 요리를 주문 ( 프로그래밍 / Input ) 한다. 우리의 주문을 종업원( API ) 는 주방 ( 서버 / 프로그램 )으로 전달한다. 반대로 주방에서 나오는 요리 ( 데이터 / Output ) 를 종업원은 우리에게 전달한다.
따라서 우리는 API 에게 과거 시간별 체결량 정보를 요청하고 업비트에서는 그 정보를 내어준다. 특별한 작업같이 느껴질 수 있겠지만, 사실 우리는 해당 서비스를 받고 있다. 모바일이든, 웹에서든 거래창을 띄우면 보여주는 캔들 정보들을 수치화 한 것이 바로 우리가 요청하고자 하는 정보이기 때문이다.

조금 찾아본다면 나와 비슷하게 백테스팅을 진행하는 사람들을 쉽게 찾아볼 수 있고 다수는 엑셀이 아닌, 코드를 통해서 변동성 상수 K 값을 계산한다. 여기서 내가 엑셀을 사용한 이유는 내가 엑셀을 사용했던 경험이 있어서 코딩을 통해서 하는 것 보다 엑셀이 더 편해서 였다.
나는 openpyxl 라이브러리를 사용하여 데이터프레임을 엑셀화했다.

import openpyxl as xl

wb = xl.Workbook()
sheet = wb.active
sheet.title = '변동성돌파백테스팅'

col_names = ['date','open','high','low','fin','vol']
for seq, name in enumerate(col_names):
    sheet.cell(row=1, column=seq+1, value=name)

Workbook() 과 wb.active 는 데이터 write 를 위한 임시 엑셀파일을 열어서 sheet 를 활성화 한 것이고, sheet의 이름은 "변동성돌파백테스팅" 으로 했다. 물론 sheet title 은 마음대로 설정해도 상관없다.
그리고 맨 윗줄에 백테스팅에 필요한 데이터인 날짜와시간, 시가, 고가, 저가, 종가 를 넣어주었다. 

이제 데이터 프레임을 받아와야하는데, 만약 일봉을 받아온다면 업비트에서 제공하는 최대 200개의 데이터라면 변동성 상수를 찾기위한 백테스팅에 충분하다. 하지만, 이 당시의 나는 일확천금을 노리던 불나방과도 같았기에 10분봉 30분봉을 보곤 했는데, 그러기엔 최대 200개라는 데이터가 턱없이 부족했다. 결국 beautifulsoup 라이브러리를 이용해서 스크래핑해올까 까지 생각이 닿을 무렵, 검색하다보니 업비트에서는 비공식 API가 존재한다는 사실을 알았다.

업비트 비공식 API 의 형식은 다음과 같다.

https://crix-api-endpoint.upbit.com/v1/crix/candles/"TYPE"/"TIME"?code=CRIX.UPBIT.KRW-"TICKER"&count="COUNT"&to="TO_DATE"

여기서 변수는 큰 따옴표로 표시를 하였는데, TYPE 은 일봉에 해당하는 "days" 혹은 분봉에 해당하는 "minutes" 를 (설마 주봉이나 월봉을 보는 사람은 없을것이라 생각한다.), TIME 은 분봉의 경우 1,3,5,10,30 등의 분봉시간을 일봉의 경우 제외한다. TICKER 는 말그대로 조회하고자 하는 종목명을 ("BTC"),  COUNT 는 얻고자 하는 데이터 수를 ( 400 ), TO_DATE 는 400개 이상의 데이터를 원할때 원하는 날짜/시간 까지의 데이터를 작성하면 된다.

[[ 마무리 ]]

만약 다른곳에서 백테스팅을 찾아 본 사람이라면 해당 정보가 조금은 도움이 되지 않을까 싶다. 해당 코드의 가장 큰 장점은 공식 API 가 지원하지 않는 400개 이상의 데이터를 받아올 수 있다는 점이다. 다음 글에서는 해당 비공식 API를 통해 데이터를 불러오고, 원하는 정보만을 엑셀에 저장하는 과정까지를 담고자 한다.

P.S. 저는 절대 자동매매를 추천드리지 않습니다. 자동매매가 돈이 됐으면 저도 이렇게 취업준비를 하고 있지 않겠지요? 재미로만 만들고 구동해보시길 추천드립니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기