做量化投資會遇到的挑戰?

第一篇 Python 新手教學文章中,我們介紹為什麼要用 python 來做量化投資,在這篇文章,我們將介紹「做量化投資所會遇到的挑戰 」。量化投資並非交易的聖杯,而是還有很多需要突破的困難,在這個單元中我們會一一的來介紹,並且跟大家分享,在實務上和學術上的解決方案!

首先我們要先學會怎麼樣評量一個策略,才能設計低風險高報酬的交易規則,就算我們有這些很好的策略,這些策略也會有失效的時候,甚至是歷史績效很好,但上線後不佳的過擬合策略,究竟要怎麼避免呢?我們也會在這篇文章中,簡單的跟大家介紹,並且提供我們的解決方案!

評估策略績效

首先我們要怎麼樣評估策略呢?通常我們可以用Sharpe ratio 夏普指標來同時考量風險和獲利!Sharpe ratio 的計算公式如下:

首先 us 是策略的報酬率,而 uf 是我們將資產放在銀行中換取利息的無風險報酬,在現在低利率的環境中,通常我們會簡化成零,這兩個數字相減,就是超額報酬。

而分母 sigma s 是我們在使用策略的波動程度,所以你可以想像分子是超額報酬,超額報酬越大,Sharpe ratio 就越高。而分母則是風險,假如風險越大,則 Sharpe ratio 數值越低。

我們可以將超額報酬跟波動的程度用視覺化的方式來表示,上圖的橫軸是報酬率,橫軸上有 usuf ,代表我們的無風險報酬和超額報酬 

可以注意到 us 就是策略的報酬率,其實是一個分佈圖,代表策略的報酬,並不是穩定的,策略歷史績效,也是會忽高忽低。而這個分佈圖的寬和窄,就是影響我們獲利的最大因素。

我們通常會用標準差來表示,也就是這邊的 sigma s ,我們通常會希望 sigma s 越小越好,代表我們越有可能獲得超額報酬。對映到這邊的公式,分母越小, Sharpe ratio 就越大!所以整體來說,假如我們希望 Sharpe ratio 越大,我們就要讓超額報酬 us 越大,且波動程度 sigma s 越小越好。

假設我們現在算的是每日的 Sharpe ratio ,我們想要讓它變成每一年的 Sharpe ratio,要怎麼來換算呢?

Screen Shot 2020 09 27 at 12.10.24 PM

我們可以看到上圖中有兩個分佈,一個是每天的報酬率,另外一個是每一年的報酬率。而這兩個報酬率,我們用 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 等等。雖然背後有明確數學定義,但其能獲利的根本的原因卻是不明的。占星術和技術指標,其實是非常相似的,不是說不能用技術指標,只是在用的時候,我們要確保從統計的角度,有真的達到優化的效果,不然技術指標不就跟占星術沒什麼差別了 !

相關文章  python上櫃資料爬蟲輕鬆做

另外,還有一門學派,會使用人眼來交易,在台灣稱為「裸K」,也就是不用任何技術指標!但這樣的交易手法,其實也非常困難。例如下面兩個時間序列,你可以用人眼看出哪個是價格?而哪個又是亂數產生的序列嗎?

Screen Shot 2020 09 27 at 12.18.31 PM

電腦是可以輕易分辨的,但用人眼卻是非常的困難,這也是為什麼做交易,最好是用量化交易的原因!

另外你可能會想,量化交易好難學,為什麼我不直接複製別人的績效?其實現在也有很多類似的平台,例如 etoro 可以簡單的複製績效!然而你在複製績效時,可能會發現,為何績效看起來都很好,但是等到我開始跟單時,績效就變爛了呢?

這個原因是因為,通常跟單平台的排行榜,都有生存者偏差。某交易者可能在這禮拜因為表現很好,進了排行榜,但是下禮拜就被踢出!

另外,也有可能是某詐騙集團,開了很多個帳號,讓這些帳號用相反的手法交易,反覆留下勝利的帳號,就可以得到下圖中,這種高報酬的歷史報酬!

然而當募資結束後,可想而知,這樣的策略績效一定會一落千丈,反正他們已經抽到佣金,可能拔腿就跑了。這也是為什麼我們還是必須自己來研究量化交易的原因!

其實要做一個超強的歷史績效非常簡單,我們只要妥善的設定停損停利,就可以製造出勝率很高的假象!因為價格近似於隨機漫步,所以只要停利設定的很近,就更容易達成,只要停損設定很遠,就不容易達成。利用這個原理,大家都可以製作出高勝率策略!

Screen Shot 2020 09 27 at 12.20.24 PM

但是一次的虧損,可能就會吃掉所有的獲利!所以網路上有些連勝的策略,看看就好,不需要太過相信。

撇除了以上用技術手段來獲得好的成果,我們在做量化投資時,要如何來預防過擬合 ?最原始的方式,就是將歷史資料,分成 In-sample 和 Out-of-sample。 

Screen Shot 2020 09 27 at 12.21.59 PM

In-sample 簡稱 IS ,而 Out-of-sample 簡稱 OOS 。我們會用 In-sample 來進行策略研發,而 Out-of-sample 來做最後的驗證。假如我們反覆的使用 In-sample Out-of-sample 的方式來驗證,就會發現策略當我們使用 IS 研發策略時,調整策略回測越多次,就會造成 OOS 中失敗的比例,也逐漸升高,是成正比的關係!

也就是真正有效的策略,不能夠調整太多次,否則就會造成過擬合,使策略失效的機率就會大增!

那還有沒有什麼方法,可以避免過擬合策略呢?

避免研發失效策略

我們在這邊列舉出幾個簡單的方式,而在我們的線上課程中,我們也會提供大家更深入的學術工具,來預防過擬合喔! 

首先,假如我們有長時間的資料量做回測,代表策略經的起更多的考驗,做出來的策略,經過更多驗證,會更有效,比較不容易做出過擬合的策略!

但假如我們沒有更多的歷史資料怎麼辦呢?

我們可以將相似的資產歷史資料疊加在一起,讓策略在這樣的資料中進行回測,讓同一個策略用於多種不同的金融商品,可以預防過擬合。

Screen Shot 2020 09 27 at 12.27.58 PM

另外,我們也可以使用 bootstrap 的方式來驗證績效,是不是運氣好而產生的,我們會在線上課程中有更進一步的講解!

Screen Shot 2020 09 27 at 12.28.56 PM

第三種,就是將回測的次數做紀錄,盡量不要進行太多次回測!

Screen Shot 2020 09 27 at 12.29.43 PM

第四種,策略沒效果就是沒效果,不需要硬要調整!

假如策略的進出場訊號沒有效果,則不需要再增加濾網,添加過多的濾網,也是過擬合的原因之一。

第五種,就是我們線上課程中會教的統計方法,在之後的文章中,再慢慢跟各位分享囉! 

總結一下,這篇文章中,我們介紹了策略為什麼會失效,以及如何預防的辦法!看完這篇文章,希望能讓正在研究量化投資的大家,有初步的瞭解。之後的文章中,也會給大家一些量化投資應用在不只是股票市場,甚至是加密貨幣市場的範例,讓大家可以跟著我們一起研究 Python 量化投資!

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!

發表你的看法,與我們一同交流!