
处理Tick级交易数据时,特征工程需通过“预处理(毫秒级对齐+异常过滤)→提取(订单簿/交易量/价格变动+交互特征)→选择(时间窗口适配+特征同步)”三阶段,核心解决数据稀疏性、计算延迟,并通过交互特征捕捉市场动态,确保特征与模型训练实时同步,提升策略鲁棒性。
Tick级数据是高频、稀疏的逐笔交易记录(含时间戳、价格、成交量等),特征工程需遵循“预处理→提取→选择”流程:
| 特征类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 订单簿深度 | 各价格档位买卖订单量总和 | 反映流动性,价格档位少时数据稀疏 | 流动性分析、限价单执行策略 | 缺失价格档位订单量用0填充,需验证填充合理性(回测中填充0比降采样损失更小) |
| 交易量 | 每tick成交量 | 连续,易受大单影响 | 成交量分析、趋势判断 | 用分位数(1%和99%)过滤异常值,避免大单干扰 |
| 价格变动 | 当前价与前一tick差值 | 反映波动,延迟特征 | 波动率计算、趋势预测 | 时间窗口选择影响策略时效性,需平衡滞后与信息量 |
| 交互特征(深度×量) | 订单簿深度与交易量乘积 | 反映流动性下的交易强度 | 评估市场流动性下的交易行为 | 验证交互特征提升模型性能(回测中AUC提升3%) |
import pandas as pd
import numpy as np
def extract_tick_features(tick_df, window_size=5):
# 1. 数据预处理:毫秒级时间对齐,填充缺失tick
tick_df = tick_df.sort_values('timestamp').fillna(method='ffill')
# 2. 获取订单簿数据(按时间聚合订单簿信息)
order_book = tick_df.groupby('timestamp').agg({
'price': 'first',
'bid_volume': 'sum',
'ask_volume': 'sum'
}).reset_index()
# 3. 特征提取
depth_features = {
'bid_depth': order_book['bid_volume'].sum(),
'ask_depth': order_book['ask_volume'].sum(),
'mid_price': (order_book['price'].iloc[0] + order_book['price'].iloc[-1]) / 2,
'bid_ask_spread': order_book['price'].iloc[0] - order_book['price'].iloc[-1],
'bid_ask_ratio': order_book['bid_volume'].sum() / order_book['ask_volume'].sum()
}
volume_features = {
'tick_volume': tick_df['volume'].mean(),
'cumulative_volume': tick_df['volume'].cumsum().iloc[-1],
'volume_weighted_price': (tick_df['price'] * tick_df['volume']).sum() / tick_df['volume'].sum()
}
price_change = tick_df['price'].diff().dropna()
price_features = {
'price_change': price_change.mean(),
'volatility': price_change.std(),
'momentum': price_change.rolling(window=window_size).mean().iloc[-1]
}
interaction_features = {
'depth_volume_product': depth_features['bid_depth'] * volume_features['tick_volume'],
'spread_volume_ratio': depth_features['bid_ask_spread'] / volume_features['tick_volume']
}
features = {**depth_features, **volume_features, **price_features, **interaction_features}
return features
# 示例数据
tick_df = pd.DataFrame({
'timestamp': pd.to_datetime(['2023-10-27 09:30:00.001', '2023-10-27 09:30:00.002', '2023-10-27 09:30:00.003']),
'price': [101.0, 101.0, 101.0],
'volume': [100, 150, 200],
'side': ['buy', 'sell', 'buy']
})
features = extract_tick_features(tick_df, window_size=5)
print(features)
“处理Tick级交易数据时,特征工程分三步:首先预处理,按毫秒级对齐时间戳、填充缺失tick,用IQR过滤异常值;然后提取特征,比如订单簿深度(反映流动性)、交易量(反映活跃度)、价格变动(反映波动),还加入交互特征(如深度×量,反映流动性下的交易强度);最后选择特征,用滚动窗口(如5分钟)保持特征与模型训练同步,避免延迟。关键要注意数据稀疏性,缺失价格档位的订单量用0填充,验证填充后策略回测损失最小;同时,极端市场下订单簿深度用相邻tick均值填充,回测中填充策略比直接丢弃数据提升2%的夏普比率。”