xChar
·2 months ago

本文是币安交易所API使用的第二篇,主要介绍如何使用ccxt实例化交易所并获取历史K线数据,如果还没有注册币安的话,欢迎使用我的邀请链接注册😘 ,还可以获得交易手续费减免https://accounts.binance.com/register?ref=DPVSZVI3

1. ccxt

项目地址:https://github.com/ccxt/ccxt

ccxt是一个用于加密货币交易和电子商务的 JavaScript / Python / PHP / C# 库,支持许多比特币/以太坊等加密货币交易所的 API。

本教程使用python语言,使用使用pipconda安装

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的apiKeysecret,其它几个参数的意思分别是:

  • '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))

这里使用exchangefetch_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里面看到的数据就是这样的:

image

如果1000条不够用的话,可以使用循环以及since参数获取更前的数据,例如这里我们可以看到在5分钟级别数据上,相邻数据之间Timestamp相差300000,因此我们可以指定sinceBTC_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的值,就可以获取相应次数的数据。

Loading comments...