CTA策略回測第一步!免費取得回測數據

本文來講一下永續合約的歷史資料如何取得,以及講取得所使用的平台、工具

延續上一篇文章,開始到了學習程式的季節.. ,哦是章節。

本文來講一下永續合約的歷史資料如何取得,以及講取得所使用的平台、工具。

首先,本文將透過「幣安」加密貨幣交易所來取得歷史的價格資訊,經歷FTX交易所的倒閉(這邊文章有稍微提到),所以只要牽扯虛擬貨幣都有交易所風險。幣安是目前最大的加密貨幣交易所,理論上來說是比較不容易喊倒就倒?(這大家自行評估)

接著就來提到一下,幣安主要有提供那些工具讓程式化使用者使用呢?

API項目

幣安為方便開發者進行交易和數據分析,提供了多種API接口,這是幣安的API說明文件。以下是幣安所提供的API項目:

  • Spot/Margin/Savings/Mining :現貨、槓桿、挖礦等
  • USDⓈ-M Futures :U本位
  • COIN-M Futures :幣本位
  • European Options :歐式期權
  • WebSocket API

本文將介紹U本位保證金交易(也就是永續合約)的商品歷史資料取得。

進去以後,就可以看到這樣的畫面,其中左邊可以看到有許多區分功能,大致上分為:

  1. 公開數據API:這種API接口提供了關於市場、交易對、K線圖等公開數據的查詢,可以用於市場研究和交易策略開發。
  2. 交易帳務API:這種API接口提供了帳戶信息查詢、訂單管理、交易執行等功能,可用於交易機器人開發和自動化交易。
  3. 公開數據、交易帳務串流:這種API接口提供了即時市場數據和訂單狀態的推送功能,可以即時更新交易數據和K線圖,是交易機器人和量化交易的重要組件。

API技術

以上就是幣安所提供的API種類,開發者可以根據自己的需求選擇適合的API,這就是幣安大概所提供的服務,以下我們就來講一下,這種資訊服務大概分為兩類,REST API 和 WebSocket,REST API 和 WebSocket 都是現代化 Web 技術中的重要工具:

REST API 是一種設計風格,用於定義基於 Web 的軟體系統之間的溝通方式。 REST API 基於 HTTP 協議,並使用 GET、POST、PUT、DELETE 等方法來定義資源的狀態和操作。 REST API 的主要優點包括易於使用、可靠性高、可擴展性強等。因此,REST API 現在已成為許多 Web 和APP的首選方式,例如在加密貨幣交易所中,REST API 常被用於查詢行情數據、下單等操作。

WebSocket 則是基於 TCP 的通訊協定,通常用於在 Web APP中實現雙向溝通。與 HTTP 協議不同的是,WebSocket 允許服務器主動推送資料給客戶端,實現了低延遲、高效能、即時性等優點。在加密貨幣交易中,WebSocket 經常被用於即時行情、帳務的推送。

REST API WebSocket 最大的差異在於,REST API 每次送出需求都是獨立的,而WebSocket 是建立連線以後進行溝通,兩者擁有本質上的不同。

如果以上都很陌生不太能理解,就不要強迫自己看了,因為理解不理解對於回測操作來說不太影響。下面示範操作。


上面主要是介紹幣安交易所提供的原始API,但我們會透過第三方套件,也就是別人已經開發好的套件取得即可。

取得歷史K線資料(程式碼)

這裡我們使用的是「python-binance」的第三方套件,不需要註冊API Key(也就是不用註冊帳號),也可以取得歷史K線,是一個很方便的工具,接下來看看吧。

首先要安裝 python-binance 套件,安裝指令為:

pip install python-binance

接著Python-binance裡面,有一個功能函數:「futures_historical_klines」,是專門用來取得幣安加密貨幣永續合約的歷史資料的,說明可以參考這裡,簡單的套件操作如下。

# 載入套件
from binance.client import Client
# 宣告幣安Class
client = Client("", "")
# 定義資料起始時間
start_str = datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S').strftime("%d %b %Y %H:%M:%S")
# 取得資料(定義商品、K線週期)
symbol = "ETHBUSD"
interval = Client.KLINE_INTERVAL_30MINUTE
tmp_data = client.futures_historical_klines(symbol, interval, start_str)
print(tmp_data)

## 輸出結果
[[1672531200000, '1195.25', '1195.86', '1193.23', '1195.86', '9129.407', 1672532999999, '10906632.86247', 3981, '4994.080', '5966585.90873', '0'], [1672533000000, '1195.86', '1195.86', '1191.94', '1193.32', '10064.831', 1672534799999, '12011819.43139', 5529, '4686.887', '5592177.27281', '0'], [1672534800000, '1193.31', '1195.00', '1193.20', '1194.85', '5023.850', 1672536599999, '5999954.26952', 2629, '3253.981', '3885909.72479', '0'], 

接著我們可以將該回傳的List物件,轉成Pandas 的DataFrame格式。

pd.DataFrame(tmp_data)

## 輸出結果
                 0        1        2   ...         9               10 11
0     1672531200000  1195.25  1195.86  ...   4994.080   5966585.90873  0
1     1672533000000  1195.86  1195.86  ...   4686.887   5592177.27281  0
2     1672534800000  1193.31  1195.00  ...   3253.981   3885909.72479  0
3     1672536600000  1194.85  1195.66  ...   1814.861   2168211.28710  0

以上是透過Python-binance 第三方套件執行介紹,這樣就可以取得歷史資料了,但每次取資料都要打這麼多字太累了。

接著我自己寫了一個函數「get_klines_df」,功能主要是取得資料並且入本地端檔案紀錄,並且每次執行時,都會將資料回補至最新的時間,最重要的是將binance取得的歷史資料轉換成DataFrame。

程式碼我放在github,連結,簡單執行下程式內容,取得Binance的永續合約歷史K線函數。

from historical_data import get_klines_df
from binance.client import Client

# main
if __name__ == '__main__':
    symbol = "ETHBUSD"        # 取得商品
    interval = Client.KLINE_INTERVAL_30MINUTE  # 取得30分鐘K線
    klines = get_klines_df(symbol, interval)
    klines


## 輸出結果
                         Open_time  ...  Ignore
datetime                            ...        
2021-06-16 03:30:00  1623814200000  ...       0
2021-06-16 04:00:00  1623816000000  ...       0
2021-06-16 04:30:00  1623817800000  ...       0
2021-06-16 05:00:00  1623819600000  ...       0
2021-06-16 05:30:00  1623821400000  ...       0

接著我們畫看看收盤價的折線圖吧。

klines['Close'].plot()
ETHBUSD的永續合約30分鐘走勢圖

這篇文章先講到這邊拉,至於要如何使用這樣的資料去做回測呢?之後會慢慢分享。有什麼問題,歡迎留言哦。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *