特征工程:时间序列特征提取、高频交易特征、市场微观结构特征

好,咱们进入第三章。说实话,特征工程这块是我个人觉得整个数字孪生里最有意思的部分。你想想看,原始数据就像一堆散落的乐高积木,而特征工程就是教你怎么把这些积木拼成能跑能跳的机器人。我当年刚接触高频交易时,就被各种眼花缭乱的数据搞得头大,后来才慢慢摸到门道。

时间序列特征提取:从原始数据中挖金子

时间序列特征提取,说白了就是把一串数字变成有意义的指标。我习惯把这类特征分成三大类:统计特征、频域特征和形态特征。

统计特征

这是最基础的一类。均值、方差、偏度、峰度,这些大家都会算。但我要说的是——千万别只算全局统计量。我在项目中吃过亏,用全天的均值去预测下一秒的价格,结果模型完全失效。为什么?因为市场在不同时段的行为模式完全不同。

正确的做法是滑动窗口统计。比如这样:

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
我的小技巧: 窗口大小的选择很关键。我一般会试3-5个不同的窗口,然后让模型自己选。别拍脑袋定一个值,市场不会按你的窗口走。

频域特征

时间序列里藏着很多周期性规律。比如股指期货的日内效应——上午开盘、中午休盘、下午收盘,这些时间点的波动模式完全不同。我建议用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
避坑指南: 我曾经用DTW匹配所有历史数据,结果计算量爆炸。后来只匹配最近1000个窗口,效果差不多,速度快了10倍。记住,实时系统里计算效率是第一位的。

高频交易特征:毫秒级的博弈

高频交易的特征提取,跟普通时间序列完全是两码事。你想想看,每秒几千笔订单,每笔订单里还有撤单、改单、部分成交...这些信息量太大了。

我总结了几类核心的高频特征:

特征类别 具体特征 我的经验
订单簿特征 买卖价差、深度不平衡、订单斜率 深度不平衡在开盘和收盘时特别有效
交易流特征 订单到达率、撤单率、成交率 撤单率突然飙升往往是行情反转的前兆
微观动量特征 逐笔成交的方向、大小、间隔 大单拆单时,间隔会呈现规律性

这里我重点说一下订单簿特征。订单簿就是挂在交易所里的所有买单和卖单。我习惯用加权深度不平衡这个指标:

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多个特征,结果模型过拟合得一塌糊涂。我的建议是:

  1. 先做相关性分析——去掉相关性高于0.9的特征对
  2. 用特征重要性排序——随机森林或XGBoost都能做
  3. 逐步添加——从最重要的5个特征开始,每次加1个,看效果

我曾经用这个方法,把特征从80个降到了12个,模型效果反而提升了15%。有时候少即是多。

本章知识体系

下面这张图是我自己画的,把本章的核心逻辑串起来了:

特征工程核心知识体系 时间序列特征 高频交易特征 微观结构特征 统计特征 频域特征 形态特征 订单簿特征 交易流特征 微观动量 买卖价差 订单簿斜率 交易间隔 价格预测 波动率建模 做市策略 特征选择:相关性分析 → 重要性排序 → 逐步添加

这张图把三大类特征和它们的子特征、应用场景、以及最终的特征选择流程串在了一起。你可以把它当作一个检查清单——做项目时看看自己覆盖了哪些,漏了哪些。

最后说一句: 特征工程没有银弹。同样的特征,在A股有效,在期货市场可能就失效。我建议你每到一个新市场,先花一周时间做特征探索,别急着上模型。磨刀不误砍柴工,这话在金融领域尤其适用。

专注资料整理