本文是幣安交易所 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
的值,就可以獲取相應次數的數據。