本文是币安交易所 API 使用的第二篇,主要介绍如何使用ccxt
库实例化交易所并获取历史 K 线数据,如果还没有注册币安的话,欢迎使用我的邀请链接注册😘 ,还可以获得交易手续费减免:https://accounts.binance.com/register?ref=DPVSZVI3
1. ccxt#
项目地址: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
有文档,但是感觉写的太烂了,一开始用的时候看文档费了很大劲,所以才想写这一系列博客。)
2. 交易所实例初始化#
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 交易所加载所有可用的市场数据。这个方法通常在开始交易之前调用,以确保有最新的市场数据。
3. 获取 K 线数据#
为了方便对数据进行处理,我们需要用到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
的值,就可以获取相应次数的数据。