3. 特征工程基础:价格与成交量特征、订单簿特征、异常交易行为特征
各位同学,欢迎来到特征工程这一章。说实话,在金融风控这个领域摸爬滚打这些年,我越来越觉得:特征决定了模型的上限,算法只是逼近这个上限。你想想看,再牛的模型,喂进去一堆垃圾特征,出来的结果能好到哪去?
今天咱们就聊聊内幕交易检测中最核心的三类特征。我习惯把它们叫做「三板斧」——价格成交量、订单簿、异常行为。这三板斧用好了,很多异常信号就藏不住了。
3.1 价格与成交量特征:最基础的信号
先说说价格和成交量。这两个东西,说白了就是市场的「心跳」和「呼吸」。内幕交易者再狡猾,也逃不过量价关系的约束。
3.1.1 收益率特征
收益率不是简单的涨跌幅。我个人习惯把它拆成三块来看:
- 日收益率:最基础,但噪声大。我一般会做对数收益率,因为它的统计性质更好。
- 累计异常收益率(CAR):这个很关键。用个股收益率减去市场基准收益率,剩下的就是「异常」部分。
- 日内分时收益率:比如每5分钟、每15分钟算一次。内幕交易往往在某个时间窗口内集中爆发。
核心公式:
# 对数收益率
log_return = ln(P_t / P_{t-1})
# 累计异常收益率
CAR = Σ(R_i - R_m)
# R_i 是个股收益率,R_m 是市场收益率
嗯,这里要注意:收益率特征一定要做平稳性检验。我在项目中遇到过,有人直接用原始收益率序列建模,结果模型全在学市场波动,根本抓不到内幕信号。
3.1.2 换手率特征
换手率,说白了就是「筹码交换的速度」。内幕交易前,换手率往往会出现异常放大。
我常用的几个维度:
- 日均换手率:和过去20天、60天的均值做对比
- 换手率突变:当日换手率 / 过去N日均值,超过2倍就要警惕
- 换手率与价格背离:价格涨但换手率低,或者价格跌但换手率高——都有问题
避坑指南:
我曾经吃过一次亏:只用了换手率的绝对值,没考虑流通股本变化。结果某次送转股后,换手率突然飙升,模型疯狂报警。后来加了「复权换手率」才解决。
3.1.3 波动率特征
波动率是内幕交易的「温度计」。我习惯用两种方式:
- 历史波动率:用过去20天的收益率标准差。简单,但有效。
- 已实现波动率:用日内高频数据算。这个对捕捉盘中异动特别敏感。
# 历史波动率(20日)
import numpy as np
def historical_volatility(prices, window=20):
log_returns = np.log(prices / prices.shift(1))
return log_returns.rolling(window).std() * np.sqrt(252)
# 已实现波动率(5分钟频率)
def realized_volatility(returns_5min):
return np.sqrt(np.sum(returns_5min**2))
3.2 订单簿特征:微观结构的秘密
订单簿数据,很多人觉得太细、太杂。但我想说:内幕交易的痕迹,往往就藏在这些毫秒级的订单里。
3.2.1 买卖价差
买卖价差,就是最优卖价和最优买价的差值。正常情况下,流动性好的股票价差很小。但内幕交易者为了快速成交,往往会「吃单」——直接吃掉对手盘,导致价差瞬间扩大。
我常用的指标:
- 绝对价差:Ask_Price - Bid_Price
- 相对价差:绝对价差 / 中间价
- 有效价差:成交价与中间价的差值,这个更能反映真实成本
注意:
价差特征对数据频率要求很高。如果你只有日线数据,那价差基本没用。至少要用分钟级数据,最好是Tick级。
3.2.2 订单不平衡
这个特征,我个人觉得是订单簿里最有价值的。什么叫订单不平衡?就是买盘和卖盘的力量对比。
计算方式很简单:
# 订单不平衡指标
order_imbalance = (buy_volume - sell_volume) / (buy_volume + sell_volume)
# 或者用订单笔数
order_imbalance_count = (buy_orders - sell_orders) / (buy_orders + sell_orders)
你想想看,如果一只股票突然出现大量买单,但价格没怎么涨——这正常吗?不正常。这很可能是有人在偷偷吸筹。反过来,大量卖单压着,价格却不跌,也可能是有人在护盘。
3.3 异常交易行为特征:抓「狐狸尾巴」
前面两类特征,都是基于正常交易逻辑。但内幕交易者,往往会留下一些「非正常」的痕迹。这部分特征,就是专门抓这些狐狸尾巴的。
3.3.1 大单异动
什么叫大单?我一般把单笔成交金额超过过去20日均值3倍以上的,定义为大单。内幕交易者资金量大,很难完全拆分成小单。
关键指标:
- 大单成交占比:大单成交量 / 总成交量
- 大单频率:单位时间内大单出现的次数
- 大单方向:主动买入还是主动卖出
3.3.2 关联账户行为
这个比较高级。内幕交易者往往用多个账户操作,但账户之间会有「协同性」。
我常用的方法:
- 交易时间相关性:多个账户在同一时间窗口内交易同一只股票
- 买卖方向一致性:多个账户同时买入或同时卖出
- IP/MAC地址关联:如果数据允许,这个最直接
实战经验:
我曾经处理过一个案子:三个账户,分别在不同券商开户,交易时间高度重合,而且每次都是A账户先买,B和C账户跟着买。后来一查,三个账户的实际控制人是同一个人。这就是典型的关联账户行为。
3.3.3 时间异常特征
内幕交易者有个特点:他们往往在「关键时间点」前后集中交易。比如:
- 收盘前集中交易:利用收盘价操纵
- 公告前突击交易:这个最明显
- 节假日前后:利用信息真空期
我一般会构建一个「时间异常得分」:
# 时间异常得分示例
def time_anomaly_score(trade_time, event_time):
# trade_time: 交易时间
# event_time: 事件公告时间
time_diff = (event_time - trade_time).total_seconds()
# 越接近事件时间,得分越高
score = np.exp(-time_diff / 3600) # 1小时内衰减
return score
3.4 特征组合与实战建议
好了,三类特征都讲完了。但我想说:单个特征的力量有限,组合起来才是王炸。
我常用的组合方式:
| 特征组合 | 检测场景 | 典型信号 |
|---|---|---|
| 收益率 + 换手率 | 量价背离 | 价格涨但换手率低 → 可能有人控盘 |
| 订单不平衡 + 大单异动 | 资金异动 | 大单持续买入但价格不涨 → 吸筹信号 |
| 波动率 + 时间异常 | 事件驱动 | 公告前波动率骤升 → 信息泄露 |
| 关联账户 + 买卖价差 | 团伙交易 | 多账户同时吃单 → 协同操作 |
最后说两句:
特征工程没有银弹。每个市场、每只股票都有自己的「脾气」。我的建议是:先跑一遍基础特征,看看哪些特征和已知的内幕交易案例有强相关性,然后再迭代优化。别一上来就搞几百个特征,容易过拟合。
嗯,这一章的内容就到这。特征工程是门手艺活,多动手、多复盘,慢慢就有感觉了。
公众号:蓝海资料掘金营,微信deep3321