上期提到「勇武」、「和理非」分別比喻進攻型和防守型的投資策略,兩種組合中間找平衡點互相配合,結果是對比均等組合效率有提升。筆者曾建議讀者盡量只買「右派而且身材苗條」的股票,指的是預期回報為正數、且標準差較低的股票,組合效率一般很理想。接下來需解決的問題,在眾多右派而苗條的股票中怎樣選取最佳比重,以找出能達到「勇武」與「和理非」並重的均衡組合呢?
這種透過電腦程式找出優化參數的方法一般稱為optimization,在現今大數據年代,optimization算法多如恆河沙數,也與機器學習(machine learning)範疇高度相關。數學上定義,假如y=f(X1, X2, X3…Xn),我們使用某種算法去找出一組X組合,能把這數學函數輸出最大化(或最小化)的過程就是optimization。
應用在我們找出均衡組合算法,X是每隻股票比重,y是夏普比率,f可以是一個很複雜的數學函數;沒數學公式可直接計算它的最高點(或最低點),只好用電腦算法反覆測試,嘗試優化函數輸出,直至結果滿意為止。
找出夏普比率最高組合
這次我們由淺入深,只介紹最初級優化程式:隨機投資組合產生器(random portfolio generator)。原理是把一籃子股票分配一個隨機比重,當成投資組合,計算並記錄組合預期回報、標準差及夏普比率;經大量隨機試驗後,篩選出夏普最高的一組比重作投資建議。
我們設定了多項程式參數,組合最少持五隻股票,比重總和100%;股票入圍門檻為首20隻最高夏普比率股份,試驗次數10萬次。我們先從2010年1月1日至今的數據進行測試,隨機生成10萬次所找到的結果(見表一),是買領展(823)、申洲(2313)、舜宇(2382)及騰訊(700)。
程式選出的公司在筆者之前的文章也提及過,它們是夏普最高的一些恒指成份股,以它們去反覆測試並嘗試找出最佳投資組合,得出結果一般比買恒指表現更好。以此投資組合計算出的組合夏普比率約是113.3%,所得到的比單獨買入任何一隻恒指成份股更佳。
由於使用較短年期數據敏感性會提高,我們再嘗試用2016年1月開始的數據測試,發現程式建議買入的持股大致沒變化,主力持股仍是領展、舜宇和騰訊(見表二)。
首三大持股升逾一倍
不過,也換上近年強勢股碧桂園(2007),及換上自2016年以來受惠於油價築底,而股價大幅反彈的冷門股中海油(883),但中海油比重相對其他主力持股仍是相對地低得多。整體投資組合的夏普比率與之前變動不大,因此相信夏普比率是有效指標。
讀者可能會問,我們使用過去的歷史數據,怎保證未來恆之有效;因此我們也希望引入回歸測試(backtest)概念。
所謂回歸測試,意義在測試某種算法或交易規則能否在過去的歷史數據中獲理想預測效果,並以回歸測試結果作為評價有效性參考指標之一。
這次我們選用2013年初至2015年底數據輸入程式,讓它做出資產配置建議,然後將建議組合在2016年初開始跟進買入,並觀察選出來股票在之後時間是否跑出。
結果是系統建議買入的五隻個股(見表三),當中首三大持股也升逾一倍,僅一隻虧損,因此此簡單回歸測試評價是正面的。當然,真正回歸測試需做更多時期計算方能作準,需另外寫程式去做。
筆者對隨機生成組合這種方法還是不太滿意,說到底就是聽天由命,有運氣就撞中一個有效率的投資組合。因此我們可對有些明顯不值買入的股票做一個基本篩選,例如我們只買恒指成份股中夏普最高的20隻股票,其他一概不買,這樣也減少很多無謂計算,提升算法效率。
另外,不同時期的選擇對結果影響很大。在現實操作中,因為我們選擇時期的數據來決定投資組合預期回報率,因此時期的選擇不能太短也不能太長。假設我們選擇時期的股價平均回報率可準確反映未來該股票預期回報率表現,而這種假設必須建基於股票在指定時期內的基本因素沒重大改變,因此選擇時期必須首先問,這段時期內的基本因素有否重大改變。換句話說,使用數據年期長短也應當作算法需優化的一個參數去衡量。
現實不能只選50隻股票
投資組合優化實際運作上不可能只選50隻股票,想像一下有6,000隻美股和2,000隻港股選擇,每隻股票也有各自不同的比重,優化投資組合過程千變萬化。
隨機算法效率太低,在量化基金算法交易基本上不會用。下期預告,我們將介紹更聰明的算法去產生最佳投資組合,開始踏進機器學習甚至是深度學習範疇。
這裏附上數據實驗所使用的程式碼。此程式可自設參數,簡單使用說明可在終端機打'python random_optimizer.py-h',便可得知哪些參數可設定。如簡單測試,不輸入任何參數便能用預設值運行。
如想對特定時間點作回歸測試,則可以用'-s'和'-e'參數進行設定,例如想進行上文所述由2013年至2015年的回歸測試,可輸入'python random_optimizer.py -s 20130101 -e 20151231'。
另外,程式預設隨機生成次數為10萬次,也可透過設定'-N'參數增加測試次數,或可增加找到最佳組合可能性。
量子雪球
Github link:
https://bit.ly/2AMLFj9
作者電郵:
mailto:quantum.snowball@gmail.com