開始使用免費開始

計算投資組合

現在要產生多個投資組合,找出每個月份表現最好的那一個。numpyrandom.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])
編輯並執行程式碼