3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
本策略结合了动量效应(Momentum)与风险平价(Risk Parity,此处采用波动率倒数简化模型),旨在实现全球多资产的稳健配置。具体逻辑如下:
请在聚宽回测环境中运行以下完整代码:
import numpy as np
import pandas as pd
from jqdata import *
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 设定交易税费:买入万分之三,卖出万分之三(ETF不收印花税)
set_order_cost(OrderCost(close_tax=0.0, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='fund')
# 全球资产池(纳指ETF、标普500ETF、沪深300ETF、中证500ETF、黄金ETF)
g.assets = [
'513100.XSHG', # 纳指ETF
'513500.XSHG', # 标普500ETF
'510300.XSHG', # 沪深300ETF
'510500.XSHG', # 中证500ETF
'518880.XSHG' # 黄金ETF
]
# 动量与波动率计算周期(20个交易日,约1个月)
g.momentum_window = 20
g.volatility_window = 20
# 每月第一个交易日开盘运行调仓
run_monthly(rebalance, monthday=1, time='9:30')
def rebalance(context):
# 获取历史价格数据
hist = history(g.momentum_window + 1, unit='1d', field='close', security_list=g.assets, df=True)
# 1. 计算动量信号(过去20个交易日的收益率)
returns = (hist.iloc[-1] - hist.iloc[0]) / hist.iloc[0]
# 筛选出动量为正的资产
positive_momentum_assets = returns[returns > 0].index.tolist()
# 记录日志
log.info("当前具备正向动量的资产: %s" % positive_momentum_assets)
# 如果没有资产具备正向动量,则空仓
if not positive_momentum_assets:
log.info("无正向动量资产,清仓避险")
for asset in context.portfolio.positions.keys():
order_target(asset, 0)
return
# 2. 计算波动率倒数权重
# 计算日收益率
daily_returns = hist[positive_momentum_assets].pct_change().dropna()
# 计算日收益率标准差(波动率)
volatility = daily_returns.std()
# 避免分母为0
volatility = volatility.replace(0, 0.0001)
# 计算波动率倒数
inv_vol = 1.0 / volatility
# 归一化权重,使权重之和为1
weights = inv_vol / inv_vol.sum()
log.info("各资产目标配置权重:\n%s" % weights)
# 3. 执行调仓
# 卖出不在目标持仓池中的资产
current_positions = list(context.portfolio.positions.keys())
for asset in current_positions:
if asset not in positive_momentum_assets:
order_target(asset, 0)
log.info("卖出非动量资产: %s" % asset)
# 调整目标资产至指定权重
total_value = context.portfolio.total_value
for asset in positive_momentum_assets:
target_value = total_value * weights[asset]
order_target_value(asset, target_value)
log.info("调整资产 %s 至目标价值: %.2f" % (asset, target_value))
set_option('use_real_price', True) 以确保使用真实价格撮合。