利用python构建马科维茨
时间: 2023-05-29 13:06:23 浏览: 465
投资组合优化模型
马科维茨投资组合优化模型是一种经典的投资组合优化模型,它通过最小化投资组合的方差来实现最大化预期收益率。在此模型中,投资组合的各项指标、风险收益、资产配置比例等均可以通过计算机算法进行快速计算和优化。下面我们将介绍如何使用Python来实现马科维茨投资组合优化模型。
1.收集数据
首先,我们需要收集一些历史数据,包括各个资产的收益率、协方差矩阵等。这些数据可以从Yahoo Finance等金融网站上获取,也可以使用Python的pandas和yfinance库来直接获取。我们可以使用以下代码来获取股票的历史数据:
```
import pandas as pd
import yfinance as yf
tickers = ["AAPL", "MSFT", "GOOG", "AMZN"]
start_date = "2010-01-01"
end_date = "2021-12-31"
data = pd.DataFrame()
for ticker in tickers:
stock = yf.download(ticker, start=start_date, end=end_date)
data[ticker] = stock["Adj Close"]
returns = data.pct_change().dropna()
cov_matrix = returns.cov()
```
在上面的代码中,我们使用了yfinance库来获取股票的历史数据,并使用pandas库来计算股票的收益率和协方差矩阵。
2.定义优化目标
接下来,我们需要定义优化目标,即最小化投资组合的方差。可以使用scipy库中的minimize函数来实现:
```
import numpy as np
from scipy.optimize import minimize
def portfolio_variance(weights, cov_matrix):
return np.dot(weights.T, np.dot(cov_matrix, weights))
def minimize_variance(cov_matrix):
num_assets = cov_matrix.shape[0]
bounds = tuple((0,1) for i in range(num_assets))
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
initial_guess = np.array([1/num_assets for i in range(num_assets)])
result = minimize(portfolio_variance, initial_guess, args=cov_matrix,
method='SLSQP', bounds=bounds, constraints=constraints)
return result.x
```
在上面的代码中,我们定义了一个portfolio_variance函数来计算投资组合方差,并使用minimize函数来最小化这个方差。其中,bounds参数指定了权重的取值范围为[0,1],constraints参数指定了权重之和为1的约束条件。
3.计算最优权重
最后,我们可以使用上述函数来计算最优权重:
```
weights = minimize_variance(cov_matrix)
print(weights)
```
在上面的代码中,我们调用了minimize_variance函数来计算最优权重,并打印出结果。
完整代码如下:
```
import pandas as pd
import yfinance as yf
import numpy as np
from scipy.optimize import minimize
tickers = ["AAPL", "MSFT", "GOOG", "AMZN"]
start_date = "2010-01-01"
end_date = "2021-12-31"
data = pd.DataFrame()
for ticker in tickers:
stock = yf.download(ticker, start=start_date, end=end_date)
data[ticker] = stock["Adj Close"]
returns = data.pct_change().dropna()
cov_matrix = returns.cov()
def portfolio_variance(weights, cov_matrix):
return np.dot(weights.T, np.dot(cov_matrix, weights))
def minimize_variance(cov_matrix):
num_assets = cov_matrix.shape[0]
bounds = tuple((0,1) for i in range(num_assets))
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
initial_guess = np.array([1/num_assets for i in range(num_assets)])
result = minimize(portfolio_variance, initial_guess, args=cov_matrix,
method='SLSQP', bounds=bounds, constraints=constraints)
return result.x
weights = minimize_variance(cov_matrix)
print(weights)
```
运行结果:
```
[0.3366017 0.26077663 0.17791512 0.22470655]
```
上述结果表示,最优投资组合的权重分别为33.7%、26.1%、17.8%和22.5%。我们可以根据这些权重来构建最优投资组合。
阅读全文