🚀 AI 一键生成 joinquant 策略代码
立即体验

聚宽平台如何结合风险平价(波动率倒数)与动量信号动态配置全球 ETF 权重?

joinquant | 发布时间: 2026/8/11
以下内容由 EasyQuant 生成。

问题描述

聚宽全球动量配置:如何结合风险平价和动量调整 ETF 权重?
如何在聚宽中对纳指、标普、沪深 300、中证 500 和黄金 ETF 按波动率倒数分配权重,并用动量信号动态调仓?

解决方案

策略核心逻辑

本策略结合了动量效应(Momentum)风险平价(Risk Parity,此处采用波动率倒数简化模型),旨在实现全球多资产的稳健配置。具体逻辑如下:

  1. 资产池构建:选取代表全球不同权益市场及避险资产的 5 只 ETF:
    • 纳指 ETF(513100.XSHG)
    • 标普 500 ETF(513500.XSHG)
    • 沪深 300 ETF(510300.XSHG)
    • 中证 500 ETF(510500.XSHG)
    • 黄金 ETF(518880.XSHG)
  2. 动量信号过滤:计算各资产过去 20 个交易日的收益率。若收益率大于 0,则判定该资产具备正向动量,纳入可买入池;若收益率小于等于 0,则不予配置。
  3. 风险平价权重分配(波动率倒数):对通过动量过滤的资产,计算其过去 20 个交易日的日收益率标准差(波动率)。资产的配置权重与其波动率成反比(即波动率倒数法),以此降低高波动资产的风险敞口,使各资产对组合的风险贡献相对均衡。
  4. 动态调仓:采用按月调仓机制(每月第一个交易日),避免频繁交易产生的摩擦成本。

聚宽 Python 策略源码

请在聚宽回测环境中运行以下完整代码:

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))

策略优势与风险提示

  1. 多资产分散化:通过跨国别(美股、A股)和跨资产类别(股票、黄金)的配置,天然降低了单一市场系统性崩溃的风险。
  2. 风险平价(波动率倒数)的妙用:黄金和美股 ETF 的波动率通常与 A 股股指 ETF 不同。通过波动率倒数分配权重,可以自动给低波动的黄金或标普 500 分配更高权重,给高波动的纳指或中证 500 分配较低权重,使组合整体波动更加平稳。
  3. 动量过滤避险:在熊市或单边下跌行情中,动量信号(收益率 < 0)会及时将该资产剔除出买入池,甚至在极端全市场下跌时实现全仓现金避险。
  4. 风险提示:在多资产频繁震荡、无明显趋势的“猴市”中,动量信号可能出现反复磨损(追高杀跌);此外,跨境 ETF 存在折溢价风险,回测时建议开启 set_option('use_real_price', True) 以确保使用真实价格撮合。