计算投资组合
现在我们将生成一组投资组合,以找出每个月表现最好的那个。numpy 的 random.random() 会从均匀分布生成随机数,然后我们用 /= 运算符将它们归一化,使其之和为 1。接着用这些权重计算收益和波动率。收益是权重与各自收益的加权求和。波动率更复杂,涉及不同股票之间的协方差。
最后,我们会将这些值存入字典,键为每个月的日期,供后续使用。
在本练习中,我们每个日期只生成 10 个投资组合,以加快运行速度。但在真实场景中,若只包含少量股票,通常会随机生成约 1000 到 5000 个投资组合。
本练习是课程的一部分
Python 金融机器学习
练习说明
- 使用
np.random.random()生成权重的 3 个随机数。 - 计算
returns:对循环中当前date的月度收益与weights做点积(np.dot();对两个数组逐元素相乘并求和)。 - 使用
.setdefault()方法为当前date在portfolio_weights字典中添加一个空列表([]),然后将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])