投资组合(Portfolio)是由多种金融资产(股票、债券、基金、衍生品、房地产等)按照一定比例组合而成的投资集合。
通过合理配置,分散风险,在控制风险的情况下追求最优收益
returns = data.pct_change().dropna()
mean_returns = returns.mean() * 252
cov_matrix = returns.cov() * 252
risk_free_rate = 0.02
def portfolio_performance(weights, mean_returns, cov_matrix):
p_ret = np.sum(mean_returns * weights)
p_std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
return p_ret, p_std
# 目标函数(-Sharpe)
def negative_sharpe_ratio(weights, mean_returns, cov_matrix, risk_free_rate):
p_ret, p_std = portfolio_performance(weights, mean_returns, cov_matrix)
return -(p_ret - risk_free_rate) / p_std
# 最小方差目标
def min_variance(weights, mean_returns, cov_matrix, risk_free_rate=None):
return portfolio_performance(weights, mean_returns, cov_matrix)[1]
# 优化函数
def optimize_portfolio(mean_returns, cov_matrix, objective_func):
num_assets = len(mean_returns)
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0,1) for _ in range(num_assets))
initial_weights = num_assets * [1./num_assets]
result = minimize(objective_func, initial_weights,
args=(mean_returns, cov_matrix, risk_free_rate),
method='SLSQP', bounds=bounds, constraints=constraints)
return result.x
# 最大 Sharpe 比率组合
max_sharpe_weights = optimize_portfolio(mean_returns, cov_matrix, negative_sharpe_ratio)
max_sharpe_ret, max_sharpe_std = portfolio_performance(max_sharpe_weights, mean_returns, cov_matrix)
max_sharpe_ratio = (max_sharpe_ret - risk_free_rate) / max_sharpe_std
# 最小波动率组合
min_vol_weights = optimize_portfolio(mean_returns, cov_matrix, min_variance)
min_vol_ret, min_vol_std = portfolio_performance(min_vol_weights, mean_returns, cov_matrix)