005 | 马科维茨投资组合理论实现

### 马科维茨投资组合模型的Python实现 #### 导入必要的库 为了实现马科维茨投资组合理论,在Python中通常会使用一些特定的数据分析和优化库。以下是导入所需库的一个例子: ```python import numpy as np import pandas as pd from scipy.optimize import minimize import matplotlib.pyplot as plt plt.style.use('seaborn-dark') ``` #### 获取股票价格数据并处理 获取历史股价数据是第一步,这可以通过多种方式完成,比如通过`yfinance`这样的API来下载Yahoo Finance上的公开市场数据。 ```python import yfinance as yf def get_stock_data(tickers, start_date, end_date): data = {} for ticker in tickers: stock_data = yf.download(ticker, start=start_date, end=end_date)['Adj Close'] data[ticker] = stock_data df = pd.DataFrame(data) returns = df.pct_change().dropna() return returns ``` #### 计算期望收益、波动率以及协方差矩阵 接下来,基于所获得的历史收益率数据,计算各资产的平均日回报率(即预期年化收益率)、标准偏差(作为风险度量),还有它们之间相互关系构成的协方差矩阵。 ```python returns = get_stock_data(['AAPL', 'MSFT'], '2018-01-01', '2023-01-01') mean_daily_returns = returns.mean() cov_matrix = returns.cov() num_portfolios = 25000 risk_free_rate = 0.0178 # 假设无风险利率为1.78% ``` #### 构建随机投资组合 创建一系列不同的权重分配方案,并据此评估每一个可能的投资组合的表现特征——主要是指预期收益与总风险水平。 ```python results = np.zeros((4+len(returns.columns)-1,num_portfolios)) for i in range(num_portfolios): weights = np.random.random(len(returns.columns)) weights /= sum(weights) portfolio_return = np.sum(mean_daily_returns * weights) * 252 portfolio_std_dev = np.sqrt(np.dot(weights.T,np.dot(cov_matrix,weights))) * np.sqrt(252) results[0,i] = portfolio_return results[1,i] = portfolio_std_dev results[2,i] = (results[0,i]-risk_free_rate)/results[1,i] for j in range(len(weights)): results[j+3,i] = weights[j] ``` #### 绘制有效前沿曲线 最后一步就是可视化这些结果,特别是要突出显示那些位于有效边界上的点位,也就是所谓的“最优”投资组合。 ```python max_sharpe_idx = np.argmax(results[2]) sdp, rp = results[1,max_sharpe_idx], results[0,max_sharpe_idx] sharp_ratio_max = round(rp/sdp*100,2) fig = plt.figure(figsize=(9, 5)) ax = fig.add_subplot(111) scatter = ax.scatter( results[1,:], results[0,:], c=results[2,:], cmap='RdYlGn', marker='o' ) ax.set_xlabel('Expected Volatility') ax.set_ylabel('Expected Return') ax.grid(True) colorbar = plt.colorbar(scatter,label='Sharpe Ratio') ax.plot(sdp,rp,'*',markersize=15,color="red",label=f'Max Sharpe ({sharp_ratio_max}%)') legend = ax.legend(loc='best', shadow=True, fontsize='large') plt.tight_layout() plt.savefig('/path/to/save/image.png', dpi=500, bbox_inches='tight') plt.show() ``` 此过程展示了如何利用Python编程语言及其丰富的科学计算生态体系来进行复杂的金融工程任务之一—寻找最佳的风险调整后的投资策略[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘要努力。

顺便点一个赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值