機器人理財 — 投資組合資產相關性與效率前緣分析

Vincent Ko
13 min readMay 8, 2024

--

請利用過去8年的歷史價格資料,計算下列資產(ETF)日報酬率的相關係數

EWT IYR VNQ VNQI AOA AOR AOM SPY IEFA VEA IXUS ACWI VT IEMG VWO CWB SCHO SHY IEF TLT STIP TIP FLOT BND BNDX GLD MBB EMB LQD AGG JNK PFF TQQQ UPRO

• 利用上述資料挑選出4–7個ETF作為資產池並分析其所形成的效率前緣(efficient frontier),請討論分析隨著資產個數的增加,效率前緣改善的情形。(2024/4/17交)

• 資料期間: 所有ETF都有資料的最早日期 to 2024/3/22

• ETF的歷史價格資料可從yahoo finance下載,請採用Adj Close價格。

我選用的標的如下,我盡量尋找各種不同範疇的資產,並研究相關係數以及效率前緣相關的事項。

1. SPDR S&P 500 ETF Trust (SPY) 整體ETF市場

2. Vanguard Real Estate Index Fund ETF Shares (VNQ) 全球房地產市場

3. ProShares UltraPro QQQ (TQQQ) 三倍做多那斯達克市場

4. Vanguard Total International Bond Index Fund (BNDX) 美國以外債券

5. iShares Preferred and Income Securities ETF (PFF) 特別股跟收益證券

6. SPDR Bloomberg High Yield Bond ETF (JNK) 垃圾債券

7. iShares MSCI Taiwan ETF (EWT) 台灣股票

首先是所有股票的整體價格判斷,這裡並沒有進行特別的換算,就是按照他的收盤價進行排列,可以看到EWT台灣股票個初始價格比較高,而相對應的漲跌也比較劇烈,最後報酬率約為150%。其他的部分只有TQQQ看起來有比較大的漲跌。如圖(一)

但是在圖二中可以看到,實際上的漲跌幅度以及實際回報中,可以看到TQQQ的變化幅度相當劇烈,甚至最高可以到18倍,而其他的部分則無法看到明顯差異(因為TQQQ太高了)

圖三我們扣掉TQQQ帶來的資訊,可以看到SPY和EWT的趨勢很類似,代表美國和台灣市場可能具有高度關係,而其他的四項,包含不動產、債券和垃圾債券等,上升幅度和坡動都很低,只有VNQ比較活躍一點。

圖(四)是以天為單位的漲幅,也可以觀察到通常一天之內最大的漲跌幅度是TQQQ,其次是SPY和EWT,也和我們觀察到的股市波動大於債券波動相似。

圖(五)可以看出這四種資產的相關係數,可以觀察到EWT和SPY兩種不同地區的ETF的相關係數最高,來到了0.97,而股票ETF和債券ETF的相關係數最低,只有0.5。

圖六是七種資產的matrix,可以看到這些資產的相關係數都在0.5~0.97之間,其實相關性還蠻高的,其中值得注意得像是SPY和TQQQ的相關性也高達0.93,雖然一個槓桿加了三倍,但是在相關係數的視角來說,兩者的漲跌趨勢是相同的,同時也有一些特別的關聯資產,如債券bndx和台灣股票ewt、bndx和tqqq等等。

圖(六):七種資產的相干係數,或許我應該選擇相關係數更低的資產來分散化我的投資組合。

接者,我們先嘗試透過Random portfolio generation,透過隨機過程來建構不同的portfolio,然後找出最好的資產組合。使得權重總和為 1。「portfolio_annualized_performance」 函數會計算return和波動性(variance),為了將其作為年化計算,我們使用252來當作一年的交易天數。 「random_portfolios」函數將產生分配給每隻股票的隨機權重的投資組合,我在這裡隨機模擬了25000筆不同的投資組合,並且嘗試找到efficient frontier。如圖(七)

圖(七):25000筆資產的其中幾筆,總和都是1

圖(八):每筆資產的標準差、平均報酬、夏普比率

returns = table.pct_change() 計算整個table的變化 計算報酬

mean_returns = returns.mean() 計算每筆資產的平均報酬

cov_matrix = returns.cov() 計算這些資產的相關係數

num_portfolios = 25000 總共模擬25000筆

risk_free_rate = 0.0178 假設一個risk-free rate

接者,我們可以透過display_simulated_ef_with_random來算出這些資產的狀況,例如找到最大夏普值坐落在哪個模擬出來的點,算出夏普值、平均數和標準差等等,主要是「最大夏普值」和「最小標準差」相對應的投資組合長甚麼樣子,並且常是在這些資產資料中找到最適合的點。表一是相對應的指標。油表可以看到,追求最高夏普比率的話,大致上是SPY2/3、EWT 1/3的組合,而最小的波動組合來說,會多購買債券為主的ETF BNDX,而購買一些整體市場ETF作為互補。圖九是這些投資組合的報酬與風險,並標註出maximum sharpe ratio還有minimum volatility

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Maximum Sharpe Ratio Portfolio Allocation

Annualised Return: 0.1519

Annualised Volatility: 0.1758

SPY BNDX VNQ EWT

allocation 62.5934 0.4901 0.0229 36.8936

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Minimum Volatility Portfolio Allocation

Annualised Return: 0.021

Annualised Volatility: 0.0414

SPY BNDX VNQ EWT

allocation 0.4865 97.5082 0.3699 1.6354

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

對於風險最小的投資組合,九成以上的預算分配給了BNDX。 觀察之前的每日回報圖,可以看到BNDX是四種股票中波動性最小的股票,因此將很大比例分配給BNDX以實現最小風險投資組合是直觀的。

如果我們願意承擔更高的風險以獲得更高的回報,那麼能夠為我們提供最佳風險調整回報的投資就是夏普比率最大的投資,包含EWT和SPY的組合。這些股票的波動性相當大。而BNDX在最小創投組合的情況下擁有超過90%的預算,但分配給它的預算卻不足1%。

因此,為了找到可以在給定風險水平下獲得最大預期報酬的投資組合,繪製有效前緣曲線,我使用了夏普比率作為優化目標函數。

在SciPy的優化函數中,它要求傳入一個需要最小化的函數,因此我定義了一個neg_sharpe_ratio函數,其實際上是對夏普比率取負值。這樣一來,最小化neg_sharpe_ratio實際上就等同於最大化夏普比率,為了在權重總和為1的時候(同時每個資產的權重都在0到1之間),找到最大夏普值和最小標準差。 我也設定了一個函數「efficient_return」正在計算給定目標回報的最有效投資組合,第二個函數「efficient_frontier」將採用一系列目標回報併計算每個回報水平的有效投資組合。藉此,我們可以看到在用solver的情況下,找到的最優組合大致上和我們用亂數產生器所找到的投資組合類似,在sharpe ratio最大化的情況下,SPY和EWT分別佔據了1/3和2/3,而在Minimum Volatility Portfolio Allocation 的任務下,也是幾乎要購買BNDX才可以達成這個任務,VNQ都是占據0%,而SPY、BNDX和EWT都有相對應的購買情境。此外,最佳的sharpe ratio是 (0.1526–0.0178)/0.1767 = 76.29%。在0.2左右之後,由於沒有相對應的資料,所以efficient frontier會到很上面,但是其實這沒有用意,我只是沒有設定好。

圖(十) 在用solver找到的最佳組合下創建的效率前緣

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Maximum Sharpe Ratio Portfolio Allocation
Annualised Return: 0.1526
Annualised Volatility: 0.1767
SPY BNDX VNQ EWT
allocation 62.049 0.0 0.0 37.951
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Minimum Volatility Portfolio Allocation
Annualised Return: 0.0211
Annualised Volatility: 0.0412
SPY BNDX VNQ EWT
allocation 2.371 97.5793 0.0 0.0497
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

我們得到的結果與我們從隨機產生的投資組合中進行選擇所模擬的結果幾乎相同。 細微的差別在於,Scipy 的「最佳化」功能在最大夏普比率投資組合上根本沒有為 VNQ分配任何預算,而我們從隨機產生的樣本中選擇的投資組合則為VNQ分配了一點點的預算。小數點後的位數有一些差異,但或多或​​少是相同的。

我們不必繪製每個隨機產生的投資組合,而是可以在圖上繪製每隻股票以及每隻股票的年度回報和年度風險的相應值。 這樣我們就可以看到並比較多元化如何透過優化配置來降低風險。

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Individual Stock Returns and Volatility

SPY : annuaised return 0.1504 , annualised volatility: 0.1823
BNDX : annuaised return 0.0179 , annualised volatility: 0.0415
VNQ : annuaised return 0.0723 , annualised volatility: 0.2163
EWT : annuaised return 0.1563 , annualised volatility: 0.2027
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

SPY都大略在效用前緣上,然後VNQ在這三條點構築的efficient frontier裡面。接下來增加成5點(iShares Preferred and Income Securities ETF (PFF) 特別股跟收益證券) 六點(ProShares UltraPro QQQ (TQQQ) 三倍做多那斯達克市場),7點(增加SPDR Bloomberg High Yield Bond ETF (JNK) 垃圾債券),並且觀察他的夏普率和最小變異數組合等,以下表格是在不同情況下的各式數值,可以顯現出增加

不同的標的可以如何改善績效:

讓我們快轉到七個資產的情況:

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Maximum Sharpe Ratio Portfolio Allocation

Annualised Return: 0.3321
Annualised Volatility: 0.384

SPY TQQQ BNDX VNQ PFF JNK EWT
allocation 0.0 44.0345 0.0 0.0 0.0 0.51 55.4555
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Minimum Volatility Portfolio Allocation

Annualised Return: 0.0204
Annualised Volatility: 0.041

SPY TQQQ BNDX VNQ PFF JNK EWT
allocation 0.0 0.0 92.9404 0.0 0.0 7.0596 0.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Individual Stock Returns and Volatility

SPY : annuaised return 0.1504 , annualised volatility: 0.1823
TQQQ : annuaised return 0.551 , annualised volatility: 0.666
BNDX : annuaised return 0.0179 , annualised volatility: 0.0415
VNQ : annuaised return 0.0723 , annualised volatility: 0.2163
PFF : annuaised return 0.0405 , annualised volatility: 0.1341
JNK : annuaised return 0.0532 , annualised volatility: 0.0903
EWT : annuaised return 0.1563 , annualised volatility: 0.2027
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
增加JNK時可以稍微改善部分的收益和夏普率,還有相對應的最小風險,尤其是在最小變異數那邊,本來第二多的資產會選擇用EWT,後來會使用JNK 7%,而增加JNK會對整個portfolio造成些微的影響,使夏普率小幅增加。

--

--

Vincent Ko
Vincent Ko

Written by Vincent Ko

又名為黑翅鳶羽札,2024年即將邁向大四,正在國泰銀行資訊部門實習,可能會帶來第一手GenAI相關知識。LLM、人工智慧、資料分析與處理;財金、管理、財金數據分析。

No responses yet