如何用python画出在允许卖空条件下的投资组合的有效前沿
时间: 2024-03-06 21:47:36 浏览: 20
要画出在允许卖空条件下的投资组合的有效前沿,可以按照以下步骤进行:
1.准备数据:需要收集各个资产的历史数据,以计算其收益率和风险。
2.计算收益率和风险:可以使用Python中的pandas和numpy库来计算资产收益率和风险。其中收益率可以通过计算资产价格的变化率来得到,风险可以通过资产价格波动的标准差来度量。
3.生成投资组合:可以使用Python中的scipy库来生成不同比例的投资组合。可以尝试不同的投资组合比例,以寻找最佳组合。
4.计算组合收益率和风险:根据不同比例的投资组合计算其收益率和风险。
5.画出有效前沿:使用Python中的matplotlib库来画出有效前沿,即不同风险水平下可以获得的最大收益率。
以下是Python代码的示例:
```python
import pandas as pd
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('data.csv')
# 计算收益率和风险
returns = data.pct_change()
mean_returns = returns.mean()
cov_matrix = returns.cov()
# 定义投资组合收益率和风险函数
def portfolio_returns(weights, mean_returns):
return np.sum(weights * mean_returns)
def portfolio_risk(weights, cov_matrix):
return np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
# 定义有效前沿函数
def minimize_risk(target_return, mean_returns, cov_matrix):
num_assets = len(mean_returns)
args = (mean_returns, cov_matrix)
# 定义约束条件
constraints = ({'type': 'eq', 'fun': lambda x: portfolio_returns(x, mean_returns) - target_return},
{'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
# 定义变量边界
bound = (0.0, 1.0)
bounds = tuple(bound for asset in range(num_assets))
# 最小化风险
result = minimize(portfolio_risk, num_assets*[1./num_assets,], args=args,
method='SLSQP', bounds=bounds, constraints=constraints)
return result
# 绘制有效前沿
target_returns = np.linspace(0.0, 0.2, num=50)
target_risks = []
for target_return in target_returns:
result = minimize_risk(target_return, mean_returns, cov_matrix)
target_risks.append(result['fun'])
plt.plot(target_risks, target_returns, 'o', markersize=5)
plt.xlabel('Risk')
plt.ylabel('Return')
plt.title('Efficient Frontier')
plt.show()
```
上述代码中,data.csv是包含各个资产历史数据的CSV文件。代码中使用了pandas、numpy、scipy和matplotlib库,其中pandas和numpy库用于计算资产收益率和风险,scipy库用于生成投资组合和最小化风险,matplotlib库用于绘制有效前沿。