跳至主要內容

前視偏差 / Look-ahead Bias(含 Point-in-Time)

定義

前視偏差(Look-ahead Bias)是回測時用到「當下還拿不到」的資訊,讓歷史績效虛高、實盤卻複製不出來的系統性錯誤。 常見來源有兩種:一是財報還沒對齊申報日就被當成已知,季報通常在季底後一到兩個月才公告,季底當天直接拿來選股等於提前偷看;二是事後才被修正的數據被當成原始值使用。防範方法是使用以申報日對齊的 point-in-time 資料,讓每個交易日只看得到「那一天真正能取得」的版本;finlab 的財務資料預設即以申報日對齊,從源頭擋掉這個偏差。

公式與計算

前視偏差沒有公式,但「偷看了幾天」可以手算。台股月營收的法定公告期限是次月 10 日前(見 Python 量化交易教學),一般上市櫃公司的 Q1 季報截止日是 5 月 15 日(見台股財報發布日與截止日教學)。手算兩個例子:

  • 回測在 3 月 31 日季度一結束就用 Q1 財報選股:偷看 4 月整月 30 天加上 5 月的 15 天,30 + 15 = 45,等於提前 45 天使用還不存在的公開資訊。
  • 回測在 6 月 1 日就用 5 月營收:10 − 1 = 9,最多提前 9 天。

偷看的天數越長、市場對該資訊的反應越集中在公告日附近,回測虛高就越嚴重。

台股真實實例

  • EPS 與 ROE 選股實測:本站 2020 年第一版研究採「每 60 天固定換股」,換股日與財報公布日無關,可能用到尚未公告的財報;2026 年重寫時把它列為方法問題,修正為「在財報法定公告截止日換股」,並用 index_str_to_date() 確保公告前的數據不會被用到。
  • 對齊時點的另一面是「太晚」:月營收公告漂移實測發現,月營收公告日是每月 1 至 10 日,用 finlab 預設的月底再平衡等於慢了約 20 天才反應公告資訊,超額報酬已被消耗大半;修正為 resample_offset='14D',把換股日推到次月 14 日。
  • 回測是什麼把前視偏誤列為讓回測比實際樂觀的五大陷阱之一:財報與月營收必須用「公布日當天才可得」的資料進場,把財報期間一結束就當成資料已到手,回測等於開了天眼。

用 finlab 計算

finlab 的財報與月營收資料用季別或月份當索引,呼叫 index_str_to_date() 就會把索引換成法定公告期限,之後再進回測(finlab 會自動引導登入):

顯示程式碼
import finlab
from finlab import data, backtest
 
finlab.login()
 
close = data.get('price:收盤價')
 
# 月營收年增率:原始索引是月份,須對齊實際公告期限(次月 10 日)
rev_yoy = data.get('monthly_revenue:去年同月增減(%)')
rev_yoy = rev_yoy.index_str_to_date().reindex(close.index, method='ffill')
 
# 之後的每個交易日都只用「當天已公告」的營收選股
position = rev_yoy.is_largest(20)
report = backtest.sim(position, resample='ME', upload=False)

價量資料(收盤價、成交量)當天收盤即可得,天然沒有前視問題;需要對齊的是財報、月營收這類「事件期間結束」與「對外公告」之間有時間差的資料。

常見陷阱

  • **最常見來源:用了公告日前的財報。**把「財報期間結束」誤當「資料已可得」是前視偏差的第一大宗;Q4 年報甚至要到次年 3 月 31 日才截止公告,偷看空間長達三個月。財報類因子一律先過 index_str_to_date() 再進回測。
  • **好到不像話的績效,先懷疑前視。**年化高得離譜、回撤又淺的回測,多數問題出在前視偏差或沒扣成本;先逐一檢查每個訊號在當下是否真的拿得到,再談策略優化。完整的自我檢查習慣見回測是什麼

相關詞條與延伸閱讀

相關詞條:回測Alpha周轉率滑價

本頁僅供教學與研究參考,不構成投資建議。