金融学投资组合 最小方差与最大夏普比率

投资组合(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)