4. 特征工程基础:定义、与因子挖掘的关系及核心处理方法
特征工程是量化因子库搭建中承上启下的关键环节。原始行情数据(价格、成交量、财务指标)无法直接作为有效的选股信号,必须经过系统的特征工程处理,才能转化为稳定、可解释、具备预测能力的因子。本章将深入讲解特征工程的定义、它与因子挖掘的内在关系,以及最核心的标准化与缺失值处理方法。
4.1 特征工程的定义与核心目标
特征工程(Feature Engineering)是指利用领域知识和数学变换,从原始数据中提取、构造、选择并转换出最能表征问题本质的特征变量的过程。在量化投资领域,特征工程的目标可以归纳为以下四点:
| 目标维度 | 具体说明 | 量化意义 |
|---|---|---|
| 提升信号纯度 | 去除噪音、异常值和市场微观结构干扰 | 提高因子IC的稳定性与显著性 |
| 增强可解释性 | 使特征与经济学逻辑、市场行为对应 | 降低过拟合风险,便于归因分析 |
| 统一量纲与分布 | 消除不同股票、不同时间段的尺度差异 | 保证截面可比性与模型收敛速度 |
| 处理数据缺陷 | 填充缺失值、剔除极端值、平滑噪音 | 防止因子失效或回测结果失真 |
4.2 特征工程与因子挖掘的关系
特征工程与因子挖掘是紧密耦合、相互迭代的两个阶段。因子挖掘侧重于“发现”潜在信号(如通过遗传规划、深度学习搜索),而特征工程侧重于“加工”与“验证”这些信号。两者的关系可以用以下流程表示:
4.3 特征标准化:Z-score 与 Min-Max
标准化是特征工程中最基础也最重要的步骤。不同股票的价格水平、波动幅度差异巨大(如茅台与工商银行),若不进行标准化,因子值将无法在截面上进行横向比较,导致模型偏向高价股或高波动股。
4.3.1 Z-score 标准化(正态标准化)
Z-score 将特征转换为均值为0、标准差为1的标准正态分布。其公式为:
Z = (X - μ) / σ
其中:
X = 原始特征值
μ = 截面(或时间序列)均值
σ = 截面(或时间序列)标准差
在因子分析中,Z-score 标准化通常在截面(Cross-section)上进行,即对同一时刻所有股票的某个特征值进行标准化。这样做可以消除股票间的量纲差异,保留截面排序信息。
| 维度 | 截面 Z-score | 时间序列 Z-score |
|---|---|---|
| 计算方式 | 每期对所有股票计算 | 每只股票对历史数据计算 |
| 适用场景 | 截面因子(Rank IC 分析) | 时序因子(趋势类策略) |
| 优点 | 保留横截面相对强弱 | 保留个股自身时序模式 |
| 缺点 | 对极端值敏感 | 需较长历史窗口 |
4.3.2 Min-Max 标准化(归一化)
Min-Max 将特征线性映射到 [0, 1] 区间,公式为:
X_scaled = (X - X_min) / (X_max - X_min)
Min-Max 适用于特征值有明确上下界、且分布相对均匀的场景。在因子库中,常用于需要保持原始分布形状、且后续模型对输入范围敏感的情况(如神经网络)。
4.3.3 两种标准化方法的对比
| 对比维度 | Z-score | Min-Max |
|---|---|---|
| 输出范围 | 无固定范围(通常 -3 ~ 3) | [0, 1] 固定区间 |
| 对异常值敏感度 | 中等(受标准差影响) | 高(受极值影响) |
| 保留分布形状 | 保留正态分布形状 | 保留原始分布形状(线性压缩) |
| 因子IC分析适用性 | 非常适用(Rank IC 天然匹配) | 一般(需注意边界效应) |
| 计算复杂度 | 低 | 低 |
4.4 缺失值处理
金融数据中缺失值普遍存在:停牌、新股上市、财务数据披露延迟、数据源异常等都会导致缺失。缺失值处理不当会直接破坏因子计算的连续性,导致IC分析出现偏差。
4.4.1 缺失值类型与识别
| 缺失类型 | 常见原因 | 对因子的影响 |
|---|---|---|
| 完全随机缺失 | 数据传输错误、临时停牌 | 影响较小,可简单填充 |
| 随机缺失 | 财务数据按季度披露,非交易日 | 需考虑时序逻辑填充 |
| 非随机缺失 | ST股票、退市风险、长期停牌 | 需谨慎处理,可能引入生存偏差 |
4.4.2 常用缺失值处理方法
- 删除法(Listwise Deletion)
- 直接删除包含缺失值的样本或特征
- 适用于缺失比例极低(<1%)且随机缺失的情况
- 缺点:可能损失有效信息,导致样本偏差
- 固定值填充
- 使用0、均值、中位数或行业均值填充
- 截面因子常用行业均值填充,保留行业特性
- 代码示例:
# 截面均值填充(按行业分组) import pandas as pd df['factor'] = df.groupby('industry')['factor_raw']\ .transform(lambda x: x.fillna(x.mean())) # 中位数填充(对异常值更鲁棒) df['factor'] = df['factor_raw'].fillna(df['factor_raw'].median()) - 前向/后向填充(Forward/Backward Fill)
- 适用于时间序列因子,用最近的有效值填充
- 常用于财务数据(如PE、PB),假设数据在披露前保持不变
- 代码示例:
# 前向填充:用上一个交易日的数据填充 df['factor'] = df.groupby('stock_code')['factor_raw']\ .transform(lambda x: x.ffill()) # 后向填充:用下一个交易日的数据填充(谨慎使用) df['factor'] = df.groupby('stock_code')['factor_raw']\ .transform(lambda x: x.bfill()) - 插值法(Interpolation)
- 线性插值、多项式插值、时间加权插值
- 适用于连续型因子,且缺失间隔较短
- 注意:金融数据中过度插值可能引入未来信息
4.4.3 缺失值处理的实战策略
在实际因子库中,建议采用分层处理策略:
| 缺失比例 | 推荐策略 | 说明 |
|---|---|---|
| < 1% | 删除或均值填充 | 对因子影响可忽略 |
| 1% ~ 5% | 行业均值填充 + 前向填充 | 保留行业特性与时间连续性 |
| 5% ~ 20% | 模型预测填充(如KNN、回归) | 需验证填充合理性,避免引入偏差 |
| > 20% | 考虑剔除该特征 | 缺失过多说明数据质量不可靠 |
4.5 本章小结
特征工程是因子库搭建的基石。通过本章的学习,你应该掌握:
- 特征工程的定义及其与因子挖掘的协同关系
- Z-score 与 Min-Max 两种标准化方法的原理、适用场景与选择策略
- 缺失值的类型识别与分层处理方案
- 在实战中建立标准化的特征工程流水线,确保因子质量