12.2 时间序列进阶:平稳性、滞后特征、滚动窗口
课前导读
本节目标
你将学会:用时间序列思维检查 A 股数据,理解平稳性、滞后特征和滚动窗口为什么能减少“偷看未来”。
适合对象:已经能用 pandas 处理日线数据,并做过因子、回测和实盘差异分析的读者。
难度:advanced
预计用时:约 40 分钟
时间序列就是按时间排队的数据。
你之前已经接触过日线、分钟线、收益率、rolling 和 shift。
这一节不再把它们当作代码技巧,而是把它们放进金融市场的真实问题里。
A 股数据最大特点之一是“会变脸”。
同一个指标,在牛市、熊市、震荡市、政策密集期、流动性收缩期,含义可能完全不同。
因此,时间序列进阶不是为了让预测更神秘。
它是为了确保你的验证尊重时间顺序,尊重市场环境变化,尊重数据当时是否可见。
知识正文
1. 类比:股票数据像天气,不像尺子
一把尺子的刻度今天是一厘米,明天还是一厘米。
但天气不同。
同样 25 度,春天让人觉得暖,夏天可能觉得凉。
股票数据更像天气。
同样 5% 的涨幅,在冷清熊市里可能代表强烈资金关注。
在全面牛市里,可能只是普通波动。
同样 2 倍成交量,在小盘题材股上可能意味着情绪爆发。
在银行股上可能只是指数调仓或大资金换手。
这就是时间序列研究要处理的核心:数据的含义会随时间和环境变化。
关键直觉
时间序列不是一堆可以随便打乱的样本。顺序本身就是信息,也是约束。
2. 术语一:平稳性
平稳性可以先理解为“数据的脾气是否稳定”。
如果一段序列的平均水平、波动范围和相关结构大致稳定,我们说它更接近平稳。
如果它一路抬升、波动越来越大、规律不断改变,就更不平稳。
股价本身通常不平稳。
贵州茅台从几十元到上千元的长期价格序列,平均水平一直在变。
直接拿价格做统计,很容易得到看似强烈但没有实际意义的关系。
收益率通常比价格更接近平稳。
因为收益率关注的是比例变化,而不是价格绝对水平。
这也是量化研究常用收益率而不是直接用价格的原因。
一个简单转换是:
这不是为了炫技,而是为了把不同价位股票放到更可比的尺度上。
3. 非平稳:金融数据会换剧本
非平稳意味着过去关系可能不再适用。
A 股中常见的剧本变化包括:
| 变化类型 | 例子 | 对研究的影响 |
|---|---|---|
| 市场阶段变化 | 牛市、熊市、震荡市切换 | 动量、反转、低估值因子表现不同 |
| 制度变化 | 注册制、涨跌幅规则、退市常态化 | 历史样本口径前后不可完全等同 |
| 流动性变化 | 成交额放大或萎缩 | 同样换手率含义改变 |
| 行业景气变化 | 新能源、地产、医药周期变化 | 行业因子阶段性主导收益 |
| 数据口径变化 | 指数成分、财务口径、复权处理调整 | 回测结果需要重新标注版本 |
因此,时间序列研究不能只看全样本平均。
它要看分时期、分市场环境、滚动表现。
常见误区
把 2019-2021 年某个风格的有效性,直接外推到所有年份,是典型的时间序列误读。
4. 术语二:滞后特征
滞后特征就是只使用过去已经发生、已经可见的信息。
它像开车看后视镜。
你不能用前方 500 米已经发生但此刻还看不到的事故,来解释你现在的操作。
在 pandas 中,shift 经常用来处理这个问题。
例如,今天收盘后才能知道今天的收盘价。
如果你的策略假设在今天收盘前买入,就不能直接使用今天收盘价计算出的信号。
更谨慎的做法是:
- 今天收盘后生成信号。
- 下一个交易日按可执行规则观察成交。
- 标签可以看未来收益,但特征不能偷看未来。
# 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 年,结论可能明显变弱。
这不是数据在撒谎。
是市场环境变了。
时间序列研究的任务,就是把这种变化摆到台面上。
graph TD
A["定义动量因子"] --> B["按时间切分样本"]
B --> C["计算滚动 RankIC"]
C --> D["观察牛熊震荡差异"]
D --> E["检查交易成本"]
E --> F["写出适用边界"]9. 滚动验证:看关系是否一路存活
全样本结果像一张毕业总成绩单。
滚动结果像每个月的小测验。
如果总成绩很好,但很多月份都不及格,只靠少数月份拉高,实盘体验可能很差。
你可以用滚动窗口检查:
- 因子相关性是否长期同向。
- 收益是否集中在少数行情。
- 回撤是否集中在某些市场阶段。
- 参数是否只在某段时间有效。
- 成本上升后是否快速失效。
对进阶研究者来说,稳定地“不太差”往往比偶尔“特别好”更重要。
10. 量化开发视角:时间戳是一等公民
实盘工程化中,你已经学过日志、数据版本和时间戳错位。
在时间序列研究里,时间戳同样是一等公民。
每个字段都应该能回答三个问题:
- 这条数据真实发生在什么时候?
- 这条数据对投资者可见在什么时候?
- 策略在什么时候允许使用它?
例如财报期末日期是 3 月 31 日。
但公告披露可能在 4 月下旬。
你不能在 4 月 1 日的回测里使用这份还没披露的财务数据。
这不是小细节。
这是时间序列验证的底线。
交互实验室
练习 1:判断是否偷看未来
请判断下面做法是否安全。
| 做法 | 是否安全 | 原因 |
|---|---|---|
| 用今天收盘价计算信号,并假设今天收盘前已买入 | 不安全 | 收盘前不知道最终收盘价 |
| 今天收盘后计算信号,明天按开盘或可成交价观察 | 较安全 | 符合信息可见顺序 |
| 用未来 20 日收益作为模型标签 | 安全 | 标签可以用于训练答案,但不能作为特征 |
| 用全样本均值标准化 2018 年数据 | 不安全 | 2018 年看不到未来年份均值 |
练习 2:设计一个滚动窗口检查
研究问题:过去 20 日涨幅因子是否稳定。
请按步骤写下你的检查方案:
- 股票池:例如沪深 300 或中证 500 成分股。
- 特征:过去 20 日涨幅,并向后滞后一日。
- 标签:未来 5 日收益或未来 20 日收益。
- 窗口:每 250 个交易日计算一次 RankIC。
- 输出:画出滚动 RankIC 曲线,并标注市场阶段。
- 结论:说明哪些阶段有效、哪些阶段失效。
练习 3:手工理解滚动均值
假设某股票 5 日收益率依次为:
| 日期 | 收益率 |
|---|---|
| 第 1 日 | 1% |
| 第 2 日 | -1% |
| 第 3 日 | 2% |
| 第 4 日 | 0% |
| 第 5 日 | 3% |
| 第 6 日 | -2% |
3 日滚动均值在第 3 日是:
第 6 日则只看第 4、5、6 日:
这说明滚动窗口会不断忘掉更早的数据。
它更关注近期状态,但也更容易受短期噪声影响。
核心复盘
知识清单:
- [ ] 我能解释为什么价格序列通常不平稳,收益率更适合统计比较。
- [ ] 我知道滞后特征用于保证只使用当时可见的信息。
- [ ] 我能区分特征和标签,避免把未来收益放进特征。
- [ ] 我理解滚动窗口是描述当前状态的工具,不是寻找神奇参数的工具。
- [ ] 我会用分时期和滚动结果检查金融数据“变脸”。
金句总结
时间序列研究的第一原则:站在当时,只看当时能看到的东西。