当前位置:首页>python>当动量熄火时 这个 Python 策略在 AKAM 上跑出高收益

当动量熄火时 这个 Python 策略在 AKAM 上跑出高收益

  • 2026-10-11 08:07:45
当动量熄火时 这个 Python 策略在 AKAM 上跑出高收益

用 Python 揭秘均值回归策略:你的收益从何而来?

2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 350 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!

引言

你有没有想过,一只从 321 美元跌到不足 10 美元的股票,还能不能赚钱?

今天给大家拆解一个来自 Kryptera 的有趣量化策略 —— AKAM-QQE 动量减速 + EMA 过滤策略。它的核心理念非常反直觉:不追涨,不杀跌,而是在动量开始"打瞌睡"的时候进场。

在 Akamai Technologies(AKAM)这只股票上,2000 年至 2025 年的 25 年回测中,买入并持有的投资者亏损了 75%,而这个策略却把 10 万美元变成了 38.9 万美元,总收益 289%。

下面我们用 Python 一步步还原它的实现逻辑。


一、策略核心思想

整个策略只建立在两个简单的想法上:

  1. 1. 入场信号:当 QQE 指标的 Value1 线低于 5 天前的值时,说明动量正在衰竭,次日开盘做多。
  2. 2. 离场信号:当收盘价跌破 20 日 EMA 时,说明趋势结构已破坏,次日开盘平仓。

没有成交量过滤,没有宏观叠加,没有机器学习。只有 2 个指标,1 条入场规则,1 条离场规则。


二、环境准备与数据下载

我们使用 yfinance 下载 AKAM 从 2000 年到 2026 年的日线数据,使用 vectorbt 做向量化回测。

import pandas as pd
import
 numpy as np
import
 yfinance as yf
import
 vectorbt as vbt

# -------------------------

# 下载 AKAM 股票历史数据

# -------------------------

symbol = "AKAM"                # 股票代码:Akamai Technologies
start_date = "2000-01-01"      # 回测起始日期
end_date = "2026-01-01"        # 回测结束日期
interval = "1d"                # 日线级别

# 从 Yahoo Finance 下载数据并保存到本地 CSV

df = yf.download(symbol, start=start_date, end=end_date, interval=interval)
df.to_csv("AKAM_clean.csv", index=False)

三、核心指标一:QQE 动量减速

QQE(Quantitative Qualitative Estimation,定量定性估计)指标是基于 RSI 平滑和 ATR 类计算的动量衰减工具。

# QQE 参数设置
QQE_FACTOR = 4.236    # ATR 倍数,控制追踪线的敏感度
QQE_PERIOD = 14       # RSI 计算周期
QQE_SHIFT = 5         # 与 5 天前比较,判断动量方向
QQE_SMOOTH = 5        # RSI 平滑窗口

def
 calculate_qqe(df, rsi_period=QQE_PERIOD, smooth=QQE_SMOOTH, factor=QQE_FACTOR):
    """
    基于 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 再次平滑 ---

    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_ma.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 天前更低,即动量正在减速"""

    df = calculate_qqe(df)
    return
 df['QQE_Value1'] < df['QQE_Value1'].shift(shift)

通俗理解:RSI 告诉你市场是超买还是超卖,QQE 则是在 RSI 基础上再"降噪",让信号更稳健。当 QQE Value1 比 5 天前还低时,说明市场正在"喘气"。


四、核心指标二:20 日 EMA 趋势过滤

EMA(Exponential Moving Average,指数移动平均线)是最经典的趋势指标之一。这里我们用它作为离场依据。

EMA_PERIOD = 20   # 20 日 EMA,短期趋势判断

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 正在下降

# -------------------------

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 进行回测

为了避免未来函数(look-ahead bias),我们把信号向后平移 1 天,用次日开盘价成交。

# -------------------------
# 信号平移 1 天,避免未来函数

# -------------------------

shift_entries = df['entry_signal'].shift(1).astype(bool).fillna(False).to_numpy()
shift_exits = df['exit_signal'].shift(1).astype(bool).fillna(False).to_numpy()

# -------------------------

# 使用 vectorbt 构建回测组合

# -------------------------

pf = vbt.Portfolio.from_signals(
    close=df['Open'],          # 用开盘价作为成交价格
    entries=shift_entries,     # 入场信号
    exits=shift_exits,         # 离场信号
    init_cash=100_000,         # 初始资金 10 万美元
    fees=0.001,                # 手续费 0.1%
    slippage=0.002,            # 滑点 0.2%
    freq='1d'
)

# 打印回测统计结果并绘图

print
(pf.stats())
pf.plot().show()

七、回测结果解读

策略表现(2000-01-03 至 2025-12-31):

指标
数值
总收益
289%
基准(买入持有)
-74.5%
最大回撤
89%
总交易次数
125
胜率
37%
盈亏比(Profit Factor)
1.15
最佳单笔交易
+244%
最差单笔交易
-49%
平均盈利持仓时长
47 天
平均亏损持仓时长
14 天

案例分析:

同样是 AKAM 这只股票,被动持有者从 2000 年股价 321 美元一路看着它跌到个位数,账户几乎归零;而该策略却在 2000 ~ 2004 年捕获了两次超过 127% 和 244% 的交易,正是这些暴跌期的"死猫跳"成就了策略的护城河。


八、策略的本质与风险

这个策略不是高频系统,也不是追势交易,它更像一个"疲劳检测器":当买盘压力(通过平滑 RSI 衡量)开始放缓时进场等待,当价格跌破 EMA 确认趋势结束时离场。

核心盈利逻辑:

  • • 胜率只有 37%,亏钱比赚钱次数多
  • • 但平均盈利持仓 47 天,平均亏损只持仓 14 天
  • • 亏损快切,盈利放飞 —— 这就是赚钱的引擎

诚实的风险提示:

  1. 1. 37% 胜率 + 1.15 盈亏比是一个非常薄的边界
  2. 2. 大部分收益集中在 2000 ~ 2004 年的互联网泡沫崩盘期
  3. 3. 换一只没有经历过剧烈崩盘的股票,结果可能完全不同
  4. 4. 89% 的最大回撤主要发生在早期低价区间,近年波动已收敛

总结

这篇文章展示了一个有意思的事实:简单的策略不代表平庸的结果。只用 2 个指标(QQE 和 EMA),就可以在 25 年尺度上跑赢买入持有 360 多个百分点。

但更重要的启示是:

  1. 1. 量化策略的边界往往非常窄,真正的 alpha 来自于坚持执行规则的纪律。
  2. 2. 回测好看 ≠ 实盘赚钱,仅 26 年的历史数据不足以证明策略能在未来市场存活,还需要进一步做稳健性测试(如 walk-forward 优化)。
  3. 3. 非对称回报是系统化交易的核心:赢的次数少,但赢的时候赚得足够多。

对于 Python 量化学习者来说,这个案例是一个很好的入门模板 —— 数据下载用 yfinance,指标计算用 pandas,回测框架用 vectorbt,代码量不超过 100 行。

建议动手复现一遍,然后换几只不同行业的股票(如 AAPL、TSLA、KO)跑一跑,你会发现同一个策略在不同标的上的表现可能天差地别 —— 这正是量化交易的迷人之处。


参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:

  1. 1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架;
  2. 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程;
  3. 3. 量化文章专题教程库:300+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考;
  4. 4. 量化投研实战课程:赠送《AKQuant-入门及实战》《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能;
  5. 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础;
  6. 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;
    专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题;
  7. 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。

星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

最新文章

随机文章