Python 低風險高報酬投資組合

投資可以很複雜,超多的商品選擇,分批持有買賣點設定等等,但是每天花這麼多心力,真的有比大盤好嗎?
其實投資也可以很簡單的,我們可以稍微更智慧一點,投資「大盤」跟「公債」!

big

今天就是要來介紹一個簡單的策略,
此策略的 sharpe ratio 高達 1.2 非常高,但其實原理並不難,也不需要太多的技巧
用一句話就講完了:

將資產分兩半:SPY 跟 20年公債

  • 一半投資「標準普爾500指數ETF」
  • 一半投資「iShares 20年期以上美國公債ETF〈TLT〉」

這種策略的大致上的原理就是「找兩個相關係數為負,且會隨時間增值的商品」
這樣的策略效果究竟如何呢?一半一半?這樣的比例真的好嗎?
我們可以用上一篇文章 ffn python package,來做回測看看效果如何

大家可以點這裡到程式碼,並且線上打扣!

安裝 ffn:

!pip install ffn

獲取資料

import ffn
prices = ffn.get("spy,tlt", )
prices.plot()
spytlt

仔細看這兩個指數確實有呈現一點負相關,特別是 SPY 下跌的時候,TLT會些微的上漲

將資產分一半,投資回測

這邊我們只拿「SPY」跟「TLT」,其實有很多的策略組合也會有「石油」、「新興市場」、「黃金」等等
大家到時候也可以去自行變化,找出比較好的投資組合

prices.rebase().mean(axis=1).plot()

雖然比直接投資sp500還要差,但是整體來說看起來更穩定的感覺
究竟我們有沒有辦法橫兩,這樣的組合是否是最好的呢?

不然我們就暴力計算一下,將幾種組合都寫出來:

策略配置1配置2配置3配置10配置11
SPY00.10.20.91.0
TLT1.00.90.80.10

那我們把這幾種配置都回測一次試試看:

import numpy as np
import pandas as pd

strategies = {}

for i in np.arange(0, 1.1, 0.1):
    title = "spy: %.1f | tlt: %.1f" % (i, 1-i)
    strategies[title] = (prices.rebase() * [i, 1-i]).mean(axis=1).rebase()

strategies = pd.DataFrame(strategies)

strategies.plot()
combination

可以發現TLT比重比較重,則報酬率比較低,
SPY比重比較重,則報酬率比較高
除了報酬率以外,我們還有哪些指標可以來量化這些策略的績效呢?

我們可以用 ffn 提供的 calc_stats 來計算:

stats = strategies.calc_stats()
stats = pd.DataFrame(
    {
        name:pd.Series({key:getattr(pf, key) for key in dir(pf) if isinstance(getattr(pf, key), float)}, name=name) 
        for name,pf in stats.items()
    }).transpose()

stats.head()
performance 2

這樣我們就有一張策略的績效總表了,這張 dataframe 非常大一張,要怎麼看有哪些分析數據呢?
我們可以利用 stats.columns 查看可以比較的策略績效指標:

stats.columns
plist

我們可以利用 .plot 將不同的績效比較給畫出來,例如:

stats['daily_sharpe'].plot(rot=10, color='blue')
stats['monthly_vol'].plot(rot=10, color='red', secondary_y=True)
volsp

上圖中有兩線,

  • 藍色的是 sharpe ratio,代表 「報酬」/ 「風險」 的比例
  • 紅色的是「每月報酬」的波動程度,

可以發現,風險報酬比(藍色)最佳位置,剛好就是在 「一半一半」的資產配置上
對應到「每月報酬」最穩定的,也剛好就是在「一半一半」的資產配置上

這說明了投資好像不用搞太多花俏的東西,直要簡單粗暴就是最好的!
上面的 sharpe ratio 是用簡單的「每天」的 sharpe ratio,

不過假如你是投資長線的話,其實不用太計較每天的 sharpe,應該要看的是每個月,甚至是每年的:

stats['yearly_sharpe'].plot()
stats['monthly_sharpe'].plot()
stats['daily_sharpe'].plot()
srs

假如我們不要「每天」跟報酬率計較,而改成是「每個月」或「每年」的時候,
由上圖中可以知道,SPY 比例從 0.5~0.7 都是不錯的配置方式
不過這 1.3 以上的 sharpe ratio 其實算是滿驚人的(不過沒算上金融海嘯,所以…稍微不準)
我平常可能大費周章,搞了半天也弄不出這麼好的資產配置XD

接下來看平均年報酬率:

stats['yearly_mean']
returns

還可以!你想想看完全不看盤得到5%以上的獲利,已經非常爽了!
老實說這樣的組合還有很多可以玩的地方,例如加入定期權益平衡,
也就是每個月去重新調整持股比例,漲多的賣,跌多的買,重新將權重調整回原點。
我們下次會來介紹進化版策略的回測,讓這個簡單的策略再進化
可以定期追蹤 FinLab 一起來研究投資這件事情吧!

FinLab - 韓承佑

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