利用浦发银行、中国石化、上汽集团、三一重工和海螺水泥5支上证500成分股five_acsv完成下列操作注意数据已为对数收益率不需要换算:1画出这5支股票的构成的效率前缘图2以2016-11-22到2020-12-31的数据为训练集2021-01-4到2021-11-18的数据为测试集计算出目标日收益率为0002时各资产组合的比例并画出最优配置与随机配置绩效比较图。
import pandas as pd
import numpy as np
from scipy.optimize import minimize
# 读取数据
data = pd.read_csv('five_a.csv', index_col=0)
# 计算年化收益率和年化波动率
mean_return = data.mean() * 252
cov_matrix = data.cov() * 252
# 定义目标函数
def calculate_portfolio_return(weights, mean_return):
portfolio_return = np.sum(mean_return * weights)
return portfolio_return
def calculate_portfolio_volatility(weights, cov_matrix):
portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
return portfolio_volatility
def calculate_portfolio_sharpe_ratio(weights, mean_return, cov_matrix, risk_free_rate):
portfolio_return = calculate_portfolio_return(weights, mean_return)
portfolio_volatility = calculate_portfolio_volatility(weights, cov_matrix)
sharpe_ratio = (portfolio_return - risk_free_rate) / portfolio_volatility
return sharpe_ratio
# 定义约束条件
def constraint(weights):
return np.sum(weights) - 1
# 定义优化函数
def optimize_portfolio(mean_return, cov_matrix, risk_free_rate):
num_assets = len(mean_return)
# 定义初始权重和约束条件
init_weights = np.ones(num_assets) / num_assets
bounds = ((0, 1), ) * num_assets
constraints = [{'type': 'eq', 'fun': constraint}]
# 求解最优化问题
result = minimize(
fun=lambda weights: -calculate_portfolio_sharpe_ratio(weights, mean_return, cov_matrix, risk_free_rate),
x0=init_weights,
bounds=bounds,
constraints=constraints
)
return result.x
# 计算最优化权重
train_data = data.loc['2016-11-22':'2020-12-31']
test_data = data.loc['2021-01-04':'2021-11-18']
train_mean_return = train_data.mean() * 252
train_cov_matrix = train_data.cov() * 252
optimal_weights = optimize_portfolio(train_mean_return, train_cov_matrix, 0.02)
# 计算各资产组合的收益率和波动率
portfolio_returns = []
portfolio_volatilities = []
for i in range(10000):
weights = np.random.uniform(size=5)
weights /= np.sum(weights)
portfolio_return = calculate_portfolio_return(weights, train_mean_return)
portfolio_volatility = calculate_portfolio_volatility(weights, train_cov_matrix)
portfolio_returns.append(portfolio_return)
portfolio_volatilities.append(portfolio_volatility)
# 计算最优配置和随机配置的收益率和波动率
optimal_portfolio_return = calculate_portfolio_return(optimal_weights, train_mean_return)
optimal_portfolio_volatility = calculate_portfolio_volatility(optimal_weights, train_cov_matrix)
random_portfolio_returns = np.array(portfolio_returns)
random_portfolio_volatilities = np.array(portfolio_volatilities)
# 计算目标收益率为0.002时,最优配置的比例
def calculate_weights_for_target_return(mean_return, cov_matrix, risk_free_rate, target_return):
num_assets = len(mean_return)
# 定义初始权重和约束条件
init_weights = np.ones(num_assets) / num_assets
bounds = ((0, 1), ) * num_assets
constraints = [{'type': 'eq', 'fun': constraint}]
# 定义目标函数
def target_function(weights):
return calculate_portfolio_return(weights, mean_return) - target_return
# 求解最优化问题
result = minimize(
fun=lambda weights: calculate_portfolio_volatility(weights, cov_matrix),
x0=init_weights,
bounds=bounds,
constraints=constraints,
method='SLSQP',
options={'disp': False},
tol=1e-6
)
return result.x
target_weights = calculate_weights_for_target_return(train_mean_return, train_cov_matrix, 0.02, 0.002)
# 画出效率前缘图
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
plt.scatter(random_portfolio_volatilities, random_portfolio_returns, alpha=0.1)
plt.plot(optimal_portfolio_volatility, optimal_portfolio_return, 'ro', markersize=10)
plt.xlabel('Volatility')
plt.ylabel('Return')
plt.title('Efficient Frontier')
plt.show()
# 计算最优配置和随机配置绩效比较图
test_mean_return = test_data.mean() * 252
test_cov_matrix = test_data.cov() * 252
optimal_portfolio_test_return = calculate_portfolio_return(optimal_weights, test_mean_return)
optimal_portfolio_test_volatility = calculate_portfolio_volatility(optimal_weights, test_cov_matrix)
random_portfolio_test_returns = np.array([calculate_portfolio_return(weights, test_mean_return) for weights in np.random.uniform(size=(10000, 5))])
random_portfolio_test_volatilities = np.array([calculate_portfolio_volatility(weights, test_cov_matrix) for weights in np.random.uniform(size=(10000, 5))])
target_weights_test = calculate_weights_for_target_return(test_mean_return, test_cov_matrix, 0.02, 0.002)
target_portfolio_test_return = calculate_portfolio_return(target_weights_test, test_mean_return)
target_portfolio_test_volatility = calculate_portfolio_volatility(target_weights_test, test_cov_matrix)
plt.figure(figsize=(8, 6))
plt.scatter(random_portfolio_test_volatilities, random_portfolio_test_returns, alpha=0.1)
plt.plot(optimal_portfolio_test_volatility, optimal_portfolio_test_return, 'ro', markersize=10, label='Optimal Portfolio')
plt.plot(target_portfolio_test_volatility, target_portfolio_test_return, 'bx', markersize=10, label='Target Portfolio')
plt.xlabel('Volatility')
plt.ylabel('Return')
plt.title('Portfolio Performance Comparison')
plt.legend()
plt.show()
原文地址: https://www.cveoy.top/t/topic/bJjO 著作权归作者所有。请勿转载和采集!