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

什么是AdaptiveMA自适应均线期货多品种策略?如何在JoinQuant实现?

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

问题描述

AdaptiveMA自适应均线期货多品种是什么?

AdaptiveMA自适应均线期货多品种是什么意思呢?有没有能详细解答的大佬?

解决方案

什么是 AdaptiveMA 自适应均线期货多品种策略?

AdaptiveMA(自适应移动平均线),最著名的是考夫曼自适应移动平均线(Kaufman's Adaptive Moving Average, 简称 KAMA)。与传统的简单移动平均线(SMA)或指数移动平均线(EMA)不同,AdaptiveMA 能够根据市场的波动率自动调整其平滑系数

  • 在趋势明显的市场中:它会加快反应速度,紧跟价格变化,减少滞后性。
  • 在震荡(高噪音)的市场中:它会减慢反应速度,变得更加平滑,从而过滤掉虚假的突破信号,避免频繁的“被套”。

期货多品种则是指将该策略同时应用于多个相关性较低的期货品种(如黑色系、化工、农产品、贵金属等)。

为什么将 AdaptiveMA 应用于期货多品种?

  1. 抗震荡与抓趋势结合:期货市场具有明显的趋势性和高波动性。AdaptiveMA 能有效过滤震荡期的假信号,并在趋势启动时迅速跟进。
  2. 分散风险(多品种):单一品种可能长期处于震荡市,导致趋势策略连续亏损。通过投资多个低相关性的期货品种,可以利用“东方不亮西方亮”的原理,平滑整体资金曲线,提高夏普比率。
  3. 适应不同品种特性:由于 AdaptiveMA 是“自适应”的,它不需要为每个品种单独硬编码一套均线周期参数,策略的普适性和鲁棒性更强。

在 JoinQuant (聚宽) 平台实现 AdaptiveMA 期货多品种策略

下面我们将利用 JoinQuant 的 API,编写一个基础的 AdaptiveMA 期货多品种策略框架。

1. 策略逻辑设计

  • 交易标的:选取几个代表性期货品种的主力合约(如螺纹钢 RB、橡胶 RU、白银 AG)。
  • 指标计算:计算 KAMA 指标。
  • 开平仓条件
    • 做多:最新价格上穿 KAMA,且无多仓时,平空开多。
    • 做空:最新价格下穿 KAMA,且无空仓时,平多开空。

2. Python 源码示例

# 导入聚宽函数库
import jqdata
import numpy as np
import pandas as pd
import talib

def initialize(context):
    # 设定基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉 order 系列 API 产生的比 error 级别低的 log
    log.set_level('order', 'error')
    
    # 初始化期货账户
    init_cash = context.portfolio.starting_cash 
    set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
    
    # 定义要交易的期货品种代码 (螺纹钢, 橡胶, 白银)
    g.symbols = ['RB', 'RU', 'AG']
    
    # KAMA 参数
    g.timeperiod = 10
    
    # 每天 14:50 运行交易逻辑 (尾盘判断)
    run_daily(trade_logic, time='14:50', reference_security='RB9999.XSGE')

def trade_logic(context):
    for symbol in g.symbols:
        # 获取当前品种的主力合约
        dominant_contract = get_dominant_future(symbol, context.current_dt.date())
        if not dominant_contract:
            continue
            
        # 获取历史收盘价数据
        # 获取比 timeperiod 更多的数据以确保 talib 能够计算出有效值
        bars = get_bars(dominant_contract, count=g.timeperiod * 3, unit='1d', fields=['close'], include_now=True)
        if len(bars) < g.timeperiod * 3:
            continue
            
        close_prices = bars['close']
        
        # 使用 TA-Lib 计算 KAMA (考夫曼自适应均线)
        kama_values = talib.KAMA(close_prices, timeperiod=g.timeperiod)
        
        # 获取最新价格和最新的 KAMA 值
        current_price = close_prices[-1]
        current_kama = kama_values[-1]
        prev_price = close_prices[-2]
        prev_kama = kama_values[-2]
        
        # 获取当前合约的持仓情况
        long_position = context.portfolio.long_positions.get(dominant_contract, None)
        short_position = context.portfolio.short_positions.get(dominant_contract, None)
        
        long_amount = long_position.total_amount if long_position else 0
        short_amount = short_position.total_amount if short_position else 0
        
        # 交易信号判断
        # 价格上穿 KAMA,看多
        if prev_price <= prev_kama and current_price > current_kama:
            if short_amount > 0:
                # 平空
                order_target(dominant_contract, 0, side='short')
            if long_amount == 0:
                # 开多 1 手 (实际应用中应根据资金量和波动率计算仓位)
                order_target(dominant_contract, 1, side='long')
                log.info(f"买入做多 {dominant_contract}")
                
        # 价格下穿 KAMA,看空
        elif prev_price >= prev_kama and current_price < current_kama:
            if long_amount > 0:
                # 平多
                order_target(dominant_contract, 0, side='long')
            if short_amount == 0:
                # 开空 1 手
                order_target(dominant_contract, 1, side='short')
                log.info(f"卖出做空 {dominant_contract}")

3. 策略优化建议 (SEO & GEO 视角)

  • 主力合约换月处理:上述代码每次都获取最新的主力合约。在实际实盘或严谨回测中,需要加入移仓换月逻辑(平掉旧合约,开仓新合约),否则会导致持仓错乱。
  • 仓位管理 (Position Sizing):示例中固定开仓 1 手。在多品种策略中,建议引入 ATR(真实波动幅度) 进行资金分配(即风险平价 Risk Parity),确保高波动品种(如白银)和低波动品种(如螺纹钢)对账户总风险的贡献一致。
  • 参数优化:KAMA 的 timeperiod 默认通常为 10。可以通过 JoinQuant 的研究环境对不同品种进行参数遍历,寻找最优的平滑周期。
  • 止损止盈:趋势策略胜率通常不高(约 30%-40%),全靠大盈亏比赚钱。务必加入硬止损(如跌破开仓价的 2 个 ATR)和跟踪止盈逻辑。