找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5448

积分

0

好友

752

主题
发表于 1 小时前 | 查看: 3| 回复: 0

免责声明:本文所有内容仅用于交流学习,不构成任何投资建议!投资有风险,入市需谨慎。

策略介绍

AKAM-QQE 动量减速策略

AKAM-QQE 是经典 QQE 指标的优化版本,核心依托 Value1 线刻画市场价格动量强弱变化。动量减速策略只看动量衰竭拐点,而非超买超卖:对比当日 QQE_Value1 数值与5天前数值,若当下数值更低,便判定原有上涨动量持续衰减、多头动能开始放缓。该策略不依赖成交量,不叠加其他因子,仅以 QQE 自身历史数值作纵向对比,捕捉动量由强转弱后的潜在企稳做多机会。信号规则单一固定,无需复杂参数调校,纯靠动量时序变化生成入场信号,逻辑直白、易于量化编码落地。

EMA 过滤策略

EMA 即指数移动平均线,常用 20 日周期作为趋势结构判定工具,是极简的趋势过滤与风控手段。本策略将 20 日 EMA 视作行情趋势生命线,不做拐点预判,也不做震荡过滤,仅执行单一离场规则:持仓阶段每日比对收盘价与 20 日 EMA,一旦收盘价有效跌破均线,即认定原有多头趋势结构彻底破坏,行情由多转弱概率大幅上升。以 EMA 作为唯一离场过滤标准,剔除主观止盈止损,严格跟随趋势结构变化平仓,过滤掉趋势破位后的持仓风险。规则简单刚性,适合搭配动量类信号做风控离场,也适配量化程序化执行。

基于 AKAM-QQE 动量减速 + EMA 过滤的量化交易策略实现

AKAM-QQE 动量减速 + 20 日 EMA 过滤是一套极简型趋势量化策略,仅依托 AKAM-QQE 指标和指数移动平均线两个核心工具,无复杂参数与额外过滤,规则清晰、易落地,适合新手入门量化交易。

AKAM-QQE 是改良型动量震荡指标,核心通过 Value1 线反映资产价格的动量强度,数值波动直观体现趋势动能变化;20 日 EMA 是经典趋势跟踪指标,能平滑价格波动,精准识别趋势的有效支撑位。策略完全遵循单一入场、单一离场规则,剔除所有冗余逻辑,聚焦动量衰竭与趋势结构两大核心交易逻辑。

一、策略核心规则

入场信号: 实时监控 AKAM-QQE 指标的 Value1 线,当当日 Value1 线数值低于5天前的数值时,判定趋势动量进入衰竭阶段,次日开盘价直接做多。该信号的核心逻辑是:动量衰减后往往伴随价格回调后的企稳反弹,捕捉趋势反转前的低位入场机会。

离场信号: 持仓期间,每日计算 20 日 EMA 均线,当当日收盘价跌破 20 日 EMA时,判定原有趋势结构被破坏,趋势延续概率大幅降低,次日开盘价无条件平仓。离场仅以趋势破位为唯一标准,不设置止盈止损,完全跟随趋势生命周期。

二、策略实现步骤

第一步,数据准备:获取标的历史K线数据(开盘价、收盘价),无需成交量、宏观数据,仅保留核心价格数据。

第二步,指标计算:编写代码计算 AKAM-QQE 指标的 Value1 线,同步计算 20 日 EMA(收盘价加权平滑)。

第三步,信号生成:遍历数据,标记 Value1 线低于5日前值的入场点,以及收盘价跌破 20 日 EMA 的离场点。

第四步,回测执行:按信号规则模拟交易,次日开盘执行买卖,统计收益、回撤等核心指标。

第五步,实盘落地:对接交易接口,实时计算指标与信号,自动触发开盘价委托交易。

三、策略优势与注意事项

优势在于极简透明,无参数过度优化,避免过拟合;信号少而精准,降低交易频率与手续费损耗,适配股票、期货等多数品种。

注意事项: 仅适用于震荡转趋势的行情,极端单边下跌行情中,动量衰竭信号可能失效;需严格执行规则,不主观干预交易。

这套策略是量化交易的基础模板,通过两个简单指标的联动,完美诠释“顺势而为、动量优先”的交易核心,是量化入门的优选实战策略。

总结

  • 策略极简: 仅用 AKAM-QQE(Value1 线)、20 日 EMA 两个指标,1 条入场 + 1 条离场规则,无任何额外过滤。
  • 核心逻辑: 动量衰竭(Value1 线下行)入场做多,趋势破位(跌破 20 日 EMA)离场平仓。
  • 落地简单: 数据需求少、代码易编写,回测与实盘均可快速实现,无过拟合风险。

策略实现

以下代码展示了完整的 Python 实现过程,包括 QQE 动量减速计算、EMA 过滤、信号组装以及基于 vectorbt 的回测。

QQE 动量减速计算

QEE计算函数代码截图,使用pandas和numpy计算RSI、平滑RSI、ATR、递推计算QEE Value1与Value2,并判断动量减速

def calculate_qqe(df, rsi_period=QQE_PERIOD, smooth=QQE_SMOOTH, factor=QQE_FA):
    """基于 RSI 平滑类 ATR 计算 QQE 的 Value1 与 Value2 两条线"""
    df = df.copy()
    # --- 第一步:计算 RSI ---
    delta = df['Close'].diff()
    up = delta.clip(lower=0)
    down = -delta.clip(upper=0)
    roll_up = up.ewm(alpha=1/rsi_period, adjust=False).mean()
    roll_down = down.ewm(alpha=1/rsi_period, adjust=False).mean()
    rsi = 100 - (100 / (1 + roll_up / roll_down))
    # --- 第二步:对 RSI 再次平滑 ---
    rsi_ma = rsi.rolling(window=smooth).mean().fillna(method='bfill')
    # --- 第三步:计算 RSI 变化的 ATR 类值 ---
    rsi_delta = rsi_ma.diff().abs().fillna(0)
    atr_rsi = rsi_delta.ewm(alpha=1/smooth, adjust=False).mean()
    # --- 第四步:递推计算 QQE Value2(追踪线)---
    value1 = rsi.copy()
    value2 = pd.Series(index=df.index, dtype=float)
    value2.iloc[0] = value1.iloc[0]
    for i in range(1, len(df)):
        prev_trail = value2.iloc[i-1]
        prev_value1 = value1.iloc[i-1]
        atr = atr_rsi.iloc[i]
        # 根据 Value1 与追踪线的相对位置决定方向
        direction = 1 if prev_value1 > prev_trail else -1
        value2.iloc[i] = prev_trail + direction * factor * atr
    df['QQE_Value1'] = value1
    df['QQE_Value2'] = value2
    return df

def qqe_value1_falling(df, shift=QQE_SHIFT):
    """判断 QQE Value1 是否比 5 天前更低,即动量正在减速"""
    # 计算 qqe_df
    df = calculate_qqe(df)
    return df['QQE_Value1'] < df['QQE_Value1'].shift(shift)

20 日 EMA 趋势过滤

计算EMA并判断收盘价是否跌破EMA的Python函数代码

def calculate_ema(df, period=EMA_PERIOD):
    """计算收盘价的指数移动平均"""
    df = df.copy()
    df['EMA'] = df['Close'].ewm(span=period, adjust=False).mean()
    return df

def close_below_ema(df, period=EMA_PERIOD):
    """判断收盘价是否跌破 EMA"""
    df = calculate_ema(df, period)
    return df['Close'] < df['EMA']

组装入场与离场信号

量化策略逻辑代码,包括入场条件(QQE Value1下降)和离场条件(收盘价跌破EMA)

# ____________
# 入场条件: QQE Value1 正在下降
# ____________
df["QQE_Value1_Falling"] = qqe_value1_falling(df)
entry_conditions = [
    'QQE_Value1_Falling',
]
# 所有条件同时满足才产生入场信号
df['entry_signal'] = df[entry_conditions].all(axis=1)

# ____________
# 离场条件: 收盘价跌破 EMA
# ____________
df["EMA_Close_Below"] = close_below_ema(df)
exit_conditions = [
    'EMA_Close_Below',
]
df['exit_signal'] = df[exit_conditions].all(axis=1)

使用 vectorbt 进行回测

vectorbt回测代码,设置初始资金、手续费、滑点,并打印统计结果和绘图

# ——————————————————————————————————————————————————————
# 用开盘价作为成交价格
# 入场信号
# 离场信号
# ——————————————————————————————————————————————————————
# (具体回测代码此处省略,完整实现可参考社区资源)

回测效果

交易绩效指标表格,包括总收益289%、基准收益-74.5%、最大回撤89%、总交易次数125、胜率37%等数据

从上表可见,该策略在测试区间内取得了 289% 的总收益,而同期买入持有基准为 -74.5%,最大回撤 89%,胜率 37%,盈亏比 1.15。虽然胜率不高,但较高的平均盈利持仓时长和较好的盈亏比体现了趋势跟随的典型特征。


本文策略为量化交易的基础模板,通过两个简单指标的联动,完整呈现了动量衰竭入场与趋势破位离场的逻辑。对于希望深入学习 Python 量化交易的开发者,可以在云栈社区找到更多实战案例与源码。




上一篇:Ollama严重漏洞CVE-2026-7482:远程读取进程内存信息泄露
下一篇:网安售后工程师出路在哪?五大转型方向与核心竞争力解析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-5-13 17:52 , Processed in 0.859241 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表