4. 特征工程入门

在金融机器学习项目中,特征工程往往比模型选择更能决定最终收益曲线的形态。原始行情数据只有开高低收、成交量与时间戳,它们本身并不直接告诉模型“现在是否处于趋势启动”或“波动是否即将放大”。特征工程的任务,就是把市场行为翻译成模型可学习的数值表达,同时避免引入未来信息与过度拟合。

一、金融特征的四类基本来源

金融特征可以按信息来源划分为四类,理解分类有助于系统化地构建特征池,而不是零散地堆叠指标。

  • 价格派生特征:收益率、对数收益率、高低价差、隔夜跳空、滚动波动率等,直接刻画价格变化。
  • 成交量与流动性特征:成交量比率、成交额加权均价偏离、换手率、买卖价差代理变量,反映资金参与强度。
  • 技术指标特征:均线、MACD、RSI、布林带、ATR 等,是对价格与成交量的非线性压缩。
  • 横截面与市场状态特征:相对强弱、行业中性化收益、市场波动率指数、利率与汇率变化,提供宏观与相对位置信息。
特征不是越多越好。金融数据信噪比低,冗余特征会放大过拟合风险。建议每个特征都能回答“它捕捉了什么市场行为”。

二、技术指标构建:从公式到可复用函数

技术指标的本质是滚动窗口上的统计变换。构建时应遵循三个原则:只用历史数据、窗口参数显式化、输出对齐到决策时点。下面以 ATR 与 RSI 为例,展示可复用的构建方式。

import pandas as pd
import numpy as np

def atr(high, low, close, window=14):
    prev_close = close.shift(1)
    tr = pd.concat([
        high - low,
        (high - prev_close).abs(),
        (low - prev_close).abs()
    ], axis=1).max(axis=1)
    return tr.rolling(window).mean()

def rsi(close, window=14):
    delta = close.diff()
    gain = delta.clip(lower=0).rolling(window).mean()
    loss = (-delta.clip(upper=0)).rolling(window).mean()
    rs = gain / loss.replace(0, np.nan)
    return 100 - 100 / (1 + rs)

df['atr14'] = atr(df['high'], df['low'], df['close'], 14)
df['rsi14'] = rsi(df['close'], 14)
df['ret_1'] = df['close'].pct_change()
df['vol_20'] = df['ret_1'].rolling(20).std()

注意 rolling 默认包含当前值,若在收盘前决策,应使用 shift(1) 将特征后移一根 K 线,确保特征只包含已实现信息。

三、特征变换与编码方法

金融特征常存在厚尾、量纲差异与非线性关系,直接送入模型效果有限。常用变换包括:

方法适用场景注意事项
标准化 Z-Score近似正态的收益率、波动率用训练集均值方差,避免全样本泄露
稳健标准化 RobustScaler存在极端值的成交量、价差基于中位数与四分位距
分位数变换厚尾分布、非线性指标映射到均匀或正态分布
对数变换成交量、成交额等右偏数据先加 1 避免 log(0)
独热编码行业、星期、市场状态类别过多时改用目标编码
分箱编码连续变量离散化边界需在训练集确定
任何变换的统计量都必须只在训练集上拟合,再应用到验证集与测试集。用全样本计算均值方差是金融机器学习中最常见的数据泄露之一。

四、案例:构建一个可解释的日频特征集

假设我们预测未来 5 日收益率方向,可构建如下特征流水线:

  1. 计算 1、5、20 日对数收益率与 20 日滚动波动率。
  2. 计算 ATR14、RSI14、MACD 柱状值,并做稳健标准化。
  3. 计算成交量 5 日均值与 20 日均值之比,取对数。
  4. 加入星期与月份独热编码,捕捉日历效应。
  5. 所有特征统一 shift(1),标签为未来 5 日收益方向。
金融特征工程流水线 原始行情 OHLCV + 时间 价格/量特征 收益率 波动率 量比 技术指标 ATR RSI MACD 日历/状态 星期 月份 行业 特征变换与编码 稳健标准化 · 分位数变换 · 对数 · 独热 对齐决策时点 shift(1) → 模型输入

五、常见误区与复盘

  • 未来函数:用当日收盘价计算指标却用于当日开盘决策,或标准化时使用全样本统计量。
  • 指标堆叠:同时加入 MA5、MA10、MA20、EMA5、EMA10,信息高度重叠,模型难以区分。
  • 忽略交易成本:特征看起来预测力强,但换手过高,扣除成本后收益消失。
  • 不做特征稳定性检查:训练期有效的特征在测试期分布漂移,需监控 PSI 或 KS 统计量。
复盘建议:每轮特征迭代后,记录特征覆盖率、缺失率、训练/测试分布差异与单特征 IC,形成特征台账。特征工程不是一次性工作,而是随市场状态持续迭代的工程过程。

掌握特征类型、指标构建与变换编码方法后,下一步才能进入特征选择与模型训练的稳定流程。特征质量决定了模型上限,而严谨的时点对齐与训练集隔离,决定了这个上限是否真实可信。