### 马科维茨投资组合模型的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]。