這篇會拿Finlab上的策略與機器學習預測線圖的因子進行結合。由於模型是透過2007-2011年的線圖作為訓練資料,回測的時候會從2012年開始以示公平。
還沒看過前面兩篇的可以點下面連結,會比較看得懂接下來的內容。
第一篇: 什麼?!AI也看得懂k線圖?利用機器學習來判斷股票漲跌。(1)論文解析
第二篇: 什麼?!AI也看得懂k線圖?利用機器學習來判斷股票漲跌。(2)台股實測
回測區間: 2012年~2023年
回測日期: 2023/12/25
使用模型: I5/R5,有就是拿五日線圖預測五日後漲跌。總共依照四種線圖(參考下圖)對應的四種模型進行回測。
為了方便表示,由左到右的線圖對應到的模型分別為I5/R5、I5/R5-m、I5/R5-v、I5/R5-mv。
要讓模型預測2012~2023年的所有資料需要耗費很大的計算量及時間,所以這裡會把預測好的結果存在dataframe裡並存成.csv檔以便之後利用。之後就只需要更新最近一天的資料並存回.csv檔即可。
導入方法如下圖所示。
# 從csv檔案讀取
file_path = "cnn_5_5.csv"
cnn_factor_df = pd.read_csv(file_path, index_col="date")
# 轉換成FinlabDataFrame
finlab_cnn_factor = FinlabDataFrame(cnn_factor_df)
# 設定columns及index
finlab_cnn_factor.columns = finlab_cnn_factor.columns.remane("symbol")
finlab_cnn_factor.index = pd.to_datetime(finlab_cnn_factor)
使用方法就和一般Finlab的資料相同,假設我想要"大於0.5"的條件,則可以這樣寫:
# 模型預測因子>0.5
cond1 = finlab_cnn_factor > 0.5
接下來會從Finlab平台上選三個策略進行優化,這三個策略都是以週為單位進行轉倉的策略,剛好與模型預測五日漲跌相符合。實驗結果會將原始策略以及四個模型的報酬率、Sharpe Ratio、MDD、勝率進行比較。
這篇文章不會包含完整程式碼,因為有些是Finlab的VIP策略,故無法公開。
修改方式: 將原先的rank乘上finlab_cnn_factor後進行排序,其餘程式碼都不變。
結果如下:
可以看到除了I5/R5這個模型的表現比原始策略差之外,其他模型都表現得不錯。不管是在報酬、sharpe ratio、還是MDD上都較原始策略更優。
I5/R5-m這個模型甚至多了8.41%的年化報酬,且同時sharpe ratio更高MDD也更低。也可以發現,四個模型的結果都成功優化MDD,使MDD較原始策略提升3~8%不等。
這個策略本身沒有限制持有檔數,所以我使用買進10及20檔做實驗,並且使用模型預測因子作為排序選擇前10/20檔作為買進標的。實驗結果如下。
買進前10檔的情況下,所有的模型都表現得比原始策略來的更好。
最好的模型是I5/R5-v,年化報酬提升了11%左右,同時Sharpe Ratio也提升了不少,不過MDD卻都變大了許多。
買進前20檔的情況下,除了I5/R5這個模型以外,其他的模型都表現得比原始策略來的好。這裡雖然報酬提升較少,但MDD整體都較原始策略下降且勝率、sharpe ratio提升。
原始策略一樣沒有限定檔數,這裡設定買進前20檔,並使用模型預測因子進行排序。
實驗結果如下。
從結果可以看到,使用模型預測的因子進行排序不管在報酬、Sharpe、MDD還是勝率上都有所提升。
而不同模型也有不同的優勢,例如I5/R5-v年化報酬最高,但MDD最大。I5/R5報酬相對較低,但MDD反而較小。I5/R5-m則是較I5/R5-v犧牲了一點報酬,但換來更高的sharpe ratio、更低的MDD以及更高的勝率。
上面實測了一些策略都有很不錯的效果,然而這個因子不是萬能的,實測下來有時候不但沒有提升策略結果反而還讓策略表現的更差了。
整體來說,這個因子還是十分有淺力的,這次也只實測了I5/R5系列的模型。依據論文實驗所述,不同模型學習到的結果是不一樣的,I20/R20學習到的可能會比較適合月轉倉的策略,I60/R60學到的可能會很適合季轉倉的策略。有興趣的可以自行去實驗看看~。
如果對這篇的實驗有興趣,贊助500以上可以找我拿這四個csv檔(不包含模型及日後的資料)。