1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| cov_matrix = returns.cov() * 252
weights = np.array([0.25, 0.25, 0.25, 0.25]) portfolio_return = np.sum(annual_returns * weights) portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights))) sharpe_ratio = (portfolio_return - 0.02) / portfolio_volatility
print(f"等权重组合:") print(f"预期年化收益: {portfolio_return:.2%}") print(f"年化波动率: {portfolio_volatility:.2%}") print(f"夏普比率: {sharpe_ratio:.2f}")
from scipy.optimize import minimize
def portfolio_performance(weights, returns, cov_matrix): port_return = np.sum(returns * weights) port_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights))) return port_return, port_volatility
def minimize_volatility(weights, returns, cov_matrix): return portfolio_performance(weights, returns, cov_matrix)[1]
num_portfolios = 1000 results = np.zeros((3, num_portfolios)) weight_array = []
for i in range(num_portfolios): weights = np.random.random(4) weights /= np.sum(weights) weight_array.append(weights) port_return, port_volatility = portfolio_performance(weights, annual_returns, cov_matrix) results[0, i] = port_volatility results[1, i] = port_return results[2, i] = (port_return - 0.02) / port_volatility
plt.figure(figsize=(10, 6)) plt.scatter(results[0, :], results[1, :], c=results[2, :], cmap='YlOrRd', marker='o', s=10, alpha=0.5) plt.colorbar(label='Sharpe Ratio') plt.xlabel('Volatility') plt.ylabel('Expected Return') plt.title('Efficient Frontier') plt.grid(True, alpha=0.3) plt.show()
|