编写聚宽均值方差有效前沿上找风险最小点代码
时间: 2024-09-25 13:16:36 浏览: 40
在编写基于Pandas DataFrame的Python代码中,如果你想要找到投资组合在给定的风险水平下收益最大的均衡点,通常会涉及到计算资产的有效前沿(Efficient Frontier)。这里是一个简单的例子,我们将使用`numpy`和`pandas`库来实现这个功能:
```python
import pandas as pd
import numpy as np
from scipy.optimize import minimize
# 假设df_data是你存储了资产收益率的数据框,有两列'Assets' (资产名称) 和'Returns' (收益率)
df_data = pd.DataFrame({
'Assets': ['Asset1', 'Asset2', 'Asset3'],
'Returns': [0.05, 0.07, 0.06]
})
def portfolio_return(weights, returns):
return np.sum(returns * weights)
def portfolio_volatility(weights, cov_matrix):
return np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
# 假设cov_matrix是协方差矩阵,你可以从数据集中计算或提供它
cov_matrix = df_data['Returns'].cov()
def get_min_volatility_risk_ratio(target_volatility, returns, cov_matrix):
def objective_function(weights):
portfolio_return_ = portfolio_return(weights, returns)
portfolio_volatility_ = portfolio_volatility(weights, cov_matrix)
if portfolio_volatility_ < target_volatility:
# 如果波动率低于目标,则惩罚回报,使其接近于最小值
penalty = -(portfolio_return_ + 1e-8)
else:
# 否则,只考虑最大化回报
penalty = -portfolio_return_
return portfolio_volatility_, penalty
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(len(df_data)))
opt_results = minimize(objective_function, np.array([1 / len(df_data)] * len(df_data)), method='SLSQP', bounds=bounds, constraints=constraints)
if opt_results.success:
optimal_weights = opt_results.x
min_volatility = opt_results.fun[0]
max_return = portfolio_return(optimal_weights, returns)
print(f"在{target_volatility}波动率下的最大回报: {max_return}")
print(f"对应的权重分布: {optimal_weights}")
return min_volatility, max_return
else:
print("优化未成功")
# 调用函数,例如找到波动率为0.08时的风险最小化点
min_volatility, max_return = get_min_volatility_risk_ratio(0.08, df_data['Returns'], cov_matrix)
```
在这个代码片段中,我们首先定义了一个投资组合的回报和波动率函数,然后创建了一个优化函数来寻找在特定波动率下,返回最大化但又尽量降低风险的投资组合。请注意,实际应用中你需要处理更多的细节,比如异常情况处理、输入验证等。
阅读全文