问题描述
AdaptiveMA自适应均线期货多品种是什么意思呢?有没有能详细解答的大佬?
解决方案
什么是 AdaptiveMA 自适应均线期货多品种策略?
AdaptiveMA(自适应移动平均线),最著名的是考夫曼自适应移动平均线(Kaufman's Adaptive Moving Average, 简称 KAMA)。与传统的简单移动平均线(SMA)或指数移动平均线(EMA)不同,AdaptiveMA 能够根据市场的波动率自动调整其平滑系数。
- 在趋势明显的市场中:它会加快反应速度,紧跟价格变化,减少滞后性。
- 在震荡(高噪音)的市场中:它会减慢反应速度,变得更加平滑,从而过滤掉虚假的突破信号,避免频繁的“被套”。
期货多品种则是指将该策略同时应用于多个相关性较低的期货品种(如黑色系、化工、农产品、贵金属等)。
为什么将 AdaptiveMA 应用于期货多品种?
- 抗震荡与抓趋势结合:期货市场具有明显的趋势性和高波动性。AdaptiveMA 能有效过滤震荡期的假信号,并在趋势启动时迅速跟进。
- 分散风险(多品种):单一品种可能长期处于震荡市,导致趋势策略连续亏损。通过投资多个低相关性的期货品种,可以利用“东方不亮西方亮”的原理,平滑整体资金曲线,提高夏普比率。
- 适应不同品种特性:由于 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)和跟踪止盈逻辑。