《投资-376》量化交易 - 特征工程 - 基于股票交易时间序列数据构建新特征的几种基础性方法:日期/时间特征、shift滞后特征、rolling滚动特征、expanding扩展特征

在基于股票交易时间序列数据进行量化分析或机器学习建模时,构建高质量的特征(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)、分位数特征跨资产相关性等高级特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值