Skip to content

12.2 时间序列进阶:平稳性、滞后特征、滚动窗口

课前导读

本节目标

你将学会:用时间序列思维检查 A 股数据,理解平稳性、滞后特征和滚动窗口为什么能减少“偷看未来”。

适合对象:已经能用 pandas 处理日线数据,并做过因子、回测和实盘差异分析的读者。

难度:advanced

预计用时:约 40 分钟

时间序列就是按时间排队的数据。

你之前已经接触过日线、分钟线、收益率、rolling 和 shift。

这一节不再把它们当作代码技巧,而是把它们放进金融市场的真实问题里。

A 股数据最大特点之一是“会变脸”。

同一个指标,在牛市、熊市、震荡市、政策密集期、流动性收缩期,含义可能完全不同。

因此,时间序列进阶不是为了让预测更神秘。

它是为了确保你的验证尊重时间顺序,尊重市场环境变化,尊重数据当时是否可见。


知识正文

1. 类比:股票数据像天气,不像尺子

一把尺子的刻度今天是一厘米,明天还是一厘米。

但天气不同。

同样 25 度,春天让人觉得暖,夏天可能觉得凉。

股票数据更像天气。

同样 5% 的涨幅,在冷清熊市里可能代表强烈资金关注。

在全面牛市里,可能只是普通波动。

同样 2 倍成交量,在小盘题材股上可能意味着情绪爆发。

在银行股上可能只是指数调仓或大资金换手。

这就是时间序列研究要处理的核心:数据的含义会随时间和环境变化。

关键直觉

时间序列不是一堆可以随便打乱的样本。顺序本身就是信息,也是约束。

2. 术语一:平稳性

平稳性可以先理解为“数据的脾气是否稳定”。

如果一段序列的平均水平、波动范围和相关结构大致稳定,我们说它更接近平稳。

如果它一路抬升、波动越来越大、规律不断改变,就更不平稳。

股价本身通常不平稳。

贵州茅台从几十元到上千元的长期价格序列,平均水平一直在变。

直接拿价格做统计,很容易得到看似强烈但没有实际意义的关系。

收益率通常比价格更接近平稳。

因为收益率关注的是比例变化,而不是价格绝对水平。

这也是量化研究常用收益率而不是直接用价格的原因。

一个简单转换是:

=

这不是为了炫技,而是为了把不同价位股票放到更可比的尺度上。

3. 非平稳:金融数据会换剧本

非平稳意味着过去关系可能不再适用。

A 股中常见的剧本变化包括:

变化类型例子对研究的影响
市场阶段变化牛市、熊市、震荡市切换动量、反转、低估值因子表现不同
制度变化注册制、涨跌幅规则、退市常态化历史样本口径前后不可完全等同
流动性变化成交额放大或萎缩同样换手率含义改变
行业景气变化新能源、地产、医药周期变化行业因子阶段性主导收益
数据口径变化指数成分、财务口径、复权处理调整回测结果需要重新标注版本

因此,时间序列研究不能只看全样本平均。

它要看分时期、分市场环境、滚动表现。

常见误区

把 2019-2021 年某个风格的有效性,直接外推到所有年份,是典型的时间序列误读。

4. 术语二:滞后特征

滞后特征就是只使用过去已经发生、已经可见的信息。

它像开车看后视镜。

你不能用前方 500 米已经发生但此刻还看不到的事故,来解释你现在的操作。

在 pandas 中,shift 经常用来处理这个问题。

例如,今天收盘后才能知道今天的收盘价。

如果你的策略假设在今天收盘前买入,就不能直接使用今天收盘价计算出的信号。

更谨慎的做法是:

  • 今天收盘后生成信号。
  • 下一个交易日按可执行规则观察成交。
  • 标签可以看未来收益,但特征不能偷看未来。
python
# close 已按交易日升序排列
# feature_ma20_lag1 表示昨天收盘时已经知道的 20 日均线

df["ma20"] = df["close"].rolling(20).mean()
df["feature_ma20_lag1"] = df["ma20"].shift(1)
df["label_next_5d"] = df["close"].shift(-5) / df["close"] - 1

这里 label_next_5d 是研究用答案。

它可以存在于训练表里,但不能作为特征输入。

如果把未来 5 日收益误放进特征,就等于考试时偷看答案。

5. 术语三:自相关

自相关描述的是一个序列与它自己的过去是否有关。

例如,今天涨了,明天更容易继续涨,还是更容易回落?

如果短期收益有正自相关,可能支持动量观察。

如果短期收益有负自相关,可能支持反转观察。

但 A 股的自相关并不稳定。

涨停制度、情绪板块、节假日前后、指数大跌后的修复,都可能让短期关系临时改变。

所以自相关不是“明天必涨”的证明。

它只是提醒你:时间顺序里可能有可研究的信息。

6. 术语四:滚动窗口

滚动窗口就是让一把尺子沿着时间往前移动。

20 日均线是一个滚动窗口。

过去 60 日波动率也是滚动窗口。

滚动窗口的意义是:你只用最近一段历史估计当前状态。

这比拿十年平均值更灵活。

但窗口太短会很吵。

窗口太长会反应太慢。

窗口长度优点风险
5 日反应快噪声大,容易被单日冲击带偏
20 日接近一个交易月,常用于短中期观察对突发行情仍可能迟钝
60 日更平滑,适合季度级观察变化出现后确认较慢
250 日接近一年,适合长期背景很容易滞后当前市场

滚动窗口不是为了找最优参数。

它是为了让你用“当时能看到的一段历史”描述状态。

7. 扩展窗口与滚动窗口的区别

扩展窗口从起点开始,随着时间不断变长。

滚动窗口只保留最近固定长度。

扩展窗口像一本越来越厚的档案。

滚动窗口像最近一段时间的体检报告。

在 A 股研究中:

  • 评估长期均值时,扩展窗口有参考意义。
  • 判断当前市场温度时,滚动窗口更直观。
  • 做策略上线前验证时,两者都要记录清楚。

如果你的回测用全样本均值来标准化早期数据,就可能偷看未来。

正确做法是让每个时点只使用它之前的数据。

8. A 股案例:同一个动量因子会变脸

假设你研究“过去 20 日涨幅高的股票,未来 5 日是否继续强”。

在市场全面放量上涨时,这个观察可能有效。

热门行业资金持续流入,强者恒强。

但在震荡市里,短期涨幅太高的股票可能更容易回落。

在监管关注题材炒作时,高涨幅还可能伴随更大波动。

如果你只看 2019-2021 年,可能得到“动量很好”的结论。

如果加入 2022 年和 2023 年,结论可能明显变弱。

这不是数据在撒谎。

是市场环境变了。

时间序列研究的任务,就是把这种变化摆到台面上。

mermaid
graph TD
    A["定义动量因子"] --> B["按时间切分样本"]
    B --> C["计算滚动 RankIC"]
    C --> D["观察牛熊震荡差异"]
    D --> E["检查交易成本"]
    E --> F["写出适用边界"]

9. 滚动验证:看关系是否一路存活

全样本结果像一张毕业总成绩单。

滚动结果像每个月的小测验。

如果总成绩很好,但很多月份都不及格,只靠少数月份拉高,实盘体验可能很差。

你可以用滚动窗口检查:

  • 因子相关性是否长期同向。
  • 收益是否集中在少数行情。
  • 回撤是否集中在某些市场阶段。
  • 参数是否只在某段时间有效。
  • 成本上升后是否快速失效。

对进阶研究者来说,稳定地“不太差”往往比偶尔“特别好”更重要。

10. 量化开发视角:时间戳是一等公民

实盘工程化中,你已经学过日志、数据版本和时间戳错位。

在时间序列研究里,时间戳同样是一等公民。

每个字段都应该能回答三个问题:

  1. 这条数据真实发生在什么时候?
  2. 这条数据对投资者可见在什么时候?
  3. 策略在什么时候允许使用它?

例如财报期末日期是 3 月 31 日。

但公告披露可能在 4 月下旬。

你不能在 4 月 1 日的回测里使用这份还没披露的财务数据。

这不是小细节。

这是时间序列验证的底线。


交互实验室

练习 1:判断是否偷看未来

请判断下面做法是否安全。

做法是否安全原因
用今天收盘价计算信号,并假设今天收盘前已买入不安全收盘前不知道最终收盘价
今天收盘后计算信号,明天按开盘或可成交价观察较安全符合信息可见顺序
用未来 20 日收益作为模型标签安全标签可以用于训练答案,但不能作为特征
用全样本均值标准化 2018 年数据不安全2018 年看不到未来年份均值

练习 2:设计一个滚动窗口检查

研究问题:过去 20 日涨幅因子是否稳定。

请按步骤写下你的检查方案:

  1. 股票池:例如沪深 300 或中证 500 成分股。
  2. 特征:过去 20 日涨幅,并向后滞后一日。
  3. 标签:未来 5 日收益或未来 20 日收益。
  4. 窗口:每 250 个交易日计算一次 RankIC。
  5. 输出:画出滚动 RankIC 曲线,并标注市场阶段。
  6. 结论:说明哪些阶段有效、哪些阶段失效。

练习 3:手工理解滚动均值

假设某股票 5 日收益率依次为:

日期收益率
第 1 日1%
第 2 日-1%
第 3 日2%
第 4 日0%
第 5 日3%
第 6 日-2%

3 日滚动均值在第 3 日是:

1%1%+2%3=0.67%

第 6 日则只看第 4、5、6 日:

0%+3%2%3=0.33%

这说明滚动窗口会不断忘掉更早的数据。

它更关注近期状态,但也更容易受短期噪声影响。


核心复盘

知识清单

  • [ ] 我能解释为什么价格序列通常不平稳,收益率更适合统计比较。
  • [ ] 我知道滞后特征用于保证只使用当时可见的信息。
  • [ ] 我能区分特征和标签,避免把未来收益放进特征。
  • [ ] 我理解滚动窗口是描述当前状态的工具,不是寻找神奇参数的工具。
  • [ ] 我会用分时期和滚动结果检查金融数据“变脸”。

金句总结

时间序列研究的第一原则:站在当时,只看当时能看到的东西。

本文档仅供学习交流用途,不构成任何投资建议。股市有风险,入市需谨慎。