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()
利用浦发银行、中国石化、上汽集团、三一重工和海螺水泥5支上证500成分股five_acsv完成下列操作注意数据已为对数收益率不需要换算:1画出这5支股票的构成的效率前缘图2以2016-11-22到2020-12-31的数据为训练集2021-01-4到2021-11-18的数据为测试集计算出目标日收益率为0002时各资产组合的比例并画出最优配置与随机配置绩效比较图。

原文地址: https://www.cveoy.top/t/topic/bJjO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录