在基于股票交易时间序列数据进行量化分析或机器学习建模时,构建高质量的特征(feature engineering)是提升模型性能的关键步骤。
以下是四种基础但非常有效的特征构造方法:日期/时间特征、shift滞后特征、rolling滚动特征、expanding扩展特征。下面逐一介绍其原理和实现方式。
1. 日期/时间特征(Date/Time Features)
目的:从时间戳中提取周期性信息,帮助模型识别季节性、趋势或特定日期效应(如月初、周末等)。
常见特征:
- 年份(Year)
- 季度(Quarter)
- 月份(Month)
- 日期(Day)
- 星期几(Weekday)
- 是否为周末(Is Weekend)
- 是否为月初/月末(Is Month Start / End)
- 交易日序号(如第N个交易日)
Python 示例(使用 pandas):
python
import pandas as pd
# 假设 df 的索引是 datetime 类型
df['year'] = df.index.year
df['month'] = df.index.month
df['day'] = df.index.day
df['weekday'] = df.index.weekday # Monday=0, Sunday=6
df['is_weekend'] = df.index.weekday >= 5
df['is_month_start'] = df.index.is_month_start.astype(int)
df['is_month_end'] = df.index.is_month_end.astype(int)
✅ 适用场景:用于捕捉节假日效应、月度效应、周内波动模式等。
2. Shift 滞后特征(Lagged Features)
目的:引入历史值作为当前时刻的输入变量,反映时间序列的自相关性。
原理:将原始序列向前移动若干个时间步,生成“过去某时刻”的值作为新特征。
常见特征:
close_lag1:昨日收盘价volume_lag5:5天前成交量- 百分比变化滞后项:如
(close - close_lag1) / close_lag1
Python 示例:
python
# 创建滞后特征
for lag in [1, 2, 3, 5, 10]:
df[f'close_lag{lag}'] = df['close'].shift(lag)
df[f'volume_lag{lag}'] = df['volume'].shift(lag)
# 创建价格变动率滞后
df['return_1d'] = df['close'].pct_change(1).shift(1) # 昨日收益率
df['return_5d'] = df['close'].pct_change(5).shift(1) # 过去5日累计收益(昨日为止)
⚠️ 注意:使用
.shift(1)是为了避免未来信息泄露(即不能用今天的数据预测今天)。
✅ 适用场景:ARIMA类模型、RNN、LSTM、XGBoost等依赖历史信息的模型。
3. Rolling 滚动特征(Rolling Window Features)
目的:计算滑动窗口内的统计量,捕捉局部的趋势、波动性、均值回归等动态行为。
常见特征:
- 移动平均(MA):如5日、20日均线
- 移动标准差:衡量波动率
- 最大值/最小值/极差
- 滚动相关性、偏度、峰度等
Python 示例:
python
windows = [5, 10, 20, 60]
for window in windows:
df[f'ma_{window}'] = df['close'].rolling(window).mean()
df[f'std_{window}'] = df['close'].rolling(window).std()
df[f'min_{window}'] = df['close'].rolling(window).min()
df[f'max_{window}'] = df['close'].rolling(window).max()
df[f'range_{window}'] = df[f'max_{window}'] - df[f'min_{window}']
# 相对位置指标(如布林带位置)
df[f'zscore_{window}'] = (df['close'] - df[f'ma_{window}']) / df[f'std_{window}']
# 成交量滚动均值
df[f'volume_ma_{window}'] = df['volume'].rolling(window).mean()
✅ 典型应用:
- 技术指标:MACD、RSI、布林带等都基于滚动计算。
- 波动率建模(GARCH 的简化替代)。
4. Expanding 扩展特征(Expanding Window Features)
目的:基于从开始到当前时间的所有历史数据计算统计量,反映长期趋势或累积效应。
与 rolling 的区别:
rolling:固定长度窗口(如最近20天)expanding:窗口不断增长(从第一笔到当前)
常见特征:
- 累积均值、标准差
- 历史最大值/最小值(创新高/新低)
- 累积收益率
- 到目前为止的夏普比率
Python 示例:
python
# 累积统计
df['cum_mean'] = df['close'].expanding().mean()
df['cum_std'] = df['close'].expanding().std()
df['cum_max'] = df['close'].expanding().max()
df['cum_min'] = df['close'].expanding().min()
# 是否创历史新高
df['is_new_high'] = (df['close'] == df['cum_max']).astype(int)
# 累积收益率
df['cum_return'] = df['close'] / df['close'].iloc[0] - 1
# 累积夏普比率(假设无风险利率为0)
df['cum_sharpe'] = df['return_1d'].expanding().mean() / df['return_1d'].expanding().std()
✅ 适用场景:长期趋势判断、动量策略、风险调整收益评估。
综合建议与注意事项
| 方法 | 优点 | 缺点 | 使用建议 |
|---|---|---|---|
| 日期特征 | 简单有效,解释性强 | 可能过拟合特殊日期 | 配合 dummy variables 使用 |
| 滞后特征 | 捕捉时间依赖 | 容易引入多重共线性 | 控制滞后阶数,避免过多 |
| 滚动特征 | 动态适应市场变化 | 对窗口敏感 | 多尺度组合(短/中/长) |
| 扩展特征 | 反映长期记忆 | 早期数据影响过大 | 适用于长期投资策略 |
🔒 防止未来信息泄露:
- 所有特征必须基于当前或过去数据计算。
- 在训练模型时,确保测试集不参与任何统计量(如标准化参数)的计算。
🛠️ 预处理提示:
- 对滚动/扩展特征,前几个值会是
NaN,需填充或丢弃。- 可结合
fillna(method='bfill')或fillna(value=0)处理缺失值。
总结
这四种基础特征构建方法构成了时间序列特征工程的核心框架:
| 类型 | 关键思想 | 典型用途 |
|---|---|---|
| 日期特征 | 提取时间结构 | 周期性模式识别 |
| Shift 滞后 | 引入历史值 | 自回归建模 |
| Rolling 滚动 | 局部动态统计 | 技术指标、波动率 |
| Expanding 扩展 | 全局历史统计 | 长期趋势、累积效应 |
通过组合这些方法,可以构建出丰富的特征空间,显著提升预测模型的表现力。后续还可进一步引入技术指标(如RSI、MACD)、分位数特征、跨资产相关性等高级特征。
1万+

被折叠的 条评论
为什么被折叠?



