갈루아의 반서재

여기서는 CCXT 를 이용하여 가상화폐 거래 데이터를 다운로드하는 코드를 작성해보자. 
CCXT에 대한 자세한 내용은 다음 링크에서 확인할 수 있다.

https://github.com/ccxt/ccxt

먼저 pip install ccxt 로 CCXT 라이브러리부터 설치한다. pandas 도 설치되어 있어야 한다.  

추후 활용예에서 보겠지만, 다운로드 툴은 한 줄의 명령문으로 작동하며, 다음 옵션을 특정해야 한다. 

  • 화폐쌍
  • 타임프레임
  • 거래소

시작일과 종료일에 대한 입력은 없다. 그리고 일단 데이터가 다운로드되면, 같은 폴더내에 CSV 파일 형태로 저장된다. 전체 코드는 다음과 같다.

import ccxt
from datetime import datetime, timedelta, timezone
import math
import argparse
import pandas as pd 
 
def parse_args():
    parser = argparse.ArgumentParser(description='CCXT Market Data Downloader')
 
 
    parser.add_argument('-s','--symbol',
                        type=str,
                        required=True,
                        help='The Symbol of the Instrument/Currency Pair To Download')
 
    parser.add_argument('-e','--exchange',
                        type=str,
                        required=True,
                        help='The exchange to download from')
 
    parser.add_argument('-t','--timeframe',
                        type=str,
                        default='1d',
                        choices=['1m', '5m','15m', '30m','1h', '2h', '3h', '4h', '6h', '12h', '1d', '1M', '1y'],
                        help='The timeframe to download')
 
 
    parser.add_argument('--debug',
                            action ='store_true',
                            help=('Print Sizer Debugs'))
 
    return parser.parse_args()
 
# Get our arguments
args = parse_args()
 
# Get our Exchange
try:
    exchange = getattr (ccxt, args.exchange) ()
except AttributeError:
    print('-'*36,' ERROR ','-'*35)
    print('Exchange "{}" not found. Please check the exchange is supported.'.format(args.exchange))
    print('-'*80)
    quit()
 
# Check if fetching of OHLC Data is supported
if exchange.has["fetchOHLCV"] != True:
    print('-'*36,' ERROR ','-'*35)
    print('{} does not support fetching OHLC data. Please use another exchange'.format(args.exchange))
    print('-'*80)
    quit()
 
# Check requested timeframe is available. If not return a helpful error.
if (not hasattr(exchange, 'timeframes')) or (args.timeframe not in exchange.timeframes):
    print('-'*36,' ERROR ','-'*35)
    print('The requested timeframe ({}) is not available from {}\n'.format(args.timeframe,args.exchange))
    print('Available timeframes are:')
    for key in exchange.timeframes.keys():
        print('  - ' + key)
    print('-'*80)
    quit()
 
# Check if the symbol is available on the Exchange
exchange.load_markets()
if args.symbol not in exchange.symbols:
    print('-'*36,' ERROR ','-'*35)
    print('The requested symbol ({}) is not available from {}\n'.format(args.symbol,args.exchange))
    print('Available symbols are:')
    for key in exchange.symbols:
        print('  - ' + key)
    print('-'*80)
    quit()
 
 
# Get data
data = exchange.fetch_ohlcv(args.symbol, args.timeframe)
header = ['Timestamp', 'Open', 'High', 'Low', 'Close', 'Volume']
df = pd.DataFrame(data, columns=header).set_index('Timestamp')
# Save it
symbol_out = args.symbol.replace("/","")
filename = '{}-{}-{}.csv'.format(args.exchange, symbol_out,args.timeframe)
df.to_csv(filename)

위의 코드에서 보듯이 대부분은 에러 체킹에 대해 다루고 있다. 그 이유는 모든 거래소가 OHLCV 데이터를 가져오는 것을 지원하는 것은 아니고, 모든 거래소가 똑같은 타임프레임과 화폐쌍을 가지는 것도 아니기 때문이다. 어떤 타임프레임과 화폐쌍이 지원되는지를 체크한 후 데이터를 다운로드 받게 된다. 그리고 만약 지원하지 않는 부분이 발견되면, 지원가능한 파라메터의 목록도 같이 보여준다. 그리고 getattr(ccxt, args.exchange) 의 getattr() 함수는 문자열을 이용하여 해당 객체의 속성을 가져오는 내장 함수이다.

그러면 실행에 앞서 위의 코드를 ccxt_market_data.py 으로 저장한다. 명령어 실행은 심볼, 거래소, 타임프레임만 지정해주면 된다. ccxt_market_data.py 파일이 저장된 위치에 binance-NEOETH-1d.csv 파일이 생성된다. 

$ python ccxt_market_data.py -s NEO/ETH -e binance -t 1d

해당 파일을 열어보면 다음과 같이 데이터가 저장되어 있음을 볼 수 있다.

Timestamp,Open,High,Low,Close,Volume
1518220800000,0.130552,0.134,0.12199,0.126144,136295.13
1518307200000,0.126143,0.131273,0.1203,0.125998,108290.84
1518393600000,0.125816,0.1349,0.125816,0.129178,109590.83
1518480000000,0.129101,0.1317,0.1285,0.128753,64004.47
1518566400000,0.128756,0.133,0.1285,0.13271,100776.7
1518652800000,0.13271,0.134427,0.129,0.130857,86239.4
1518739200000,0.130857,0.137899,0.128809,0.135739,79224.44
1518825600000,0.135739,0.144,0.135605,0.139173,99130.81
1518912000000,0.139158,0.140978,0.134388,0.137274,66472.97
1518998400000,0.137392,0.1458,0.135862,0.145201,72216.39
1519084800000,0.145204,0.1485,0.1397,0.141466,88728.51
1519171200000,0.141282,0.14287,0.137897,0.140498,85071.6
1519257600000,0.140886,0.1449,0.138,0.138986,77032.31
1519344000000,0.13901,0.14,0.13521,0.138844,65944.15
1519430400000,0.138846,0.143367,0.1368,0.13825,49462.02
1519516800000,0.13825,0.140963,0.137,0.138721,39985.58
1519603200000,0.138996,0.155782,0.13768,0.154899,157200.55

앞서 살펴보았듯이 코드의 상당 부분이 에러 체크에 사용되고 있는데, 주요한 에러는 다음과 같이 나타난다. 

1) 먼저 타임프레임이 지원되지 않는 경우 12시간 단위 데이터를 받고자 했지만, bittrex 에서 지원하는 타임프레임은 아래에서 보는 바와 같이 1분, 5분, 30분, 1시간, 1일이다. 

--------------------------------------------------------------------------------
(lindy) founder@casey:~/libra$ python ccxt_market_data.py -s NEO/ETH -e bittrex -t 12h
------------------------------------  ERROR  -----------------------------------
The requested timeframe (12h) is not available from bittrex

Available timeframes are:
  - 1m
  - 5m
  - 30m
  - 1h
  - 1d

2) 두 번째 예는 해당 심볼을 지원하지않는 경우이다. 

(lindy) founder@casey:~/libra$ python ccxt_market_data.py -s BTC/ETH -e binance -t 1d
------------------------------------  ERROR  -----------------------------------
The requested symbol (BTC/ETH) is not available from binance

Available symbols are:
  - ADA/BNB
  - ADA/BTC
  - ADA/ETH

3) 마지막은 해당 거래소가 OHLC 데이터를 지원하지 않는 경우다. 빗썸은 이를 지원하지 않고 있다.

(lindy) founder@casey:~/libra$ python ccxt_market_data.py -s XRP/KRW -e bithumb -t 1d
------------------------------------  ERROR  -----------------------------------
bithumb does not support fetching OHLC data. Please use another exchange
--------------------------------------------------------------------------------

 

원문출처 https://backtest-rookies.com/2018/03/08/download-cryptocurrency-data-with-ccxt/