計算投資組合
現在要產生多個投資組合,找出每個月份表現最好的那一個。numpy 的 random.random() 會從均勻分配產生隨機數,接著我們用 /= 運算子 正規化,讓它們的總和為 1。我們用這些權重來計算報酬與波動度。報酬是權重與各自報酬的加權總和。波動度較複雜,會用到不同股票之間的共變異數。
最後,我們會把這些數值存進字典中,之後再使用,並以每個月份的日期作為鍵。
在這個練習中,每個日期只會產生 10 個投資組合,讓程式碼執行更快。但在真實情境下,你會想對少數幾檔股票產生大約 1000 到 5000 個隨機投資組合。
本練習屬於課程
Python 金融 Machine Learning
練習說明
- 使用
np.random.random()產生權重的隨機數,共 3 個。 - 以
weights與迴圈中當前date的月報酬做點積(np.dot();將兩個陣列對應元素相乘後加總),計算returns。 - 使用
.setdefault()方法,先在portfolio_weights字典的當前date下新增一個空清單([]),然後把weights加到該清單末端。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
portfolio_returns, portfolio_volatility, portfolio_weights = {}, {}, {}
# Get portfolio performances at each month
for date in sorted(covariances.keys()):
cov = covariances[date]
for portfolio in range(10):
weights = np.random.random(____)
weights /= np.sum(weights) # /= divides weights by their sum to normalize
returns = np.dot(____, returns_monthly.loc[____])
volatility = np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
portfolio_returns.setdefault(date, []).append(returns)
portfolio_volatility.setdefault(date, []).append(volatility)
portfolio_weights.setdefault(date, ____).append(____)
print(portfolio_weights[date][0])