Momentum:QQE(定量定性估计)技术指标详解

Momentum:QQE(定量定性估计)技术指标详解

一、QQE的定义

QQE(Quantitative Qualitative Estimation,定量定性估计指标) 是一种基于RSI(相对强弱指数)的动量指标,由原始版本经过Roman Ignatov(2006年)、Tim Hyder(2008年)及EarnForex团队(2010年)等多次改进而成,并在MQL4/MQL5交易平台上广泛应用。

核心思想

QQE的设计理念是回答一个关键问题:如何从趋势确认和震荡识别两个角度同时解读市场状态?

传统的RSI虽然能识别超买超卖,但在强趋势中容易钝化。QQE通过引入动态追踪线(Trailing Levels) 的概念,对RSI值进行双重平滑,并以此构建上下轨道。这样一来,QQE既能像传统震荡指标一样判断超买超卖,又能像趋势指标一样通过轨道穿越来确认趋势方向。

QQE与RSI的核心区别

特性 QQE 传统RSI
基础算法 平滑RSI + 波动率追踪线 原始RSI计算
信号维度 趋势+震荡(双维度) 震荡(单维度)
趋势确认方式 价格/SmoothRSI穿越轨道 无法确认趋势
钝化问题 通过动态轨道缓解 强趋势中严重钝化

核心组成部分

组成部分 默认名称 功能描述
SmoothRSI 主线(红色) 经过双重平滑处理的RSI值,是QQE的核心
FastTL(快速追踪线) 快线(黄色) 波动率加权上/下轨,用于捕捉短期趋势变化
SlowTL(慢速追踪线) 慢线(青色) 波动率加权上/下轨,提供更稳定的参考

二、QQE的计算方法

1. 核心公式框架

QQE的计算建立在RSI之上,共包含五个主要步骤:

第一步:计算RSI值

对于默认周期length=14

RSI=100−1001+平均涨幅平均跌幅=100×平均涨幅平均涨幅+平均跌幅 \mathrm{RSI} = 100 − \frac{100}{1 + \frac{平均涨幅}{平均跌幅}} = 100\times \frac{平均涨幅}{平均涨幅+平均跌幅} RSI=100−1+平均跌幅平均涨幅100=100×平均涨幅+平均跌幅平均涨幅

第二步:计算平滑RSI

SmoothRSI=EMA(RSI,smooth) \mathrm{SmoothRSI=EMA(RSI,smooth)} SmoothRSI=EMA(RSI,smooth)

其中smooth是RSI的平滑周期,默认值为5。

第三步:计算波动率(TR of SmoothRSI)

计算平滑RSI的真实波幅(True Range):

TRRSI=∣SmoothRSIt−SmoothRSIt−1∣ \mathrm{TR_{RSI}}=|\mathrm{SmoothRSI}t − \mathrm{SmoothRSI}{t−1}| TRRSI=∣SmoothRSIt−SmoothRSIt−1∣

第四步:双重平滑处理

WildersSmoothing=Wilders(TRRSI,length×2−1)DoubleSmoothing=Wilders(WildersSmoothing,WildersPeriod) \begin{align} \mathrm{WildersSmoothing} &= \mathrm{Wilders(TR_{RSI},length \times 2 − 1)} \\ \mathrm{DoubleSmoothing} &= \mathrm{Wilders(WildersSmoothing,WildersPeriod)} \end{align} WildersSmoothingDoubleSmoothing=Wilders(TRRSI,length×2−1)=Wilders(WildersSmoothing,WildersPeriod)

根据 ProRealCode 的实现,Wilders周期计算方式为:WildersPeriod=RSILength×2−1\mathrm{WildersPeriod = RSILength \times 2−1}WildersPeriod=RSILength×2−1。

最终QQE带宽为:

QQE带宽=DoubleSmoothing×factor \mathrm{QQE带宽 = DoubleSmoothing \times factor} QQE带宽=DoubleSmoothing×factor

其中factor默认值为4.236。

第五步:构建追踪线轨道

追踪线的构建采用递归判断逻辑:

上升趋势规则

UpperBandt=max⁡⁡(SmoothRSIt,UpperBandt−1) \mathrm{UpperBand}_t = \max⁡(\mathrm{SmoothRSI}t, \mathrm{UpperBand}{t−1}) UpperBandt=max⁡(SmoothRSIt,UpperBandt−1)

下降趋势规则

LowerBandt=min⁡⁡(SmoothRSIt,LowerBandt−1) \mathrm{LowerBand}_t = \min⁡(\mathrm{SmoothRSI}t, \mathrm{LowerBand}{t−1}) LowerBandt=min⁡(SmoothRSIt,LowerBandt−1)

text 复制代码
如果 SmoothRSI[t] > 上轨[t-1]:
    上轨[t] = max(SmoothRSI[t], 上轨[t-1])
    趋势向上
否则如果 SmoothRSI[t] < 下轨[t-1]:
    下轨[t] = min(SmoothRSI[t], 下轨[t-1])
    趋势向下
否则:
    上轨[t] = 上轨[t-1]
    下轨[t] = 下轨[t-1]

这一递归逻辑使追踪线具有记忆性------轨道在趋势延续时锁定,在穿越时重置。

2. 参数说明(pandas_ta版本)

参数 类型 默认值 说明
length int 14 RSI计算周期
smooth int 5 平滑RSI的EMA周期
factor float 4.236 波动率乘数(带宽系数)
mamode str "ema" 移动平均类型

3. 其他版本的参数对比

不同交易平台对QQE的参数定义略有差异:

平台 参数配置 说明
pandas_ta length=14, smooth=5, factor=4.236 标准三参数版本
TradeStation RSILength=14, ATRLength=27, FastATRMult=2.618, SlowATRMult=4.236 四参数版本
ProRealCode RSIPeriod=14, SF=5, QQE=4.236 经典三参数

4. 计算示例

以示例数据演示核心计算流程:

已知

  • length = 14,smooth = 5,factor = 4.236
  • 假设前一日SmoothRSI = 52.5
  • 当前SmoothRSI = 55.0
  • 双平滑波动率值 = 0.8

第一步:计算带宽

  • QQE带宽 = 0.8 × 4.236 = 3.3888

第二步:构建轨道

  • 如果趋势向上:UpperBand = max(55.0, 55.0 - 3.3888) = 55.0
  • 如果趋势向下:LowerBand = min(55.0, 55.0 + 3.3888) = 55.0

注意:实际应用中,轨道的维持和更新取决于SmoothRSI与前一周期轨道的比较结果。

三、QQE的使用方法

1. 趋势判断------最核心用法

QQE提供了双层次的趋势确认机制:

方法一:价格确认法(最直观)

趋势信号 触发条件 操作建议
长期看涨 SmoothRSI > 50 且 价格在慢速TL上方运行 顺势做多,持仓为主
长期看跌 SmoothRSI < 50 且 价格在慢速TL下方运行 顺势做空,持仓为主

方法二:轨道穿越法

趋势信号 触发条件 操作建议
买入信号 SmoothRSI从下向上突破上轨(FastTL) 趋势由弱转强,买入进场
卖出信号 SmoothRSI从上向下跌破下轨(SlowTL) 趋势由强转弱,卖出离场

当SmoothRSI有效突破上轨时,表明市场动量强劲,多单可继续持有;反之跌破下轨时,空头占据主导。

2. 轨道交叉策略

QQE MOD版本的动态轨道交叉是较灵敏的信号:

交叉类型 触发条件 含义
多头排列 FastTL > SlowTL(快线在慢线上方) 短期动量强于长期,市场强势
空头排列 FastTL < SlowTL(快线在慢线下方) 短期动量弱于长期,市场疲软

与传统QQE相比,QQE MOD增加了动态滤波技术,对高波动市场适应性更强,能有效降低假信号。

3. 超买超卖识别

尽管QQE偏向趋势判断,但它仍保留了RSI在超买超卖识别上的优势:

状态 SmoothRSI区间 操作建议
超买 SmoothRSI > 70 警惕回调,短期勿追高
超卖 SmoothRSI < 30 关注反弹,短期勿杀跌

核心提示:与传统RSI不同,QQE的追踪线可以在强趋势中帮助交易者区分"真正的趋势延续"和"超买钝化"。

4. 背离信号

背离类型 价格表现 QQE(SmoothRSI)表现 操作含义
顶背离 价格创出新高 SmoothRSI未能创出新高 上涨动能衰竭,减仓或止盈
底背离 价格创出新低 SmoothRSI未能创出新低 下跌动能衰竭,准备抄底

5. 与其他指标的配合策略

配合指标 作用 具体用法
ADX 趋势强度确认 ADX > 25 + QQE显示趋势 → 加仓信号
移动平均线 价格位置确认 价格 > MA50 + SmoothRSI > 50 → 多头确认
成交量 突破验证 QQE突破 + 成交量放大 → 突破真实可信

6. 注意事项与局限性

使用QQE前需了解以下要点

局限性 说明
并非买卖信号发生器 QQE更适合判断趋势状态,买卖时机需结合K线形态等确认
强趋势中可能钝化 在极强趋势中,SmoothRSI可能长期处于极值区
参数敏感度高 factor值(默认4.236)是黄金分割率的衍生,除非有特殊需求,否则不建议随意修改
不同平台实现差异 TradeStation版本有FastTL和SlowTL两条线,而pandas_ta版本在边界处理上可能存在差异

四、使用pandas_ta计算QQE(附示例代码)

1. pandas_ta中的QQE函数

pandas_ta库内置了QQE指标的完整实现,函数位于momentum模块中。

2. 函数完整参数

python 复制代码
pandas_ta.momentum.qqe(close, length=None, smooth=None, factor=None, mamode=None, drift=None, offset=None, **kwargs)

参数详解

参数 类型 默认值 说明
close pd.Series 必需 收盘价序列
length int 14 RSI计算周期
smooth int 5 平滑RSI的EMA周期
factor float 4.236 QQE乘数(波动率权重)
mamode str "ema" 移动平均类型
drift int 1 价格变化步长
offset int 0 结果偏移周期数

返回值pd.DataFrame------包含四列:

  • QQE_{length}_{smooth}_{factor}:主轨道值
  • RSI_MA_{length}_{smooth}_{factor}:平滑RSI(等同于SmoothRSI)
  • QQEl_{length}_{smooth}_{factor}:下轨(Long信号线)
  • QQEs_{length}_{smooth}_{factor}:上轨(Short信号线)

3. 示例代码

python 复制代码
import pandas as pd
import pandas_ta as ta
import numpy as np
import matplotlib.pyplot as plt

# ========== 第一步:准备数据 ==========
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', end='2024-12-31', freq='D')
n = len(dates)

# 生成带趋势和周期波动的价格序列
trend = np.linspace(0, 30, n)
cycle = np.sin(np.linspace(0, 6 * np.pi, n)) * 12
noise = np.random.randn(n) * 2
price_series = 100 + trend + cycle + noise

df = pd.DataFrame(index=dates)
df['close'] = price_series
df['high'] = df['close'] + np.abs(np.random.randn(n)) * 2
df['low'] = df['close'] - np.abs(np.random.randn(n)) * 2
df['volume'] = np.random.randint(1000000, 20000000, n)

print("=" * 60)
print("数据预览:")
print(df.head())
print("\n" + "=" * 60 + "\n")

# ========== 第二步:计算QQE(基础用法) ==========
# 使用默认参数 length=14, smooth=5, factor=4.236
qqe_df = ta.qqe(df['close'])

# 查看返回的DataFrame结构
print("QQE返回列名称:")
print(qqe_df.columns.tolist())
print("\n" + "=" * 60 + "\n")

# 将计算结果添加到原DataFrame
df['QQE'] = qqe_df.iloc[:, 0]           # 主轨道值
df['SmoothRSI'] = qqe_df.iloc[:, 1]     # 平滑RSI
df['QQEl'] = qqe_df.iloc[:, 2]          # 下轨
df['QQEs'] = qqe_df.iloc[:, 3]          # 上轨

print("QQE计算结果(最近10行):")
print(df[['close', 'SmoothRSI', 'QQE', 'QQEs', 'QQEl']].tail(10))
print("\n" + "=" * 60 + "\n")

# ========== 第三步:QQE指标概览 ==========
print("QQE统计信息:")
print(f"SmoothRSI范围:[{df['SmoothRSI'].min():.2f}, {df['SmoothRSI'].max():.2f}]")
print(f"当前QQE:{df['QQE'].iloc[-1]:.2f}")

# ========== 第四步:趋势判断信号 ==========
# 50线多空分界(传统RSI逻辑)
df['bullish'] = (df['SmoothRSI'] > 50) & (df['close'] > df['close'].rolling(50).mean())
df['bearish'] = (df['SmoothRSI'] < 50) & (df['close'] < df['close'].rolling(50).mean())

# 轨道穿越信号(QQE特有)
df['signal'] = ''
df.loc[df['SmoothRSI'] > df['QQEs'], 'signal'] = 'SmoothRSI突破上轨(多)'
df.loc[df['SmoothRSI'] < df['QQEl'], 'signal'] = 'SmoothRSI跌破下轨(空)'
df.loc[(df['SmoothRSI'].shift(1) < df['QQEs'].shift(1)) & (df['SmoothRSI'] > df['QQEs']), 'signal'] = '金叉(买入信号)'
df.loc[(df['SmoothRSI'].shift(1) > df['QQEl'].shift(1)) & (df['SmoothRSI'] < df['QQEl']), 'signal'] = '死叉(卖出信号)'

print("趋势信号统计:")
print(f"多头趋势交易日占比:{df['bullish'].mean():.2%}")
print(f"空头趋势交易日占比:{df['bearish'].mean():.2%}")

print("\n最近10个轨道穿越信号:")
signals = df[df['signal'] != ''].tail(10)
if not signals.empty:
    print(signals[['close', 'SmoothRSI', 'QQEs', 'QQEl', 'signal']])
print("\n" + "=" * 60 + "\n")

# ========== 第五步:超买超卖识别 ==========
OVERBOUGHT = 70
OVERSOLD = 30

df['oscillator_signal'] = ''
df.loc[df['SmoothRSI'] > OVERBOUGHT, 'oscillator_signal'] = '超买区(警惕回调)'
df.loc[df['SmoothRSI'] < OVERSOLD, 'oscillator_signal'] = '超卖区(关注反弹)'

print("超买超卖状态统计:")
print(f"超买状态占比:{(df['SmoothRSI'] > 70).mean():.2%}")
print(f"超卖状态占比:{(df['SmoothRSI'] < 30).mean():.2%}")
print("\n" + "=" * 60 + "\n")

# ========== 第六步:背离检测(简化版) ==========
df['price_change_20d'] = df['close'].diff(20)
df['rsi_change_20d'] = df['SmoothRSI'].diff(20)

# 潜在顶背离(价格涨RSI跌)
df['potential_bearish_div'] = (df['price_change_20d'] > 0) & (df['rsi_change_20d'] < 0)
# 潜在底背离(价格跌RSI涨)
df['potential_bullish_div'] = (df['price_change_20d'] < 0) & (df['rsi_change_20d'] > 0)

print("背离信号统计(20日尺度):")
print(f"潜在顶背离数量:{df['potential_bearish_div'].sum()}")
print(f"潜在底背离数量:{df['potential_bullish_div'].sum()}")
print("注:完整背离需结合局部极值分析,此处为简化方向对比")
print("\n" + "=" * 60 + "\n")

# ========== 第七步:策略回测(轨道穿越策略) ==========
# 策略:SmoothRSI > 上轨时持仓多头
df['position'] = (df['SmoothRSI'] > df['QQEs']).astype(int)

# 计算收益
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']

total_return_buyhold = (1 + df['returns']).prod() - 1
total_return_strategy = (1 + df['strategy_returns']).prod() - 1
win_rate = (df['strategy_returns'] > 0).sum() / (df['strategy_returns'] != 0).sum() if (df['strategy_returns'] != 0).sum() > 0 else 0

print("=" * 60)
print("策略绩效统计(QQE轨道穿越策略回测):")
print(f"买入持有策略总收益率:{total_return_buyhold:.2%}")
print(f"QQE穿越策略总收益率:{total_return_strategy:.2%}")
print(f"策略胜率:{win_rate:.2%}")
print("\n注意:此为简化回测,仅供参考")
print("=" * 60 + "\n")

# ========== 第八步:可视化 ==========
plt.figure(figsize=(14, 12))

# 子图1:价格走势
plt.subplot(2, 1, 1)
plt.plot(df.index[-150:], df['close'][-150:], label='Close Price', 
         linewidth=1.5, color='black')
plt.title('Price Chart (Last 150 days)', fontsize=14)
plt.ylabel('Price')
plt.legend()
plt.grid(True, alpha=0.3)

# 子图2:QQE指标
plt.subplot(2, 1, 2)
plt.plot(df.index[-150:], df['SmoothRSI'][-150:], label='SmoothRSI(主线)', 
         linewidth=1.5, color='blue')
plt.plot(df.index[-150:], df['QQEs'][-150:], label='QQEs(上轨)', 
         linewidth=1, color='red', linestyle='--')
plt.plot(df.index[-150:], df['QQEl'][-150:], label='QQEl(下轨)', 
         linewidth=1, color='green', linestyle='--')
plt.plot(df.index[-150:], df['QQE'][-150:], label='QQE(中线)', 
         linewidth=1, color='purple', alpha=0.5)

# 参考水平线
plt.axhline(y=70, color='orange', linestyle=':', linewidth=1, label='超买线 (70)')
plt.axhline(y=50, color='gray', linestyle=':', linewidth=1, label='中轴 (50)')
plt.axhline(y=30, color='green', linestyle=':', linewidth=1, label='超卖线 (30)')

# 填充超买超卖区域
plt.fill_between(df.index[-150:], 70, 100, alpha=0.1, color='red', label='超买区')
plt.fill_between(df.index[-150:], 0, 30, alpha=0.1, color='green', label='超卖区')

# 标记穿越信号
buy_signals = df[(df['SmoothRSI'].shift(1) < df['QQEs'].shift(1)) & (df['SmoothRSI'] > df['QQEs'])]
sell_signals = df[(df['SmoothRSI'].shift(1) > df['QQEl'].shift(1)) & (df['SmoothRSI'] < df['QQEl'])]
plt.scatter(buy_signals.index[-20:], buy_signals['SmoothRSI'][-20:], 
            color='green', marker='^', s=80, label='买入信号', alpha=0.8)
plt.scatter(sell_signals.index[-20:], sell_signals['SmoothRSI'][-20:], 
            color='red', marker='v', s=80, label='卖出信号', alpha=0.8)

plt.title('QQE (Quantitative Qualitative Estimation) 指标', fontsize=14)
plt.xlabel('Date')
plt.ylabel('QQE Value')
plt.ylim(0, 100)
plt.legend(loc='upper left')
plt.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# ========== 第九步:数据清洗提示 ==========
nan_count = df['SmoothRSI'].isna().sum()
print(f"\nQQE初始NaN数量:{nan_count}")
print("原因:QQE需要至少length个周期的数据才能开始计算")
print("处理建议:df_clean = df.iloc[14:].copy()")
print("\n" + "=" * 60)
print("QQE使用提示:")
print("1. QQEs > QQEl 表示多头占优,反之空头占优")
print("2. SmoothRSI > 50 且 > QQEs 可视为强多头信号")
print("3. QQE的factor参数(默认4.236)一般不建议修改")
print("4. 在超强趋势中,轨道失效时建议改用ADX辅助判断")
print("=" * 60)

五、总结

QQE(定量定性估计指标)是一种融合RSI动量与动态趋势追踪功能的综合技术指标,其核心价值与定位如下:

维度 特点
核心创新 将RSI震荡逻辑与ATR波动率追踪结合,实现双维市场分析
计算链条 RSI → 平滑RSI → 波动率 → 双重平滑 → 动态轨道
四线结构 SmoothRSI + QQE主轨 + QQEs上轨 + QQEl下轨
三大核心信号 轨道穿越(趋势)、50线多空分界(方向)、极值区域(震荡)
默认参数 (14, 5, 4.236)
最佳应用场景 趋势策略的方向确认、动量策略的轨道突破验证
主要局限 强趋势中可能钝化、参数敏感、需要K线形态配合进场

实战使用三原则

  1. 轨道优先于极值:QQE的轨道(QQEs/QQEl)比传统70/30超买超卖线更适合趋势行情,轨道穿越应作为趋势确认的核心信号。
  2. 50线决定方向:与RSI一样,50线是多空分界线。SmoothRSI在50线之上时优先考虑做多策略,之下时考虑做空策略。
  3. SmoothRSI轨道突破 = 动能确认:当SmoothRSI有效突破上轨(QQEs)时,表明市场进入强势状态;跌破下轨(QQEl)时表明进入弱势状态。

最后提醒:QQE的设计初衷是帮助交易者同时看到市场的"方向(定性)"和"动量强度(定量)"。它的最大价值在于------当价格处于强趋势时,QQE的追踪线能帮助交易者坚定持仓信心,避免被RSI的短暂钝化干扰。然而,任何指标都有局限性:QQE在强单边趋势中表现优异,但在剧烈震荡市场可能会产生轨道频繁穿越的假信号。建议将其与ADX、成交量以及K线形态结合使用,构成更完善的交易体系。

相关推荐
Dontla1 小时前
聚类找不到簇原因分析(聚类失败)(DBSCAN聚类算法、eps参数、Epsilon参数、最大允许距离)
算法·数据挖掘·聚类
写代码写到手抽筋9 小时前
5G上行DCI字段判定:端口 流数 PMI选择详解
java·算法·5g
xieliyu.9 小时前
Java算法精讲:双指针(二)
java·开发语言·算法
wayz1110 小时前
Momentum:PSL(心理线指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
8Qi811 小时前
LeetCode 213:打家劫舍 II(House Robber II)—— 题解 ✅
算法·leetcode·职场和发展·动态规划
三品吉他手会点灯11 小时前
C语言学习笔记 - 44.运算符和表达式 - 运算符2 - 除法与取余运算符
c语言·开发语言·笔记·算法
乐迪信息11 小时前
乐迪信息:AI算法盒子实时识别船舶烟雾与火焰异常
大数据·人工智能·算法·安全·目标跟踪
J-Tony1111 小时前
【JVM】根可达算法
jvm·算法
艾iYYY11 小时前
string 类的模拟实现
android·服务器·c语言·c++·算法