从证券业市场里面找出六个,国债无风险,算切点组合,计算最优组合,做权重
计算有效前沿
关注引自免费微信小程序:皆我百晓生
构建一个6-8只股票的投资组合的可行集(也称为投资机会集)并找到最优组合的过程涉及到几个步骤:收集数据、计算收益和风险、绘制可行集和确定最优组合。这里我会为你提供一个Python实现的示例,包括获取数据、计算相关指标、绘制图形以及找到有效前沿上的最小方差组合。
首先,确保你安装了必要的库,如pandas, numpy, matplotlib 和 yfinance。
pip install pandas numpy matplotlib yfinance
接下来,我们将编写一个函数来获取股票数据,计算收益和风险,并绘制可行集。这里我们使用yfinance库来下载股票数据,但你也可以选择其他数据源。
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# 获取股票历史数据
def get_data(stock_list):
data = yf.download(stock_list, period="1y", interval="1d")
return data["Adj Close"].dropna()
# 计算收益率和协方差矩阵
def calculate_returns_and_covariance(data):
returns = data.pct_change().dropna()
covariance_matrix = returns.cov()
return returns, covariance_matrix
# 绘制可行集
def plot_feasible_set(returns, covariance_matrix, min_risk=0.01):
n_assets = len(returns.columns)
mean_returns = returns.mean()
def portfolio_variance(weights):
return weights.T @ covariance_matrix @ weights
def portfolio_return(weights):
return weights.T @ mean_returns
# 定义优化目标(最小化方差)
def objective_function(weights):
return portfolio_variance(weights)
# 限制所有权重之和为1
constraints = [{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}]
# 限制单个资产权重不超过25%
bounds = [(0, 0.25)] * n_assets
# 最小化方差寻找最小方差组合
min_var_weights = minimize(objective_function, np.ones(n_assets) / n_assets,
method='SLSQP', bounds=bounds, constraints=constraints)
# 找到最大收益组合
max_ret_weights = minimize(-portfolio_return, np.ones(n_assets) / n_assets,
method='SLSQP', bounds=bounds, constraints=constraints)
risk_free_rate = 0.01 # 假设无风险利率为1%
# 计算有效前沿
efficient_frontier_weights = []
for target_return in np.linspace(min(mean_returns), max(mean_returns), 100):
weights = minimize(portfolio_variance - (target_return - risk_free_rate) / np.sqrt(covariance_matrix.values.diagonal()).sum(),
np.ones(n_assets) / n_assets,
method='SLSQP', bounds=bounds, constraints=constraints).x
efficient_frontier_weights.append(weights)
# 绘制可行集
fig, ax = plt.subplots(figsize=(12, 8))
ax.set_title("Efficient Frontier and Optimal Portfolio")
ax.set_xlabel('Volatility')
ax.set_ylabel('Return')
for ef_weights in efficient_frontier_weights:
vol = np.sqrt(portfolio_variance(ef_weights))
ret = portfolio_return(ef_weights)
ax.scatter(vol, ret, color='grey', alpha=0.3)
ax.plot(np.std(min_var_weights.x * returns), portfolio_return(min_var_weights.x),
'o', label='Minimum Variance Portfolio')
ax.plot(np.std(max_ret_weights.x * returns), portfolio_return(max_ret_weights.x),
'o', label='Maximum Return Portfolio')
ax.legend()
ax.grid(True)
plt.show()
# 股票列表
stock_list = ['AAPL', 'GOOGL', 'MSFT', 'AMZN', 'TSLA', 'FB', 'JPM', 'V'] # 选取六至八只股票
data = get_data(stock_list)
returns, covariance_matrix = calculate_returns_and_covariance(data)
plot_feasible_set(returns, covariance_matrix)
这段代码将下载选定股票的历史收盘价数据,然后计算每日收益率和协方差矩阵。接着,它会绘制出可行集,显示不同风险水平下的预期回报。在绘图部分,你会看到最小方差组合(最低风险)和最大回报组合。有效前沿是连接这些高效率组合的曲线。通过调整目标回报率,你可以找到在给定风险水平下的最优组合。
注意:这个例子中的数据是从雅虎财经抓取的,实际操作时可能需要根据实际情况调整数据来源和处理方式。此外,风险和回报的计算基于历史数据,现实世界中可能存在更多因素影响投资决策,这只是一个基础模型。