免費行情 API 日線回測中,停牌數據斷層的標準化清洗實作與程式碼
前言
對於量化研究者與自製策略開發者而言,多數人會選用免費股票行情 API 取得日線歷史 K 線,降低資料採購成本,快速迭代驗證交易模型。但長期多輪回測驗證後會發現一個常見的資料瑕疵:個股停牌會讓價格時間序列產生空白斷層。
不少人為了簡化資料表,直接刪除缺失交易日的資料列,看似整理乾淨,實際上會造成均線計算、資產淨值曲線、進出場訊號判斷全數失真,短線波段、當日衍生策略的回測誤差會被大幅放大。本文結合實務回測開發經驗,拆解停牌資料缺口的形成機制、兩套適合不同場景的處理流程、可直接複製使用的 Python 前置處理程式,同時整理資料清洗階段容易忽略的關鍵限制,整套邏輯可直接嵌入自行建置的回測框架。
一、停牌為何會造成日線時間序列斷裂?
正常交易日,交易所會完整輸出開盤、最高、最低、收盤、成交量結構化行情;當個股進入停牌狀態,市場無任何撮合成交,免費行情 API 對於停牌區間的回傳格式主要分為三類:
表格
API 回傳格式資料呈現狀況完全省略停牌當日紀錄時間索引直接斷開,出現無資料空窗期保留日期索引,價格欄位空值交易日列存在,但所有價格、成交量數值為 NaN,部分介面會附帶停牌標記自動沿用前一交易日收盤價填補直接複製前一日收盤價覆蓋停牌所有日期
直接刪除空值列會產生明顯計算缺陷,以業界通用 20 期均線為例:程式只會統計 20 筆有效 K 線,而非連續 20 個營業日。長線持有低頻策略誤差相對輕微,但短線交易策略會發生訊號提前、延遲偏移,回測淨值曲線失去實盤參考價值。
二、兩套工程化停牌資料處理方案(依回測場景選用)
實務資料前置處理流程中,不建議直接移除停牌對應交易日,可依照模擬精準度需求選取對應邏輯,兩種方案各有適用範圍與限制:
方案一:完整保留時間軸,不填補價格序列
完全還原二級市場真實交易規則:停牌當日不存在可執行的有效成交價。
適用場景:高擬真實盤模擬系統、需嚴格區分可交易 / 不可交易日的合規回測模型。
缺點:均線、波動度、ATR 等依賴連續價格序列的技術指標會大量產生空值,需額外撰寫空值過濾、分段運算邏輯,提升前置處理開發成本。
方案二:收盤價向前填補+新增停牌狀態標籤(通用落地首選)
多數自製回測框架採用這套標準流程。停牌期間標的無價格波動,沿用前一日收盤價補齊時間軸,不會人為製造漲跌走勢,維持完整連續的時間序列。
核心重點:新增布林欄位is_suspended獨立標記停牌日期。填補後的連續價格可完整支援所有技術指標運算,同時策略執行層可讀取該欄位增加交易限制邏輯,過濾停牌期間新開倉指令,避開回測生成現實無法執行的虛擬交易。
三、通用 Python 前置處理完整程式
以下程式覆蓋行情撈取、營業日時間軸補齊、停牌標籤生成、收盤價向前填補完整流程,僅需替換介面網址、標的參數即可銜接自有資料來源:
import pandas as pd
import requests
# 替換為自身使用的行情API網址與請求參數
url = "你的行情API位址/kline"
params = {
"symbol": "AAPL",
"interval": "1day"
}
response = requests.get(url, params=params)
data = response.json()
# 轉換結構化表格,標準化日期索引
df = pd.DataFrame(data["data"])
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date")
# 補齊資料區間內所有營業日,填補停牌缺失日期
trade_days = pd.date_range(
start=df.index.min(),
end=df.index.max(),
freq="B"
)
df = df.reindex(trade_days)
# 建立停牌識別欄位:收盤價空值即判定當日停牌
df["is_suspended"] = df["close"].isna()
# 向前填補收盤價,維持價格序列連續性
df["close"] = df["close"].ffill()
# 輸出前5筆資料,檢驗前置處理結果
print(df.head())程式邏輯說明
這段前置處理程式的核心不只是填補空缺價格,而是完整留存停牌狀態的中繼資訊。回測執行階段可透過is_suspended欄位約束交易行為:允許持有停牌既有部位,但禁止停牌當日新建多空倉位。不同行情 API 欄位命名、JSON 回傳結構皆有差異,切換資料供應商時對照介面文件調整欄位對應關係即可。
四、前置處理三大易忽略限制,直接影響回測可信度
停牌缺口清洗僅是量化資料前置處理的其中一環,若未將以下三項規則納入處理流程,會大幅降低回測結果與實盤的擬合度:
除權息資料同步校正
若停牌區間內標的發放股利、股票分割、股本重組等權益變動,單純向前填補收盤價會破壞前後價格連續性,必須同步匯入除權係數,對完整時間序列行情統一校正。
遵循市場通用交易約束
美股、港股、台股、A 股市場共通規則:持有中的停牌標的可續留部位,但當日禁止新開倉。資料集缺少停牌標籤時,回測引擎會產生大量違反交易所規範的虛擬交易,系統性高估策略整體獲利。
依市場獨立設計前置處理邏輯
各市場停牌觸發條件、最長停牌時長、盤中交易限制差異顯著,不可使用同一套清洗程式套用全部商品,建議依交易市場拆分前置處理分支,提升模擬精準度。
五、標準化前置處理閉環流程(可封裝為框架通用運算子)
針對日線回測資料集,固定採用四步標準化作業流程,可包裝成獨立工具函數嵌入回測框架:
依原始行情產生區間完整營業日時間軸,不刪除任何停牌對應交易日;
依照模型模擬精準度需求,判斷是否執行收盤價向前填補;
永久儲存is_suspended停牌識別欄位,保留至最終輸出資料集;
搭配除權息係數二次校正完整行情,產出可直接投入模型回測的標準化資料。
這套流程同時兼顧技術指標連續運算需求與真實交易所交易規則,離線批量回測、線上模擬推演場景皆適用。
結語
免費行情 API 僅做為原始行情資料取得工具,回測結果是否可用於策略有效性判斷,關鍵在於完整、嚴謹的資料前置處理體系。停牌時間軸斷層、除權校正、營業日缺失等細節處理愈規範,回測淨值曲線與後續實盤運行表現的偏離程度就愈低。
策略研發階段可將本文完整前置處理邏輯封裝為通用運算子,減少重複開發工作量;市面上輕量級行情資料來源選項眾多,AllTick API 是兼顧穩定性與開發易度的備選方案。
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!