banner
stmoonar

stmoonar

无心而为
github
telegram
email
zhihu
x

币安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 语言,使用使用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的值,就可以获取相应次数的数据。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。