做量化回測要當心!API 行情數據缺失會坑你的策略
展开
個人博客|實戰心得分享,聊一聊平時做策略回測踩過的數據坑,附 Python 實用代碼,適合喜歡自己寫策略、做回測的朋友參考。
不知道大伙做量化回測的時候,有沒有碰到過這種怪事:一套策略什麼都沒改,參數、邏輯維持原樣,重新跑一遍回測,結果卻大相徑庭。收益不一樣,買賣信號亂跑,最大回撤也跟之前完全對不上。一開始我總以為是自己代碼寫錯,反覆對指標、調參數,折騰很久才搞明白:問題不一定出在策略本身,而是我們從股票 API 抓回來的歷史行情,藏著很多不容易看出來的數據問題。
很多人以為拿到 K 線數據,就可以直接丟進回測裡跑。其實調接口拿數據僅僅只是開頭。時間、開高低收、成交量這些核心數據,如果不做檢查,直接拿來做回測很容易踩大坑。特別是分鐘線、Tick 高頻數據,只要某一個時間片段數據有問題,後面整套指標、買賣信號全部都會受影響。
數據異常,是怎麼把回測帶溝裡的
我們寫的量化策略,非常依賴連續不間斷的行情序列。就拿最常見的均線策略來說,靠一連串價格去計算滾動窗口。一旦中間有 K 線丟失,計算窗口就偏移了,該買不買、該賣不賣,回測跑出來的結果再好看,也沒有實際參考意義。平時對接各類行情 API,我歸納出四種最常見的數據毛病:
如果回測代碼沒有做相應處理,模擬出來的結果就會和真實盤面脫節,甚至跑出虛高的虛假收益,很容易讓我們誤以為策略很能賺。
跑回測之前,一定要做的數據檢查
我自己在搭回測流程的時候,慣把數據校驗放在策略運行前面,當做必做的預處理步驟。
首先重點看時間戳。拿分鐘 K 線來講,時間要跟市場真實交易時間對應。比如美股盤中正常情況下時間應該連續。如果發現時間突然跳動,就要分清兩種情況:是當時真的沒有成交,還是 API 那邊丟了數據,兩種情況處理方式不能混為一談。接著檢查價格跟成交量。開高低收、成交量幾乎是所有技術指標的基礎,只要其中一項出問題,算出來的指標就會失真。
用 Pandas 幾行代碼就可以快速做初步檢查,代碼大家可以直接拿去測自己的數據集:
import pandas as pddf = pd.read_csv( stock_history.csv )df[ timestamp ]= pd.to_datetime(df[ timestamp ])# 統計每一列空值數量print(df.isnull().sum())# 按時間先後排序df = df.sort_values( timestamp )
這段簡單代碼可以快速找出空值,同時修正時間亂序這類基礎問題。
不同週期數據,缺失不能一套方法亂用
日線數據如果少量缺數據,相對好處理,可以打上缺口標記,讓策略直接跳過這幾個交易日,儘量不要直接修改原始行情。
⚠️分鐘線、Tick 數據千萬要謹慎高頻回測對時間連續性要求很高,不要隨便亂填補缺失價格。人為補出來的數據會篡改真實市場走勢,回測看起來很漂亮,實盤一跑就完全兩回事。我的做法是盡量保留原始數據,新增標記欄位,記錄哪一部分數據經過清洗,後續排查問題也方便。如果要拿 Tick 逐筆數據,相比反覆輪詢接口,WebSocket 長連接更適合持續接收行情,能減少數據丟包。
下面是測試 AllTick API 拿 Tick 數據的示例代碼:
import websocketimport jsondef on_message(ws, message): data = json.loads(message) symbol = data.get( symbol ) price = data.get( price ) timestamp = data.get( timestamp ) print( alltick , symbol, price, timestamp)ws = websocket.WebSocketApp( wss://api.alltick.co/stock/websocket , on_message=on_message)ws.run_forever()
實戰提醒:僅僅接收行情還不夠,實際使用最好加上本地緩存、時間校驗,防止網路波動導致數據丟失。
實戰踩坑的幾個提醒,很多人容易忽略
看見空值別急著補全不同策略對數據要求不一樣。做高頻策略要優先保留原始數據;做中長線策略容忍度高一點,不要一套補全邏輯直接套所有場景。數據條數夠,不代表數據完整就算讀出來的行數足夠多,時間軸依舊可能有缺口。一定要結合交易日曆、交易時間一起判斷。補數據要尊重交易所規則各個市場開盤、休市、節假日規則不一樣,不要憑空造出根本不存在的 K 線出來。
寫在最後一套回測靠不靠譜,很大程度取決於前期的數據處理。就算用 AllTick API 這類行情來源,也僅僅只是拿原始數據的入口。數據到底能不能用來測策略,要看我們自己做的校驗、清洗和標記。很多做量化的朋友,把大部分精力都花在鑽研策略邏輯。實際跑下來才體會:好的數據基礎,比花裡胡哨的策略更重要。提前把行情缺口、異常處理好,就能避開很多隱藏的回測陷阱,後面優化策略的時候,也不容易被假結果誤導。
不知道大伙做量化回測的時候,有沒有碰到過這種怪事:一套策略什麼都沒改,參數、邏輯維持原樣,重新跑一遍回測,結果卻大相徑庭。收益不一樣,買賣信號亂跑,最大回撤也跟之前完全對不上。一開始我總以為是自己代碼寫錯,反覆對指標、調參數,折騰很久才搞明白:問題不一定出在策略本身,而是我們從股票 API 抓回來的歷史行情,藏著很多不容易看出來的數據問題。
很多人以為拿到 K 線數據,就可以直接丟進回測裡跑。其實調接口拿數據僅僅只是開頭。時間、開高低收、成交量這些核心數據,如果不做檢查,直接拿來做回測很容易踩大坑。特別是分鐘線、Tick 高頻數據,只要某一個時間片段數據有問題,後面整套指標、買賣信號全部都會受影響。
數據異常,是怎麼把回測帶溝裡的
我們寫的量化策略,非常依賴連續不間斷的行情序列。就拿最常見的均線策略來說,靠一連串價格去計算滾動窗口。一旦中間有 K 線丟失,計算窗口就偏移了,該買不買、該賣不賣,回測跑出來的結果再好看,也沒有實際參考意義。平時對接各類行情 API,我歸納出四種最常見的數據毛病:
| 異常類別產生原因時間軸斷開 | 接口返回漏數據,時間戳直接跳過一段 |
| 核心欄位空白 | 股價、成交量等關鍵數據返回空值 |
| 重複數據 | 接口推送重複的行情記錄 |
| 交易時間對不齊 | 不同市場開休市規則不同,造成時間錯位 |
跑回測之前,一定要做的數據檢查
我自己在搭回測流程的時候,慣把數據校驗放在策略運行前面,當做必做的預處理步驟。
首先重點看時間戳。拿分鐘 K 線來講,時間要跟市場真實交易時間對應。比如美股盤中正常情況下時間應該連續。如果發現時間突然跳動,就要分清兩種情況:是當時真的沒有成交,還是 API 那邊丟了數據,兩種情況處理方式不能混為一談。接著檢查價格跟成交量。開高低收、成交量幾乎是所有技術指標的基礎,只要其中一項出問題,算出來的指標就會失真。
用 Pandas 幾行代碼就可以快速做初步檢查,代碼大家可以直接拿去測自己的數據集:
import pandas as pddf = pd.read_csv( stock_history.csv )df[ timestamp ]= pd.to_datetime(df[ timestamp ])# 統計每一列空值數量print(df.isnull().sum())# 按時間先後排序df = df.sort_values( timestamp )
這段簡單代碼可以快速找出空值,同時修正時間亂序這類基礎問題。
不同週期數據,缺失不能一套方法亂用
日線數據如果少量缺數據,相對好處理,可以打上缺口標記,讓策略直接跳過這幾個交易日,儘量不要直接修改原始行情。
⚠️分鐘線、Tick 數據千萬要謹慎高頻回測對時間連續性要求很高,不要隨便亂填補缺失價格。人為補出來的數據會篡改真實市場走勢,回測看起來很漂亮,實盤一跑就完全兩回事。我的做法是盡量保留原始數據,新增標記欄位,記錄哪一部分數據經過清洗,後續排查問題也方便。如果要拿 Tick 逐筆數據,相比反覆輪詢接口,WebSocket 長連接更適合持續接收行情,能減少數據丟包。
下面是測試 AllTick API 拿 Tick 數據的示例代碼:
import websocketimport jsondef on_message(ws, message): data = json.loads(message) symbol = data.get( symbol ) price = data.get( price ) timestamp = data.get( timestamp ) print( alltick , symbol, price, timestamp)ws = websocket.WebSocketApp( wss://api.alltick.co/stock/websocket , on_message=on_message)ws.run_forever()
實戰提醒:僅僅接收行情還不夠,實際使用最好加上本地緩存、時間校驗,防止網路波動導致數據丟失。
實戰踩坑的幾個提醒,很多人容易忽略
看見空值別急著補全不同策略對數據要求不一樣。做高頻策略要優先保留原始數據;做中長線策略容忍度高一點,不要一套補全邏輯直接套所有場景。數據條數夠,不代表數據完整就算讀出來的行數足夠多,時間軸依舊可能有缺口。一定要結合交易日曆、交易時間一起判斷。補數據要尊重交易所規則各個市場開盤、休市、節假日規則不一樣,不要憑空造出根本不存在的 K 線出來。
寫在最後一套回測靠不靠譜,很大程度取決於前期的數據處理。就算用 AllTick API 這類行情來源,也僅僅只是拿原始數據的入口。數據到底能不能用來測策略,要看我們自己做的校驗、清洗和標記。很多做量化的朋友,把大部分精力都花在鑽研策略邏輯。實際跑下來才體會:好的數據基礎,比花裡胡哨的策略更重要。提前把行情缺口、異常處理好,就能避開很多隱藏的回測陷阱,後面優化策略的時候,也不容易被假結果誤導。
主题股票:
主题概念:
声明:遵守相关法律法规,所发内容承担法律责任,倡导理性交流,远离非法证券活动,共建和谐交流环境!
