NokiMo
阿程量化交易
阿程量化交易

patreon


【2個你好大機會未聽過的回測致命傷】

【提提大家,進階Plan仲餘兩個位,要join就要快手 : )】

今次要show off下會員朋友訂閱後有咩好成績,點解? 因為而排我Facebook越黎越多財經KOL開posts係度派numbers俾佢地的followers,雖然咁多年我都睇慣晒而啲posts,但當自己開始左寫Patreon後,始終係有花時間係寫作上,見到佢地讚好&追蹤人數係我Patreon&FB專頁的10倍﹑20倍,心裡開始葡萄,因為班KOL講既野唔單止無用,仲有少少靠害feel,但又好多人鐘意睇。而個奇怪現象其實亦唔多唔少解釋到,點解醒的﹑肯努力做回測做量化然後穩定賺到錢的永遠係少數人,亦解釋埋點解市場Alpha永遠存在,因為天真的人永遠佔大多數。

回歸正題,而篇文講2個我係對對沖基金入面遇過的真實交易/研究問題:

1. 退化性解問題

2. 絕對值回測問題

第一個遇到的問題,就係當大家設計一個交易系統時,好容易唔覺意會引致一個回測問題,而個回測問題比 look ahead bias, data snooping bias, confirmation bias 更難發現,因為而個問題好有可能要到你真實做trade的時侯先會發現。

個問題就係,如果因為一啲次序問題而導致你的最終回測結果有幾個解法,同時而啲解法都唔係最好果個解法的話,咁就出現左「退化性解(Degeneracy)」問題了。聽落好難明,我仔細解釋。例如想搵聽日加或減邊啲股票倉位,但原來用python去loop而隻股票做回測個陣,將AAPL的closing price放係dataframe的第20個column,同對比放係第100個column (假設其他股票的closing price columns不變,就咁調左次序後,原來會導致回測出來的加咩減咩倉結果有唔同的話,咁就出現問題了,因為按理,理應結果係一樣的,調亂回測次序唔應該影響portfolio調整結果。

我用個例子去講解下:

如果大家做過multi-asset classes / multi-assets 交易,例如同一時間係幾百隻股票入面trade幾隻到幾十隻股票,應該會遇過一個問題,就係大家要比較排名,排得越高就越容易選入portfolio。咁如果我用最簡單的1個月內回報越高的股票,排名就排越高,然後每日就基於而個排名去選股 (雖然現實唔會咁做,輸交易成本),進行rebalancing,永遠拿住排名最高個5隻股票 (max倉位5隻),而且有個額外rule,就係加入黎的股票的1個月回報要高於portfolio入面果5隻中最高1個月回報個隻,咁你會點寫python?

好簡單,有朋友可能會用loop/iterative的方法去做回測。咁假設你有個dataframe去裝住啲stocks的closing price,而家回測到第10日個陣,你個倉已有5隻股票,然後去到要決定加唔加股票入黎的python process,你現在的情況:

假設你loop到個行,係決定2025年2月11日的股票倉位 (A是最近一個月最高回報,順序落到E為最低):

[A, B, C, D, E] ,然後回測時loop到一隻叫F的股票,F的一個月回報比手頭上股票都高,所以決定賣出E及買入F。咁因為係loop的原因,你會先加F入去組合然後踢走組合的E。如是者,繼續loop落去,去到G,G比F差,所以G不能加入portfolio了,之後所有loop到的唔同股票都比F差,都加唔到入黎portfolio,所以最後決定第二日只賣出E及買入F,投資組合變仍 [A,B,C,D,F]

好了,大家看到問題嗎? 可以諗諗再睇落去。

個問題就係,頭先我loop每隻潛在可以加入黎的股票,係基於咩字母行先係咪? 係現實中做回測時,邊隻股票的column header排係dataframe越前,咁既loop左而隻股票去比較先,好喇睇到個問題未? 我再用以下的一個新例子去反證:

假設你loop到個行,係決定2025年2月11日的股票倉位 (A是最近一個月最高回報,順序落到E為最低):

[A, B, C, D, E],然後回測時loop到一隻叫G的股票,G的一個月回報比手頭上股票都高,所以決定賣出E及買入G。咦我係咪漏左F? 無錯,特登的,但如果而刻你loop完G再loop到F(調亂次序)而隻股票,你會發現F的一個月回報其實按前一個例子黎講,佢係大過晒A,B,C,D,E,G,所以買入G賣出D,令個投資組合會變成[A,B,C,G,F] ,同之前的[A,B,C,D,F] 已經唔同左結果了。所以如果只有A,B,C,D,E,F,G 7隻潛在可選股票,去到而步已完,但投資組合的股票選擇結果完全不相同! 

其實要解決的方法好簡單,一點就明,就係起多一個variable去裝住每行開始果陣個投資組合係咩樣,然後loop緊一行入面唔同stock既時侯都只係同而個variable去比較,再update返舊果個投資組合variable就可以了。所以而個問題係貴在你真實做trade個陣先知,而唔係知道左之後寫唔出codes去解決佢。

另外,而個問題,如果一個KOL未做過回測,上網Chat下GPT,左抄右抄,係唔會理解同寫到的。

另一個問題就係絕對值回測問題,很多人做回測的時侯都忽略了精準仿真的問題。例如做期貨回測的時侯,比較傾向在Bloomberg 或 Reuters 拿個continuous futures就算,然後直接就回測計回報。但大家可以睇下下面兩幅一樣的恆指期貨(raw) 及 恆指期貨(ratio adjusted continuous)。

你會見到,你今日如果用raw的絕對值去做回測,例如恆指由15000開始起計,每升穿1000點就買入,否則向下便賣出,咁就算十年後你再用返Bloomberg 的恆指raw數據去做多一次回測,買入及賣出signals的出現日期都應該不變。

但用raw的問題是忽略了rolling的returns,所以一般人做回測都用ratio / difference adjusted的,如果唔太明的話可以睇返我最開頭寫的幾篇策略文。但問題來了,在2025年2月12日今日,我從Bloomberg抽取ratio adjusted 數據進行回測,對比我10年後的將來,係2035年2月12日再從Bloomberg抽取ratio adjusted 數據進行回測,如果我仍然是基於指數的絕對點數值去回測的話,非常有可能買入及賣出signals的出現日期都會全變,因為你10年後是基於當日的恆指期貨去ratio adjusted 之前的價格,所以你在將來回測的是將來的ratio adjusted 價,而非今日ratio adjusted出來的價,所以signals會走晒樣。

而兩個係唔少做左好多年quants都會犯的錯誤,希望可以俾到大家有個小啟發,睇下自己回測開的策略有無而兩個問題,慳返大家好多開始左實盤好耐先知原來自己一直做錯。至於點解我會知? 因為我以前都有交學費嘛。 : )

Cheers,

阿程

(量化研究 & 操盤心得)

【2個你好大機會未聽過的回測致命傷】

Comments

Yes if in vectorized backtest version

SY

for the first issue, is it better to sort the whole list of stocks and pick the top 5 instead of making an incremental change to the original list of stocks?

Peter Chan

例如z-score / pct change 就係算adjust ?

Samuel

想問下ratio adjust既意思係咩 同埋點樣先可以避免第二點個個問題

Samuel


Related Creators