[kr-dev] 업빗 및 cryptocompare 거래소에서 받은 정보로 중첩 차트 그리기

in #kr6 years ago (edited)

평상시에 관심있어 하는 코인들이 오를땐 다 같이 오르고 내릴때도 다 같이 내리는 경우가 많은데, 그래도 그 중에서 어떤 코인이 많이 오르거나 적게 내리는지 궁금한 적이 많았습니다.

그리고 오늘 법무부의 일탈(?)로 인해 발생한 엄청난 해프닝을 계기로 그동안 미뤄왔던 숙제를 해버렸네요.

어떻게 보면 파이썬을 이용한 투자( #kr-systemtraing)에서 처음으로 데이터를 분석하는 포스팅이기도 합니다. ^^

그럼 이제 본론으로 들어가서, 지난 포스팅에서 차트 정보를 받아서 데이터 분석용 자료형인 pandas패키지의 dataframe에 넣어봤는데, 이번에는 그렇게 넣은 데이터로 차트를 그리는 것을 해보겠습니다.

코드를 보기 전에 설명드릴 부분은 데이터로 차트를 그리는 함수 plot()이 있습니다.

파이썬의 그래픽 라이브러리인 matplotlib에 포함된 수많은 클래스 중에 하나인 pyplot의 실행 함수라고 보시면 되겠습니다.

기본적인 구조는 import matplotlib.pyplot as plt를 통해 라이브러리를 로드한 후 plt.plot(x축정보, y축정보)형태로 호출하면, python 편집기 (또는 브라우저 실행환경인 jupyter notebook)의 출력창에 그래프가 표시됩니다.

코드를 설명드리면 먼저 x축에 해당하는 시간을 timestamp라는 컴퓨터 업계의 시간단위를 사람이 읽을 수 있는 파이썬 시간 자료형으로 변경하여 Dataframe 자료형의 인덱스로 삼습니다. df.index = [dt.datetime.fromtimestamp(ts) for ts in df.time]

한편, 여러 코인의 차트를 하나의 차트에 겹쳐서 그리기 위해서 데이터가 시작하는 시점을 기준점으로 잡아 가격이 아닌 등락비율로 y축을 설정였고, df_ratio = (df - df.open.values[0])/df.open.values[0]

차트 시작점을 0으로 맞추었습니다. df_ratio.close - df_ratio[0:1].close.values[0]

마지막으로 legend()함수를 사용해서 범례를 하단에 표시하였습니다.

차트를 하나에 겹치는 작업은 파이썬이 알아서 진행을 해주기 때문에, 코인별로 plot()함수를 연속으로 호출하기만 하면 됩니다.

먼저 실행 결과를 보면... 리플이 이 포스팅 준비를 하는 동안 많이 올랐네요 ^^

그리고 위 그림을 그려주는 프로그램 코드는 다음과 같습니다.

텍스트로 넣으니, 들여쓰기가 무시되고 코드의 색상도 사라져서 가독성이 떨어지기 때문에 이미지로 캡쳐하여 올립니다. (사용하고 있는 편집기는 파이썬 패키지를 깔면 함께 설치되는 spyder입니다)

역시 몇 줄 안되는 파이썬 코드로 상당히 많은 작업을 처리할 수 있었습니다.

프로그래머라도 이걸 다 외워서 사용할까 싶을 만큼 생소한 함수와 인자들이 많았는데, 구글로 필요한 기능을 꾸준이 검색을 하다보면 좀 덕지덕지 되는 느낌이 있기는 하지만 얼추 잘 동작합니다. ^^

아까 퇴근후에 별의별 삽질을 다 해가며 두어시간 걸려서 만들었는데, 테스트하느라 지저분한 코드와 주석들을 다 지우고 나니 실제 코드는 20줄 밖에 안되는군요 ㅎㅎ

포스팅의 마지막으로 업빗에서 정보를 받아 차트를 그리는 부분을 설명드리겠습니다.

cryptocompare와 달리 업빗은 3-4번 호출할때 한번 정도 데이터를 받아오는 것을 성공하더군요. 그래서 이런 부분을 처리하기 위해 소위 '에러처리'를 공부하느라 진땀을 뺐습니다.

에러처리의 기본 구분은 try: ~ except: ~ 로써 오류가 날 수 있는 코드를 try에 넣고, 오류가 발생하면 excep 부분의 코드가 실행되며, 정상처리되면 except를 건너띄고 프로그램이 진행됩니다.

역시 코드를 미리 설명드리면 cryptocompare의 프로그램과 거의 차이가 없는데, 일단 차트를 받는 부분이 오류가 발생할 가능성이 있는 부분이라 가독성을 위해서 차트 받는 부분을 별도의 함수로 만들었습니다.

그리고 오류 처리 구분안에서 코인 하나씩 위 함수를 실행시키고 차트를 그리도록 하였습니다. try ~ except 구분 밖에 무한루프 while을 걸어서 오류가 없을 때까지 getChart를 실행시키도록 하였습니다.

이렇게 한 이유는 파이썬에 goto문이 없어서 오류가 발생하면 except로 넘어가는데, getChart함수를 한번 더 실행시킨다고 해도 또 에러가 나면 그냥 프로그램이 죽어버리기 때문입니다.

위 코드를 실행시키면 다음과 같이 재시도하는 출력이 몇차례 보이고나서 원하는 차트가 그려집니다.

업빗과 crytocompare 두 거래소에서의 주요 코인들의 등락율을 비교하여 알수 있는 점은 사실 이미 다 직감적으로 알고있는 바와 같이 변동성이 더 큰 코인이 내릴때도 많이 내리고, 오를때도 많이 오르니 반등시점에서 갈아타거나 추가 매수를 하면 좋다 정도가 될 것 같습니다.

그리고, 위의 해석에 따라 스팀을 -60% 가격에서 주우신 분들께 이 자리를 빌어 축하드립니다. ^^

벌써 새벽 2시가 다 되어 가지만, 오랜만에 빡세게 공부해가면서 포스팅을 하니 보람되기도 하네요.

그럼 모두 좋은 밤 보내시고, 내일도 가즈아~ 하시기 바랍니다.


※ 파이썬을 이용한 투자 포스팅은 #kr-systemtrading에서 보실 수 있습니다.

Sort:  

강력 추천 드립니다! :D
업비트의 경우 request 헤더를 검사하여 빈 헤더일 때 말씀하신 것처럼 랜덤하게 response를 주지 않습니다.
그러므로 헤더를 적당히 채워서 보내면 정상적으로 동작합니다.
제가 사용하는 코드는 다음과 같습니다.

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
        async with ClientSession() as session:
            async with session.get(url, headers=headers) as response:

위 예시의 헤더는 구글 크롬의 헤더를 복붙한건데 별 문제없이 잘 되었습니다.

requests 라이브러리가 웹서버에 요청을 할때 헤더를 비우고 요청을 했던거군요. 전 서버에 접속한 사용자가 많아서 종종 못받아 오는 줄 알았네요. 감사합니다 ^^

그리고 타임시리즈 데이터 이용해서 비트코인 가격 예측을 해보려고 했던 2016년도 논문이 있습니다.
http://proceedings.mlr.press/v55/amjad16.html
저도 다 읽어보진 못한건데, 이걸 보면 ARIMA 모형은 썩 성능이 좋지 않았고, time seires 데이터에서 feature를 추출하고 이를 기계학습 하였을 때 수익을 기록할 수 있었습니다.
연구에 도움이 되길 바랍니다!

비트코인 가격이 로그를 씌워도 아래로 볼록할 만큼 우상향을 하고 있어서 계절성 등을 염두한 전통적인 예측 기법으로 정확도가 떨어진게 아닐까 생각이 듭니다. 구글 번역만으로는 내용을 정확히 이해하는데 한계가 좀 있지만 그래도 제가 포스팅하려는 방향에 맞는 자료를 알려주서 감사합니다.

코인만 보려고 들어오는 뉴비인데, 개발쪽에도 관련 글들이 많네요.
특히, pandas와 matplotlib에tensorflow만 더해지면 예측 가능한 모델을 만들 수 있으실 것 같아요.
제가 제일 처음 Convolutional Neural Networks로 소리인식할 때 사용했던 라이브러리 입니다.
댓글 쓰다가, 이전 댓글을 보니 예측 모델을 만드시는 것 같은데, numpy를 공부하셔서 pandas로 데이터를 읽어오신 후, 바로 numpy로 데이터형을 변경한 후 여러 가지 feature들을 append하셔서 원하시는 트레이닝 데이터를 만드신 후 tensorflow를 사용하여 딥러닝을 시키시면 될 것 같습니다. 시계열 모델은 RNN이 괜찮을 것 같습니다.

Coin Marketplace

STEEM 0.19
TRX 0.13
JST 0.029
BTC 57886.34
ETH 3104.72
USDT 1.00
SBD 2.54