特征工程总览:特征设计原则、特征分类与评估框架

各位同学好,今天我们来聊聊时间序列特征工程的全貌。说实话,这个主题我琢磨了很久才敢动笔。为什么?因为特征工程这东西,太容易被人当成「玄学」了。

我在量化交易领域摸爬滚打了七八年,见过太多人一上来就堆特征——什么均线、动量、波动率,能想到的全塞进去。结果呢?模型过拟合得一塌糊涂,回测曲线漂亮得像假的一样。嗯,我自己也踩过这个坑。

所以这一章,我想把特征工程这件事讲透。不是教你怎么造特征,而是告诉你:什么样的特征是好特征?特征到底分几类?怎么判断特征有没有用?

一、特征设计的三条铁律

先说说我个人习惯。每次设计新特征前,我都会问自己三个问题。这三个问题,我称之为「特征设计三原则」。

原则一:可解释性优先

你设计的特征,能不能用一句话说清楚它的经济含义?

比如「过去5日收益率均值」——这个好理解,就是短期动量。但如果你搞出一个「过去5日收益率与过去20日波动率的比值再取对数」,你最好能解释清楚这代表什么市场行为。

我在项目中遇到过,有人用了一个极其复杂的特征,回测效果奇好。但没人能说清它代表什么。结果上线后市场风格一变,这个特征直接失效,亏了不少钱。

原则二:稳定性大于预测力

一个特征今天预测力很强,明天就没了,这没用。

我建议你关注特征的「跨周期稳定性」。说白了,就是它在不同市场环境下表现是否一致。牛市有效、熊市也有效,这才叫好特征。

原则三:避免未来信息泄露

这个坑我踩过,而且踩得很惨。

有一次我做因子回测,发现一个特征预测准确率高达80%。我兴奋得不行,结果仔细一查——这个特征用到了未来数据。比如用「当天收盘价」去预测「当天涨跌」,这当然准啊,但毫无意义。

记住:特征构建时,只能用历史数据,不能用到任何未来信息。

二、特征分类:三大门派

时间序列特征,我习惯分成三大类。你想想看,就像分析一个人,你可以看他的长相(统计特征)、行为(时域特征)、还有内在频率(频域特征)。

类别 核心思想 典型例子 适用场景
统计特征 用统计量描述数据分布 均值、方差、偏度、峰度 数据探索、异常检测
时域特征 分析时间序列的动态变化 自相关、差分、滑动窗口 趋势跟踪、动量策略
频域特征 挖掘周期性成分 傅里叶变换、功率谱密度 季节性分析、周期识别

1. 统计特征:最基础也最容易被忽视

很多人觉得统计特征太简单,不屑于用。但我告诉你,有时候最简单的特征反而最有效。

举个例子。我在做股票因子时,发现「过去20日收益率偏度」这个特征,对识别市场极端行情特别有用。当偏度显著为负时,说明市场正在积累下行风险。这个特征简单吧?但很多量化模型都没用。

# 统计特征计算示例
import numpy as np
import pandas as pd

def compute_statistical_features(series):
    """计算基础统计特征"""
    features = {
        'mean': np.mean(series),
        'std': np.std(series),
        'skew': series.skew(),      # 偏度
        'kurt': series.kurtosis(),  # 峰度
        'quantile_25': series.quantile(0.25),
        'quantile_75': series.quantile(0.75)
    }
    return features

2. 时域特征:捕捉动态变化

时域特征是我个人最常用的一类。为什么?因为金融市场本质上是动态的,静态统计量往往不够用。

比如自相关特征。我记得有一次做期货策略,发现某个品种的5分钟收益率自相关特别强。这意味着什么?意味着过去5分钟的涨跌会延续到未来5分钟。这就是一个典型的「动量因子」。

# 时域特征示例:自相关与差分
def compute_time_domain_features(series, lag=5):
    """计算时域特征"""
    features = {
        'autocorr_lag1': series.autocorr(lag=1),
        'autocorr_lag5': series.autocorr(lag=lag),
        'diff_mean': series.diff().mean(),
        'diff_std': series.diff().std(),
        'rolling_vol': series.rolling(20).std().iloc[-1]
    }
    return features

3. 频域特征:发现隐藏的周期

频域特征,说白了就是把时间序列从「时间视角」转换到「频率视角」。为什么要这么做?因为有些规律在时间域里看不出来,但在频率域里一目了然。

举个例子。我做过一个电力负荷预测项目。从时域看,数据就是每天上下波动,看不出什么。但一做傅里叶变换,发现24小时和168小时(一周)这两个频率成分特别强。这就是典型的日周期和周周期。

小技巧:频域特征特别适合处理有明确周期的数据,比如天气、电力、交通流量。但对于金融数据,周期往往不稳定,使用时需要谨慎。

三、特征评估框架:怎么判断特征好不好?

特征造出来了,怎么知道它好不好?我有一套自己的评估框架,分享给你。

第一步:单因子分析

先看单个特征的表现。我一般会看三个指标:

  • IC(信息系数):特征值与未来收益的相关性。绝对值越大越好。
  • Rank IC:排序后的IC,对极端值不敏感,更稳健。
  • 分组收益:按特征值分成10组,看最高组和最低组的收益差。

注意:IC高不代表特征一定好。我见过IC高达0.1的特征,但分组收益曲线是倒V形的——中间组收益最高,两端反而低。这种非线性关系,用线性IC是看不出来的。

第二步:相关性分析

多个特征之间不能太相关。为什么?因为如果两个特征高度相关,它们提供的信息是重复的。模型会变得不稳定,而且容易过拟合。

我一般要求特征之间的相关系数不超过0.7。超过这个阈值,我就会考虑合并或者剔除一个。

第三步:稳定性检验

这是最关键的一步。我会把数据分成多个子时期,比如牛市区、熊市区、震荡区。然后看特征在每个子时期的表现是否一致。

如果一个特征在牛市里IC是0.15,熊市里变成-0.05,那这个特征我是不敢用的。市场风格一变,它可能就从「好特征」变成「坏特征」了。

四、知识体系总览

说了这么多,我画了一张图帮你梳理一下。这张图涵盖了特征工程的完整流程:从设计原则,到分类方法,再到评估框架。

时间序列特征工程知识体系 特征设计原则 可解释性优先 稳定性大于预测力 避免未来信息泄露 特征分类(三大门派) 统计特征 均值、方差、偏度、峰度 时域特征 自相关、差分、滑动窗口 频域特征 傅里叶变换、功率谱密度 特征评估框架 单因子分析 IC、Rank IC、分组收益 相关性分析 特征间相关系数 < 0.7 稳定性检验 跨周期表现一致性

五、一些心里话

特征工程这件事,说难也难,说简单也简单。难在你要对数据有深刻理解,简单在只要你遵循基本原则,就不会犯大错。

我个人建议,刚开始做特征工程时,不要追求花哨。先把统计特征和时域特征吃透,把评估框架跑熟。等你有了一定经验,再慢慢尝试频域特征和更复杂的特征构造方法。

记住一句话:好的特征工程,不是特征越多越好,而是每个特征都有它存在的理由。

最后分享一个我的习惯:每次构建新特征,我都会写一段注释,说明这个特征的经济含义、预期效果、以及可能的风险。这样半年后回头看,还能记得当初为什么这么设计。

专注资料整理