获奖文章(第七名解决方案)
致谢
我要感谢 Optiver 和 Kaggle 组织了这次比赛。这个挑战提出了一个在金融市场时间序列预测领域中具有重大和复杂性的问题。
方法论
我的方法结合了 LightGBM 和神经网络模型,对神经网络进行了最少的特征工程。目标是结合这些模型以降低最终预测的方差。
特征工程
LightGBM 增强
使用的特征包括:
- 订单簿失衡:利用公开分享的 imb1、imb2 等。
- 趋势指标:使用
diff()
进行时间变化。 - 基于成交量的累积量:汇总时间内的成交量。
- 全球股票统计:计算历史股票数据的平均值、中位数和标准差。
- 偏差特征:树模型和神经网络模型都受益于表示偏离中位数的原始特征:
- 在线学习:适用于神经网络和 LightGBM 模型。
偏差特征和在线学习帮助显著降低了错误率。
def create_deviation_within_seconds(df, num_features):
groupby_cols = ['date_id', 'seconds_in_bucket']
new_columns = {
}
for feature in num_features:
grouped_median = df.groupby(groupby_cols)[feature].transform('median')
deviation_col_name = f'deviation_from_median_{
feature}'
new_columns[deviation_col_name] = df[feature] - grouped_median
return pd.concat([df, pd.DataFrame(new_columns)], axis=1)
神经网络架构
该架构包括 LSTM 和卷积网络(ConvNet)模型,结合全球股票统计和偏差特征以改善收敛性。
我已经在 Kaggle 上发布了神经网络模型的结构,详见此帖:
[Optiver Trading at the Close Discussion]
- ConvNet: Optiver Conv Just IMB 推理清理
- LSTM: Optiver No FE LSTM 推理清理
验证策略
采用简单的基于时间的拆分进行模型验证。
以下是扩展的一维卷积模型:
def apply_conv_layers(input_layer, kernel_sizes, filters=16, do_ratio=0.5):
conv_outputs = []
for kernel_size in kernel_sizes:
conv_layer = Conv1D