在第一篇 Python 新手教學文章中,我們介紹為什麼要用 python 來做量化投資,在這篇文章,我們將介紹「做量化投資所會遇到的挑戰 」。量化投資並非交易的聖杯,而是還有很多需要突破的困難,在這個單元中我們會一一的來介紹,並且跟大家分享,在實務上和學術上的解決方案!
首先我們要先學會怎麼樣評量一個策略,才能設計低風險高報酬的交易規則,就算我們有這些很好的策略,這些策略也會有失效的時候,甚至是歷史績效很好,但上線後不佳的過擬合策略,究竟要怎麼避免呢?我們也會在這篇文章中,簡單的跟大家介紹,並且提供我們的解決方案!
評估策略績效
首先我們要怎麼樣評估策略呢?通常我們可以用Sharpe ratio 夏普指標來同時考量風險和獲利!Sharpe ratio 的計算公式如下:
首先 us 是策略的報酬率,而 uf 是我們將資產放在銀行中換取利息的無風險報酬,在現在低利率的環境中,通常我們會簡化成零,這兩個數字相減,就是超額報酬。
而分母 sigma s 是我們在使用策略的波動程度,所以你可以想像分子是超額報酬,超額報酬越大,Sharpe ratio 就越高。而分母則是風險,假如風險越大,則 Sharpe ratio 數值越低。
我們可以將超額報酬跟波動的程度用視覺化的方式來表示,上圖的橫軸是報酬率,橫軸上有 us 和 uf ,代表我們的無風險報酬和超額報酬
可以注意到 us 就是策略的報酬率,其實是一個分佈圖,代表策略的報酬,並不是穩定的,策略歷史績效,也是會忽高忽低。而這個分佈圖的寬和窄,就是影響我們獲利的最大因素。
我們通常會用標準差來表示,也就是這邊的 sigma s ,我們通常會希望 sigma s 越小越好,代表我們越有可能獲得超額報酬。對映到這邊的公式,分母越小, Sharpe ratio 就越大!所以整體來說,假如我們希望 Sharpe ratio 越大,我們就要讓超額報酬 us 越大,且波動程度 sigma s 越小越好。
假設我們現在算的是每日的 Sharpe ratio ,我們想要讓它變成每一年的 Sharpe ratio,要怎麼來換算呢?
我們可以看到上圖中有兩個分佈,一個是每天的報酬率,另外一個是每一年的報酬率。而這兩個報酬率,我們用 SRd 代表每日的 Sharpe ratio,而 SRa 代表年化的 Sharpe ratio 。而這兩個數值,其實是有關聯的,我們可以再額外乘上一個數值來校正,還記得我們剛剛介紹 Sharpe ratio 的分子是超額報酬,分母是波動,我們先來看超額報酬的部分。
每天的超額報酬跟每年的超額報酬,其實就是乘以一年有幾個交易日來當做估計。例如我們每天賺 1 塊錢,那 365 天,就賺了365塊錢!同樣的對於分母,也就是波動程度,我們也要進行類似的估計,由於標準差的累積,跟天數並不是成正比,而是跟天數的開根號成正比,所以分母的部分,就以根號 d 來校正。
所以通常我們就會看到 在 Sharpe ratio 的計算中,要多乘一個開根號的常數的原因,通常這個常數 會是根號 252,因為一年的交易日只有252天。
但是對於加密貨幣來說,要乘以360,因為加密貨幣每分每秒都有可以交易。有了 Sharpe ratio 來當作策略衡量的標準,是不是只要做出高 Sharpe ratio 的策略,就能幫我們賺很多錢呢?
失效的策略
假如我們做出的策略沒有根據的話,就算做出高 Sharpe ratio 的策略,也有很高的機率是過擬合策略。在1880年代,科學家提倡使用占星術預測未來是很流行的,但到了現代科學,尤其是做交易,我們還是發明了很多,類似占星術的工具,像是震盪指標、Fibonacci序列、黃金比例、elliot wave 等等。雖然背後有明確數學定義,但其能獲利的根本的原因卻是不明的。占星術和技術指標,其實是非常相似的,不是說不能用技術指標,只是在用的時候,我們要確保從統計的角度,有真的達到優化的效果,不然技術指標不就跟占星術沒什麼差別了 !
另外,還有一門學派,會使用人眼來交易,在台灣稱為「裸K」,也就是不用任何技術指標!但這樣的交易手法,其實也非常困難。例如下面兩個時間序列,你可以用人眼看出哪個是價格?而哪個又是亂數產生的序列嗎?
電腦是可以輕易分辨的,但用人眼卻是非常的困難,這也是為什麼做交易,最好是用量化交易的原因!
另外你可能會想,量化交易好難學,為什麼我不直接複製別人的績效?其實現在也有很多類似的平台,例如 etoro 可以簡單的複製績效!然而你在複製績效時,可能會發現,為何績效看起來都很好,但是等到我開始跟單時,績效就變爛了呢?
這個原因是因為,通常跟單平台的排行榜,都有生存者偏差。某交易者可能在這禮拜因為表現很好,進了排行榜,但是下禮拜就被踢出!
另外,也有可能是某詐騙集團,開了很多個帳號,讓這些帳號用相反的手法交易,反覆留下勝利的帳號,就可以得到下圖中,這種高報酬的歷史報酬!
然而當募資結束後,可想而知,這樣的策略績效一定會一落千丈,反正他們已經抽到佣金,可能拔腿就跑了。這也是為什麼我們還是必須自己來研究量化交易的原因!
其實要做一個超強的歷史績效非常簡單,我們只要妥善的設定停損停利,就可以製造出勝率很高的假象!因為價格近似於隨機漫步,所以只要停利設定的很近,就更容易達成,只要停損設定很遠,就不容易達成。利用這個原理,大家都可以製作出高勝率策略!
但是一次的虧損,可能就會吃掉所有的獲利!所以網路上有些連勝的策略,看看就好,不需要太過相信。
撇除了以上用技術手段來獲得好的成果,我們在做量化投資時,要如何來預防過擬合 ?最原始的方式,就是將歷史資料,分成 In-sample 和 Out-of-sample。
In-sample 簡稱 IS ,而 Out-of-sample 簡稱 OOS 。我們會用 In-sample 來進行策略研發,而 Out-of-sample 來做最後的驗證。假如我們反覆的使用 In-sample Out-of-sample 的方式來驗證,就會發現策略當我們使用 IS 研發策略時,調整策略回測越多次,就會造成 OOS 中失敗的比例,也逐漸升高,是成正比的關係!
也就是真正有效的策略,不能夠調整太多次,否則就會造成過擬合,使策略失效的機率就會大增!
那還有沒有什麼方法,可以避免過擬合策略呢?
避免研發失效策略
我們在這邊列舉出幾個簡單的方式,而在我們的線上課程中,我們也會提供大家更深入的學術工具,來預防過擬合喔!
首先,假如我們有長時間的資料量做回測,代表策略經的起更多的考驗,做出來的策略,經過更多驗證,會更有效,比較不容易做出過擬合的策略!
但假如我們沒有更多的歷史資料怎麼辦呢?
我們可以將相似的資產歷史資料疊加在一起,讓策略在這樣的資料中進行回測,讓同一個策略用於多種不同的金融商品,可以預防過擬合。
另外,我們也可以使用 bootstrap 的方式來驗證績效,是不是運氣好而產生的,我們會在線上課程中有更進一步的講解!
第三種,就是將回測的次數做紀錄,盡量不要進行太多次回測!
第四種,策略沒效果就是沒效果,不需要硬要調整!
假如策略的進出場訊號沒有效果,則不需要再增加濾網,添加過多的濾網,也是過擬合的原因之一。
第五種,就是我們線上課程中會教的統計方法,在之後的文章中,再慢慢跟各位分享囉!
總結一下,這篇文章中,我們介紹了策略為什麼會失效,以及如何預防的辦法!看完這篇文章,希望能讓正在研究量化投資的大家,有初步的瞭解。之後的文章中,也會給大家一些量化投資應用在不只是股票市場,甚至是加密貨幣市場的範例,讓大家可以跟著我們一起研究 Python 量化投資!