← 返回博客列表

【Python量化实战全攻略 #13】动量反转因子手册:过去N日收益怎么算(附代码)

2026年10月16日 08:39 · 智兔数服 · Python量化实战全攻略

摘要:【Python量化实战全攻略 #13】动量反转因子手册:过去N日收益怎么算(附代码) 手册定位:模块二第 5 篇。动量(追涨)与反转(抄底)是技术面因子主力——核心是「过去 N 日收益率」。本篇讲怎么从历史K线算出来

手册定位:模块二第 5 篇。动量(追涨)与反转(抄底)是技术面因子主力——核心是「过去 N 日收益率」。本篇讲怎么从历史K线算出来,并区分动量与反转视角。
数据来源复用 #02 历史K线(日线 close 序列)。

1. 你将得到什么

  • 从日线 close 算过去 N 日收益率(动量因子)的代码;
  • 用短期反转(近 5 日收益取反)构建反转因子的写法;
  • 多股票横截面排名打分;
  • 动量/反转因子的 4 个坑(停牌缺口、复权、N 选择、换手率)。

2. 取数约定(复用)

因子 计算 来源端点 见
N日动量 close_t / close_{t-N} − 1 日线 /hs/history/{代码}.{市场}/d/N #02
短期反转 −近5日收益 同上 #02

3. 数据来源(复用,不重复罗列)

详见 #02 历史K线接口手册(日线端点 /hs/history/{代码}.{市场}/d/n)。

4. 核心模板函数(自包含可跑)

import pandas as pd

_MOCK = True


def n_day_return(close, n=20):
    if len(close) <= n:
        return None
    return close.iloc[-1] / close.iloc[-1 - n] - 1


def momentum_frame(prices, n=20, reversal_short=5):
    rows = []
    for code, cl in prices.items():
        s = pd.Series(cl)
        mom = n_day_return(s, n)
        rev = -n_day_return(s, reversal_short) if len(cl) > reversal_short else None
        rows.append({"代码": code, "动量_%d" % n: mom, "反转_%d" % reversal_short: rev})
    return pd.DataFrame(rows)


def run_check():
    prices = {
        "600519": [10, 10.2, 10.5, 11.0, 11.3, 12.0, 12.5],
        "000001": [10, 9.8, 9.5, 9.2, 9.0, 8.8, 8.5],
    }
    mf = momentum_frame(prices, n=5, reversal_short=3)
    assert mf["动量_5"].iloc[0] > 0 and mf["动量_5"].iloc[1] < 0
    mf["动量_s"] = mf["动量_5"].rank(pct=True)
    print("校验通过 | 动量:", mf["动量_5"].round(3).tolist())
    return mf


if __name__ == "__main__":
    run_check()

5. 跑通示例

mf = run_check()
print("动量前1:", mf.sort_values("动量_5", ascending=False).head(1)[["代码", "动量_5"]].to_dict("records"))

6. 坑与注意事项

  1. 停牌缺口:长期停牌后复牌,N 日收益会混入停工期,要剔除或对齐交易日历。
  2. 复权:必须用前复权 close 算收益,不复权会因分红跳空失真。
  3. N 的选择:20 日偏中期、5 日偏短期,不同 N 对应不同风格。
  4. 换手率:纯动量策略换手极高,实盘要加换手约束或用短期反转降低摩擦。

7. 小结与下一篇预告

技术面动量/反转因子就位,与基本面四维合成「五维」。下一篇讲多因子打分与排序——把上面所有因子用 Zscore/分位标准化合成总分。

下一篇预告:《【Python量化实战全攻略 #14】多因子打分与排序手册:Zscore、分位标准化(附代码)》

8. 免责声明

本文为因子构建方法示例,演示数据为虚构,不构成投资建议。


关于数据来源:本文动量/反转因子所需的日线数据来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #02),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲多因子打分。

想亲自试一下?免费获取证书