币安Binance API使用（二、交易所实例及数据获取）

本文是币安交易所 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安装

Copy
pip install ccxt
# or
conda install ccxt

查看支持的交易所：

Copy
import ccxt
print(ccxt.exchanges) # print a list of all available exchange classes

（虽然ccxt有文档，但是感觉写的太烂了，一开始用的时候看文档费了很大劲，所以才想写这一系列博客。）

2. 交易所实例初始化

Copy
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来调用里面的类和方法了。

Copy
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设置一下列名：

Copy
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 条数据，并和后面的数据拼接起来，代码如下：

Copy
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的值，就可以获取相应次数的数据。