跳至主要內容
FinLab

Python 低風險高報酬投資組合:SPY 加 TLT 公債資產配置回測

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

SPY 與 TLT 低風險投資組合走勢圖

今天就是要來介紹一個簡單的策略, 此策略的 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()

SPY 與 TLT 價格走勢圖

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

將資產分一半,投資回測

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

顯示程式碼
prices.rebase().mean(axis=1).plot()

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

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

策略 配置1 配置2 配置3 配置10 配置11
SPY 0 0.1 0.2 0.9 1.0
TLT 1.0 0.9 0.8 0.1 0

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

顯示程式碼
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()

不同 SPY 與 TLT 配置比例的回測組合走勢圖

可以發現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()

ffn calc_stats 計算出的各策略績效總表

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

顯示程式碼
stats.columns

stats.columns 列出可比較的績效指標清單

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

顯示程式碼
stats['daily_sharpe'].plot(rot=10, color='blue')
stats['monthly_vol'].plot(rot=10, color='red', secondary_y=True)

每日 sharpe ratio 與每月報酬波動度比較圖

上圖中有兩線,

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

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

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

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

顯示程式碼
stats['yearly_sharpe'].plot()
stats['monthly_sharpe'].plot()
stats['daily_sharpe'].plot()

每日、每月、每年 sharpe ratio 比較圖

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

接下來看平均年報酬率:

顯示程式碼
stats['yearly_mean']

各 SPY 與 TLT 配置比例的平均年報酬率

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

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始