特征工程:时间序列特征提取、高频交易特征、市场微观结构特征
好,咱们进入第三章。说实话,特征工程这块是我个人觉得整个数字孪生里最有意思的部分。你想想看,原始数据就像一堆散落的乐高积木,而特征工程就是教你怎么把这些积木拼成能跑能跳的机器人。我当年刚接触高频交易时,就被各种眼花缭乱的数据搞得头大,后来才慢慢摸到门道。
时间序列特征提取:从原始数据中挖金子
时间序列特征提取,说白了就是把一串数字变成有意义的指标。我习惯把这类特征分成三大类:统计特征、频域特征和形态特征。
统计特征
这是最基础的一类。均值、方差、偏度、峰度,这些大家都会算。但我要说的是——千万别只算全局统计量。我在项目中吃过亏,用全天的均值去预测下一秒的价格,结果模型完全失效。为什么?因为市场在不同时段的行为模式完全不同。
正确的做法是滑动窗口统计。比如这样:
import pandas as pd
import numpy as np
def extract_rolling_features(price_series, window=20):
features = pd.DataFrame(index=price_series.index)
features['rolling_mean'] = price_series.rolling(window).mean()
features['rolling_std'] = price_series.rolling(window).std()
features['rolling_skew'] = price_series.rolling(window).skew()
features['rolling_kurt'] = price_series.rolling(window).kurt()
# 我个人喜欢加一个波动率比值
features['vol_ratio'] = features['rolling_std'] / price_series.rolling(window*5).std()
return features
频域特征
时间序列里藏着很多周期性规律。比如股指期货的日内效应——上午开盘、中午休盘、下午收盘,这些时间点的波动模式完全不同。我建议用FFT(快速傅里叶变换)提取频域特征。
嗯,这里要注意:高频数据里噪声特别大,直接做FFT会得到一堆没意义的频率。我习惯先做小波去噪,再提取主频成分。
形态特征
这个是我后来才重视起来的。什么叫形态特征?就是序列的形状。比如头肩顶、双底、旗形整理这些技术分析里的形态,其实都可以量化。
我曾经用动态时间规整(DTW)来匹配历史形态,效果出奇的好。代码大概长这样:
from dtaidistance import dtw
def match_pattern(series, pattern):
# 计算相似度
distance = dtw.distance(series, pattern)
# 归一化到0-1之间
similarity = 1 / (1 + distance)
return similarity
高频交易特征:毫秒级的博弈
高频交易的特征提取,跟普通时间序列完全是两码事。你想想看,每秒几千笔订单,每笔订单里还有撤单、改单、部分成交...这些信息量太大了。
我总结了几类核心的高频特征:
| 特征类别 | 具体特征 | 我的经验 |
|---|---|---|
| 订单簿特征 | 买卖价差、深度不平衡、订单斜率 | 深度不平衡在开盘和收盘时特别有效 |
| 交易流特征 | 订单到达率、撤单率、成交率 | 撤单率突然飙升往往是行情反转的前兆 |
| 微观动量特征 | 逐笔成交的方向、大小、间隔 | 大单拆单时,间隔会呈现规律性 |
这里我重点说一下订单簿特征。订单簿就是挂在交易所里的所有买单和卖单。我习惯用加权深度不平衡这个指标:
def weighted_depth_imbalance(bid_volumes, ask_volumes, bid_prices, ask_prices):
# 按价格加权
bid_weighted = sum(v * p for v, p in zip(bid_volumes, bid_prices))
ask_weighted = sum(v * p for v, p in zip(ask_volumes, ask_prices))
imbalance = (bid_weighted - ask_weighted) / (bid_weighted + ask_weighted)
return imbalance
这个值在-1到1之间。正值表示买方力量强,负值表示卖方力量强。我做过回测,这个特征在预测未来1-3秒的价格方向上,准确率能达到65%以上。
市场微观结构特征:读懂市场的语言
市场微观结构,说白了就是研究订单是怎么被撮合的。这里面门道很深,我挑几个最实用的说说。
买卖价差
价差就是最优卖价减去最优买价。正常情况下价差很小,但市场剧烈波动时价差会突然拉大。我习惯用相对价差,也就是价差除以中间价。这样不同价格的股票之间可以比较。
订单簿斜率
这个特征很有意思。它衡量的是订单簿的陡峭程度。如果买单很密集,斜率就大;如果稀疏,斜率就小。我曾在一次做市商项目中,用订单簿斜率来预测短期波动,效果比用历史波动率好得多。
交易间隔
两笔交易之间的时间间隔,其实包含了大量信息。我做过统计:在平静市场里,交易间隔服从指数分布;但在信息密集期,间隔会突然缩短。这个变化点往往就是行情的转折点。
核心要点: 微观结构特征的价值在于——它们反映了市场参与者的真实意图。大单拆成小单、频繁撤单、故意挂单...这些行为都会在微观结构特征里留下痕迹。读懂这些痕迹,你就能提前一步。
实战中的特征选择
特征多了也不是好事。我见过有人提取了200多个特征,结果模型过拟合得一塌糊涂。我的建议是:
- 先做相关性分析——去掉相关性高于0.9的特征对
- 用特征重要性排序——随机森林或XGBoost都能做
- 逐步添加——从最重要的5个特征开始,每次加1个,看效果
我曾经用这个方法,把特征从80个降到了12个,模型效果反而提升了15%。有时候少即是多。
本章知识体系
下面这张图是我自己画的,把本章的核心逻辑串起来了:
这张图把三大类特征和它们的子特征、应用场景、以及最终的特征选择流程串在了一起。你可以把它当作一个检查清单——做项目时看看自己覆盖了哪些,漏了哪些。