(11-6-01)基于深度强化学习的量化交易Agent:优化投资组合

10.7  最小方差投资组合分配

最小方差投资组合分配是一种通过优化投资组合权重,以最小化整个投资组合的方差(波动性)的方法。这种方法旨在构建一个投资组合,使其在给定一组资产的情况下,具有最小的风险。通过调整不同资产在投资组合中的权重,以达到整体风险最小化的目标,这种方法在现代投资组合理论中占有重要地位。

10.7.1  优化投资组合

(1)PyPortfolioOpt 是一个Python库,用于进行投资组合优化和风险管理。提供了一组工具和方法,帮助用户根据给定的投资组合目标和限制找到最优的资产分配。使用以下命令安装PyPortfolioOpt库:

pip install PyPortfolioOpt

(2)下面这部分代码首先导入了EfficientFrontier和risk_models,这两个模块是PyPortfolioOpt库中用于投资组合优化和风险模型的关键组件。接着,从trade数据中提取了唯一的股票代号(unique_tic)和唯一的交易日期(unique_trade_date)。最后,打印了数据框(df)的前几行以进行预览。

from pypfopt.efficient_frontier import EfficientFrontier
from pypfopt import risk_models
unique_tic = trade.tic.unique()
unique_trade_date = trade.date.unique()
df.head()

执行后会输出:

	date	open	high	low	close	adjcp	volume	tic	day	macd	boll_ub	boll_lb	rsi_30	cci_30	dx_30	close_30_sma	close_60_sma	cov_list	return_list
0	2008-12-31	3.070357	3.133571	3.047857	3.048214	2.602662	607541200	AAPL	2	-0.097446	3.649552	2.895305	42.254771	-80.847207	16.129793	3.243631	3.375887	[[0.001348968986171653, 0.00042841264280825875...	tic AAPL AMGN AXP ...
1	2008-12-31	57.110001	58.220001	57.060001	57.750000	43.587837	6287200	AMGN	2	0.216368	58.947401	56.388599	51.060614	51.895357	10.432018	56.671334	56.044333	[[0.001348968986171653, 0.00042841264280825875...	tic AAPL AMGN AXP ...
2	2008-12-31	17.969999	18.750000	17.910000	18.549999	14.852879	9625600	AXP	2	-1.191668	23.723023	16.106977	42.521170	-74.811722	25.776759	20.030000	22.412000	[[0.001348968986171653, 0.00042841264280825875...	tic AAPL AMGN AXP ...
3	2008-12-31	41.590000	43.049999	41.500000	42.669998	32.005894	5443100	BA	2	-0.391219	42.894634	38.486366	47.290375	157.922391	5.366299	40.432000	43.304500	[[0.001348968986171653, 0.00042841264280825875...	tic AAPL AMGN AXP ...
4	2008-12-31	43.700001	45.099998	43.700001	44.669998	30.416977	6277400	CAT	2	0.979845	45.785565	38.404435	51.073052	98.904653	26.331746	40.266000	39.918333	[[0.001348968986171653, 0.00042841264280825875...	tic AAPL AMGN AXP ...

(3)下面的代码用于计算最小方差投资组合的资产价值。首先,为每个唯一的交易日期迭代,获取当天和下一天的数据。接着,计算收益率的协方差矩阵(Sigma)。随后,使用EfficientFrontier模块进行投资组合分配,设置权重的上下限为(0, 0.1),并通过min_volatility()方法获取最小方差投资组合的原始权重。清理这些权重后,计算当前资本、每个股票的当前投资金额、当前持有的股票数量,以及下一时间段的股票价格。最后,计算下一时间段的总账户价值,并在结果数据框中存储。

# 计算最小方差投资组合
portfolio = pd.DataFrame(index=range(1), columns=unique_trade_date)
initial_capital = 1000000
portfolio.loc[0, unique_trade_date[0]] = initial_capital

for i in range(len(unique_trade_date) - 1):
    # 获取当前日期和下一个日期的数据
    df_temp = df[df.date == unique_trade_date[i]].reset_index(drop=True)
    df_temp_next = df[df.date == unique_trade_date[i + 1]].reset_index(drop=True)
    # 计算协方差矩阵
    Sigma = df_temp.return_list[0].cov()
    # 配置投资组合
    ef_min_var = EfficientFrontier(None, Sigma, weight_bounds=(0, 0.1))
    # 最小方差投资组合
    raw_weights_min_var = ef_min_var.min_volatility()
    # 获取权重
    cleaned_weights_min_var = ef_min_var.clean_weights()
    # 当前资本
    cap = portfolio.iloc[0, i]
    # 每支股票的当前投资金额
    current_cash = [element * cap for element in list(cleaned_weights_min_var.values())]
    # 当前持有的股票数量
    current_shares = list(np.array(current_cash) / np.array(df_temp.close))
    # 下一时间段的股票价格
    next_price = np.array(df_temp_next.close)
    # 计算下一时间段的总账户价值
    portfolio.iloc[0, i + 1] = np.dot(current_shares, next_price)
# 转置数据框并设置列名
portfolio = portfolio.T
portfolio.columns = ['account_value']

portfolio.head()

执行后会输出:

account_value
2020-010-01	1000000
2020-010-02	1005234.883501
2020-010-06	1014933.780399
2020-010-07	1014238.666671
2020-010-08	1012674.038646

(4)计算使用A2C模型、最小方差投资组合以及基准(Dow Jones指数)的累积收益率,将每日收益率序列累积,得到了它们相对于初始值的总体增长情况,用于比较和评估不同投资策略的绩效。

a2c_cumpod =(df_daily_return.daily_return+1).cumprod()-1
min_var_cumpod =(portfolio.account_value.pct_change()+1).cumprod()-1
dji_cumpod =(baseline_returns+1).cumprod()-1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值