EPO多资产动态配置策略
策略说明:
本策略基于**EPO(Enhanced Portfolio Optimization)**方法,通过动态优化多资产组合的权重,捕捉不同资产类别的风险收益特征。策略的核心思想是利用协方差矩阵的收缩估计和投资者信号(如预期收益率),构建风险调整后的最优组合。
策略核心逻辑:
-
资产池选择:
-
黄金ETF(518880.XSHG):大宗商品,用于对冲通胀和市场波动。
-
纳指100ETF(513100.XSHG):海外资产,代表科技成长股。
-
创业板100ETF(159915.XSHE):国内成长股,聚焦科技和中小盘。
-
红利ETF(510880.XSHG):国内价值股,防御性强,适合稳健配置。
-
-
EPO优化模型:
-
协方差矩阵收缩:通过加权单位矩阵和历史协方差矩阵,降低估计误差。
-
投资者信号:使用资产的历史收益率均值作为预期收益率信号。
-
锚定基准:以风险平价权重(1/波动率)作为基准,避免过度偏离。
-
风险厌恶系数:设定为10,反映中等风险偏好。
-
-
动态调仓:
-
每月第一个交易日10:00,根据最新数据重新计算资产权重。
-
按优化结果调整持仓,确保组合始终处于最优状态。
-
-
风险控制:
-
权重归一化:确保组合权重总和为1,满足全投资约束。
-
非负权重:剔除负权重,避免做空操作。
-
策略特点:
-
多资产配置:涵盖大宗商品、海外资产、国内成长股和价值股,分散风险。
-
动态优化:每月调仓,及时捕捉市场变化。
-
风险调整:通过协方差矩阵收缩和锚定基准,降低估计误差和组合波动。
-
简单易用:仅需4只ETF,适合中小资金和普通投资者。
适用场景:
-
市场环境:适用于震荡市或结构性行情,分散配置可降低单一资产风险。
-
资金规模:适合中小资金(1亿以内),ETF流动性充足。
-
投资者类型:适合追求稳健收益、能承受中低波动的量化投资者。
风险提示:
-
模型风险:EPO方法依赖历史数据,若市场结构突变可能导致模型失效。
-
流动性风险:ETF流动性虽高,但极端行情下仍可能出现滑点。
-
汇率风险:纳指100ETF受美元汇率影响,需关注汇率波动。
-
政策风险:国内政策变化可能影响创业板和红利ETF的表现。
代码结构:
| 模块 | 函数 | 功能说明 |
|---|---|---|
| 初始化 | initialize |
设定基准、交易参数,定义资产池,绑定定时任务 |
| 优化模型 | epo |
实现EPO优化算法,计算最优权重 |
| 数据准备 | run_optimization |
获取历史收益率数据,调用EPO函数计算权重 |
| 交易执行 | trade |
根据优化结果调整持仓,确保组合权重匹配目标 |
优化建议:
-
因子扩展:
-
引入宏观经济因子(如CPI、PMI)或市场情绪因子(如VIX),增强信号质量。
-
测试动量、波动率等技术指标,优化预期收益率估计。
-
-
模型改进:
-
尝试其他协方差估计方法(如Ledoit-Wolf收缩)。
-
引入Black-Litterman模型,结合主观观点调整预期收益率。
-
-
风险控制:
-
设置最大回撤阈值,触发后自动降仓。
-
加入止损机制,防止单一资产大幅下跌拖累组合。
-
-
交易优化:
-
使用VWAP/TWAP算法拆单,降低冲击成本。
-
结合Level2盘口数据,优化ETF买卖时机。
-
总结:
本策略通过EPO方法动态优化多资产组合,兼顾风险与收益,适合追求稳健收益的投资者。策略逻辑清晰,模块化设计便于迭代,实盘前需重点测试模型稳定性和风险控制机制。
策略代码
import numpy as np
import pandas as pd
from scipy.linalg import solve
#初始化函数
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
set_option("avoid_future_data", True)
set_slippage(FixedSlippage(0.002))
set_order_cost(OrderCost(open_tax=0, close_tax=0, open_commission=0.0002, close_commission=0.0002, close_today_commission=0, min_commission=5), type='fund')
log.set_level('system', 'error')
# 参数
g.etf_pool = [
'518880.XSHG', #黄金ETF(大宗商品)
'513100.XSHG', #纳指100(海外资产)
'159915.XSHE', #创业板100(成长股,科技股,题材性,中小盘)
'510880.XSHG', #红利ETF(价值股,蓝筹股,防御性,中大盘)
]
run_monthly(trade, 1, '10:00') #每天运行确保即时捕捉动量变化
关键函数解锁后查看:
# 定义获取数据并调用优化函数的函数
def run_optimization(stocks, end_date):
prices = get_price(stocks, count=1200, end_date=end_date, frequency='daily', fields=['close'])['close']
returns = prices.pct_change().dropna() # 计算收益率
d = np.diag(returns.cov())
a = (1/d) / (1/d).sum()
# a= np.array([0.25,0.25,0.25,0.25])
weights = epo(x = returns, signal = returns.mean(), lambda_ = 10, method = "anchored", w = 1, anchor=a)
return weights
# 交易
def trade(context):
end_date = context.previous_date
weights = run_optimization(g.etf_pool, end_date)
print("weights",weights)
if weights is None:
return
total_value = context.portfolio.total_value # 获取总资产
index = 0
for w in weights:
value = total_value * w # 确定每个标的的权重
order_target_value(g.etf_pool[index], value) # 调整标的至目标权重
index+=1
2025-02-23
