昨晚大餅二餅的這一波行情來得真是及時,好久沒有這麼順暢的趨勢了。

這次說說如何使用 B 安的逐筆歷史交易記錄。

B安官方已經把很多交易數據共享了出來。有 Github 頁面可以詳細查看有哪些類別的數據以及如何下載。我這裏主要介紹聚合交易記錄 aggTrades 的下載、整理和使用。

aggTrades 就是聚合之後的逐筆交易記錄,也就是幣安把連續的幾筆在同一時間、同一方向、同一價位成交的交易聚合成一筆記錄,類似 k 線的一根,但是隻有一個價格,沒有最高最低價之類。比如盤口掛了一筆大單,很多小訂單去喫它,那麼這些在很短時間內(毫秒級)同時到達的訂單,就會被聚合在一起。或者可能就是撮合引擎一次能夠撮合的訂單。

aggTrades 數據的好處就是可以有毫秒級別的交易記錄,但是又不像純逐筆 trades (就是最原始的數據,沒有按照同一價格聚合)記錄那樣大的數據量,是一個不錯的高頻數據折中方案。

一般就是準高頻策略使用這樣的聚合數據。那些真正的高頻一般都是用 trades 以及加上 orderbook 的數據,數據量非常大,處理起來也很不方便,如果用不上就沒有必要。不僅消耗資源,也增加編程的難度。

aggTrades 的用處可以是用來合成任意級別的短 k 線,例如 5、10、15 秒的短 k 線,這樣的 k 線用來做一些日內交易策略也還是有可能的。

譬如下面是之前貼過的 1 秒級別 k 線。

图片

還有高頻套利,現在普通套利已經很難賺錢了,非常卷,頻率高一點的話可能還有些許機會。

這種逐筆數據還可以用來合成另類的 k 線,例如等量 bar 之類的,用 aggTrades 比用分鐘 k 線合成出來要精確得多,這樣做出來的 CTA 策略可能和普通 k 線策略比較互補。後面幾篇我可能會寫如何合成這種 bar。

下面就是代碼介紹(大部分代碼見附件,因爲太多太長,就不在正文中貼了)。下載代碼是幣安的例子,不過稍微有一些改動,還有就是我的加工整理代碼。

這裏是以月度數據爲例(幣安也提供了日數據)。代碼都是單線程、同步執行,沒有搞異步、多線程之類。因爲這樣的下載都是一個月或者 n 天執行一次,稍微等等就行了,用不着搞得很複雜。

基本的回測用舊一點的數據一般沒有什麼問題,因爲高頻數據回測也就主要是起到一些分析作用,主要還是得看實盤,因爲滑點可能很大,或者掛單不成交,追單沒追到,交易所延遲等等。

不過後面我也有下載即時數據的代碼,就是下載當天的 aggTrades 數據,即時驗證錯過的行情。幣安的日數據都是滯後幾天纔有的。要急着用的話,就得自己用交易所 api 爬取了。

一 下載

第一部分代碼就是 agg.py 和 utility.py 兩個文件,然後使用

python3 agg.py -y 2022 -m 6 -t um -folder /你的指定路徑

這裏就是一個下載 2022 年 6 月份的所有永續合約 aggTrades 數據的命令例子。一般十來分鐘就可以下載完成。數據下載下來是壓縮過的,所以下一步就是解壓縮。

二 解壓

解壓就是使用 unzip.py 這個文件,非常短的代碼,就兩個函數,一個解壓月度數據,一個解壓日數據。

zip 文件解壓出來之後是 csv 文件。csv 文件的問題是比較佔硬盤,而且加載速度會比較慢。所以就是下一步,把 csv 文件轉換爲 pickle 文件。你可以根據自己的情況壓縮和不壓縮。如果你硬盤大,建議不用壓縮,一般永續數據一個月大概 50GB 左右,所以看自己情況。一般可以買一個速度快一點的外置 SSD 硬盤,現在 1TB 也就幾百塊,早就白菜價了,回測時加載也挺快。

三 壓縮轉爲 pickle

轉換的代碼就在 csv_to_pkl.py。如上所述,轉換之後更容易保存使用。

轉換之後我就是手動把 csv 文件刪除,不然佔硬盤。這一步就沒有代碼實現了。之前說了,都是很低頻的操作,不用完全自動化。我在例子代碼裏使用的是 gzip 2 級壓縮,一般一個月的數據壓縮後也就不到 10GB。

csv 不僅佔用空間,加載還慢。建議採用 pickle 格式。綜合來看,它的性能不錯,關鍵是兼容性好。如果你要用雲服務器,或者很多其他開源包,比 feather 之類更兼容。

好了,到這一步數據就算準備妥當了,可以開始研究策略了。

四 即時數據下載

之前提到,因爲幣安的數據服務器上的數據都是滯後一兩天的。如果你需要驗證你的策略在當前的行情下會怎麼樣,而又沒及時上某個幣的實盤,那麼可以通過下面代碼下載回溯到指定時間的 aggTrades。我一般就是用來下載當前 12 小時的數據,看看策略可能的表現會怎樣。

下面代碼使用的話,需要修改爲最近的開始時間。

图片

下載下來的數據是這樣。可以對照幣安的文檔,近期成交(歸集)看看他們的具體意義。

图片

有了這樣的原始數據,你可以使用 df.resample(bar_size).agg() 把它們聚合成你需要的任何級別 k 線,更隨心所欲。

最後

基本上這就是我之前用到的 aggTrades 數據的準備了。現在的策略是越來越卷,使用更細緻的數據可以開發更多類別的策略。策略之間互補纔是多策略的王道。

如果你需要以上代碼,可以聯繫領取。