本文是币安交易所API使用的第二篇,主要介绍如何使用ccxt
库实例化交易所并获取历史K线数据,如果还没有注册币安的话,欢迎使用我的邀请链接注册😘 ,还可以获得交易手续费减免:https://accounts.binance.com/register?ref=DPVSZVI3
项目地址:https://github.com/ccxt/ccxt
ccxt是一个用于加密货币交易和电子商务的 JavaScript / Python / PHP / C# 库,支持许多比特币/以太坊等加密货币交易所的 API。
本教程使用python语言,使用使用pip
或conda
安装
pip install ccxt
# or
conda install ccxt
查看支持的交易所:
import ccxt
print(ccxt.exchanges) # print a list of all available exchange classes
(虽然ccxt
有文档,但是感觉写的太烂了,一开始用的时候看文档费了很大劲,所以才想写这一系列博客。)
exchange = ccxt.binance({
'apiKey': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'timeout': 30000,
'enableRateLimit': True,
'options': {'defaultType': 'future'}
})
exchange.load_markets()
这里实例化了一个ccxt.binance
类,用到了我们前面创建的API的apiKey
和secret
,其它几个参数的意思分别是:
'timeout'
是请求超时时间,单位是毫秒。如果在这段时间内请求未得到响应,那么将会抛出一个超时错误。'enableRateLimit'
是一个布尔值,如果设置为True,那么ccxt库将会尊重交易所的速率限制,避免发送过多的请求。'options'
是一个字典,用于设置一些额外的选项。在这里,'defaultType': 'future'
表示默认的交易类型是期货或者说合约,如果需要现货交易类型就把值设置为'spot'。exchange.load_markets()
这个方法,用于从Binance交易所加载所有可用的市场数据。这个方法通常在开始交易之前调用,以确保有最新的市场数据。
为了方便对数据进行处理,我们需要用到pandas
库,使用命令pip install pandas
安装,然后再import pandas as pd
引入这个库,之后就可以用pd
来调用里面的类和方法了。
BTC_df= pd.DataFrame(exchange.fetch_ohlcv(symbol='BTC/USDT', timeframe='5m', limit=1000))
这里使用exchange
的fetch_ohlcv()
方法来获取我们需要的K线数据,其中用到的参数有:
symbol
是str类型,是我们需要获取数据的标的符号,如BTC/USDT
标识比特币对USDT的价格。
timeframe
也是str类型,表示我们需要获取的K线的时间尺度,例如5分钟——5m
,一天——1d
(默认值为1m)。
limit
是int类型,表示获取数据的条数,上限似乎是1500还是1000,这个我没有测试,大家可以试试看。
除此之外还有:
since
:int类型,表示开始获取数据的timestamp。params
:字典,存放额外的参数,一般用不到。上面的示例代码就是获取比特币对USDT的最近1000条(没有since
参数默认就是最近的limit
条数据)5分钟级别K线数据。
得到的每一条数据依次包含以下条目:'Timestamp'(时间戳), 'Open'(开盘价), 'High'(最高价), 'Low'(最低价), 'Close'(收盘价), 'Vol'(交易量)。
为了方便对这些数据进行处理,我们使用pandas
设置一下列名:
BTC_df = pd.DataFrame(exchange.fetch_ohlcv('BTC/USDT', timeframe='5m', limit=1000))
BTC_df.columns = ['Timestamp', 'Open', 'High', 'Low', 'Close', 'Vol']
在Jupiter NoteBook里面看到的数据就是这样的:
如果1000条不够用的话,可以使用循环以及since
参数获取更前的数据,例如这里我们可以看到在5分钟级别数据上,相邻数据之间Timestamp相差300000,因此我们可以指定since
为BTC_df['Timestamp'][0]-1000*300000
来获取更早的1000条数据,并和后面的数据拼接起来,代码如下:
COUNT = 3 # 需要获取数据的次数
BTC_df = pd.DataFrame(exchange.fetch_ohlcv(symbol='BTC/USDT', timeframe='5m', limit=1000))
for i in range(COUNT - 1):
BTC_df = pd.concat([pd.DataFrame(exchange.fetch_ohlcv(symbol='BTC/USDT',
timeframe='5m',
since=COIN_df['Timestamp'][0]-1000*300000,
limit=1000)), BTC_df], ignore_index=True)
time.sleep(1)
BTC_df.columns = ['Timestamp', 'Open', 'High', 'Low', 'Close', 'Vol']
通过修改变量COUNT
的值,就可以获取相应次数的数据。