4. 特征工程基础:价格特征、成交量特征、订单簿不平衡、价差特征
各位同学,欢迎来到特征工程这一讲。说实话,在异常交易识别这个领域,特征工程做得好不好,直接决定了你模型的天花板。我见过太多人一上来就堆深度学习模型,结果特征全是垃圾,那模型再花哨也没用。今天咱们就聊聊那些真正经得起市场检验的基础特征。
4.1 价格特征:不只是收盘价
很多人做价格特征,就只会取个收盘价、开盘价。嗯,这远远不够。我个人习惯把价格特征分成三个层次:
- 原始价格:开盘价、收盘价、最高价、最低价。这是基础,但别只用它们做原始输入。
- 衍生价格:比如(收盘价 - 开盘价) / 开盘价,也就是日内收益率。我建议你多算几个时间窗口的收益率,比如1分钟、5分钟、30分钟。
- 相对价格:当前价格相对于移动平均线的偏离度。说白了就是(当前价 - MA20) / MA20。这个在识别趋势突变时特别好用。
重点提醒:价格特征一定要做标准化处理。不同股票的价格区间差太远了,茅台500块,某ST股才2块,不标准化的话模型根本学不到东西。
我在项目中遇到过一件事:有个学员直接用原始价格训练模型,结果模型学到的全是「高价股波动大」这种伪规律。后来改成收益率特征,效果立竿见影。
4.2 成交量特征:量在价先
成交量是市场的「燃料」。我个人最常用的成交量特征有这几个:
| 特征名称 | 计算公式 | 用途 |
|---|---|---|
| 成交量变化率 | (当前量 - 前N期均值) / 前N期均值 | 识别放量或缩量异常 |
| 成交量加权均价(VWAP) | ∑(价格×成交量) / ∑成交量 | 判断当前价格是否偏离真实成交价 |
| 成交量标准差 | 滚动N期的成交量标准差 | 衡量成交量波动是否异常 |
| 量价相关性 | 价格与成交量的滚动相关系数 | 识别量价背离 |
你想想看,如果价格在涨但成交量在萎缩,这往往是个危险信号。我曾经用这个特征抓出过一起「对倒交易」的案例——价格拉得很漂亮,但成交量就是跟不上,后来一查果然是自买自卖。
小技巧:计算成交量变化率时,我建议用中位数代替均值。因为成交量偶尔会有极端值,均值容易被带偏,中位数更稳健。
4.3 订单簿不平衡:微观结构的核心
这个特征可能有些同学不太熟悉,但它在高频交易领域是必用的。订单簿不平衡,说白了就是看买单和卖单谁更强。
最基本的计算公式是:
# 订单簿不平衡指标
def order_imbalance(bid_volume, ask_volume):
"""
bid_volume: 买一到买五的总挂单量
ask_volume: 卖一到卖五的总挂单量
"""
if bid_volume + ask_volume == 0:
return 0
return (bid_volume - ask_volume) / (bid_volume + ask_volume)
这个值在-1到1之间。正值表示买方力量强,负值表示卖方力量强。我习惯把它跟价格走势结合起来看——如果价格在涨但订单簿不平衡在下降,说明上涨可能不可持续。
避坑指南:我曾经犯过一个错误,只用了买一卖一的数据来计算不平衡。后来发现有些庄家会在买一挂大单诱多,但买二到买五全是小单。所以建议至少用买三到卖三的数据,甚至更深。
另外,我建议你计算多个时间点的订单簿不平衡,比如过去10秒的平均值、最大值、最小值。这样可以捕捉到挂单撤单的快速变化。
4.4 价差特征:流动性的温度计
价差,就是买卖报价之间的差距。它直接反映了市场的流动性状况。价差越小,流动性越好;价差突然扩大,往往意味着有大事发生。
常用的价差特征包括:
- 绝对价差:卖一价 - 买一价。简单直接,但不同股票之间不好比较。
- 相对价差:(卖一价 - 买一价) / 中间价。这个可以跨股票比较。
- 价差变化率:当前价差相对于前N期均值的比例变化。
- 有效价差:实际成交价与买卖中间价的差值。这个更能反映真实的交易成本。
我记得有一次做回测,发现某个股票在收盘前3分钟价差突然从0.01元扩大到0.05元。当时直觉告诉我这不对劲,后来发现是有人在收盘前故意撤单制造流动性枯竭,然后低价扫货。价差特征帮我提前预警了。
核心要点:价差特征不要只看绝对值。比如茅台价差0.1元可能很正常,但一个低价股价差0.1元就是异常了。一定要结合价格水平做归一化。
4.5 特征组合:1+1 > 2
单独用某个特征效果有限,但组合起来威力就大了。我常用的组合方式:
# 特征组合示例
def combined_features(df):
# 量价背离指标
df['price_return'] = df['close'].pct_change()
df['volume_change'] = df['volume'].pct_change()
df['divergence'] = df['price_return'] * df['volume_change']
# 订单簿与价差联合
df['spread_imbalance'] = df['spread'] * df['order_imbalance']
# 价格压力指标
df['price_pressure'] = df['order_imbalance'] / (df['spread'] + 1e-8)
return df
你想想看,当订单簿不平衡很大但价差也很大的时候,说明虽然买方力量强,但流动性不足,这种状态下价格很容易被操纵。这个组合特征帮我识别过好几次「虚假拉升」。
4.6 本章知识体系
下面这张图总结了本章的核心逻辑,你可以对照着梳理一下思路:
好了,这一讲的内容就到这里。特征工程是个细活,别指望一蹴而就。我建议你拿到数据后,先把这些基础特征都算一遍,然后看看它们的分布、相关性,慢慢就会找到感觉。记住,好的特征胜过复杂的模型。