Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现

发布时间:2026/7/16 23:16:04

Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
最终成绩目录Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现1. 为什么要复现这场比赛2. 数据结构与预测目标3. 这场比赛的关键陷阱4. 方法一跨股票 Huber 回归5. 方法二I146 情绪特征决策树桩6. 后处理常数目标修复7. 最终融合方案8. 为什么仓库中保留预生成组件9. 项目工程化整理10. 如何运行项目11. 这次复现的收获12. 总结1. 为什么要复现这场比赛BattleFin Big Data Combine Forecasting Challenge 是 Kaggle 上一场金融预测比赛。比赛任务是根据盘中价格变化和匿名信息特征预测多只股票未来短时间内的价格变化。这场比赛虽然时间较早但很适合作为金融机器学习项目练习原因有三点第一数据规模很小。训练样本只有 200 个交易日级别文件但每个文件包含 198 只股票和多个时间步这会迫使我们认真思考过拟合问题。第二特征是匿名的。输入特征包括O1-O198和I1-I244其中 O 可以理解为股票价格变化I 是匿名信息特征。由于缺少明确业务字段名模型表现很依赖数据探索和特征理解。第三目标是多输出预测。每个测试样本需要同时预测 198 只股票的未来变化这比单目标回归更考验对数据结构的把握。这次复现给我的最大启发是在小样本金融预测中复杂模型未必占优。稳定、简单、可解释的模型反而可能比大规模堆模型更可靠。2. 数据结构与预测目标比赛数据包含 510 个 CSV 文件其中 200 个为训练样本310 个为测试样本。每个文件大致可以看作某一天的盘中截面数据。每个 CSV 文件包含 55 行时间步和 442 列特征198 个 O 列O1-O198表示 198 只股票的价格变化百分比244 个 I 列I1-I244表示匿名信息或情绪相关特征数据的时间结构可以用下面这张图来理解O1 O2 ... O198 | I1 I2 ... I244Row 1 [前一日收盘基准自身变化为 0]Row 2 [盘中价格变化 %] [匿名特征]...Row 54 [盘中价格变化 %] [匿名特征]Row 55 [1:55PM 最新价格] [最新匿名特征] ← 模型输入│↓ 预测未来约 2 小时目标: 4:00PM 收盘变化 %最后一行对应当天 1:55PM 的状态预测目标是收盘前的后续价格变化。一个容易忽略但非常重要的事实是O 列不是绝对价格而是相对于前一日收盘价的变化百分比。这使得不同股票之间具有一定可比性也让横截面建模成为可能。3. 这场比赛的关键陷阱刚开始做这类任务时你很自然会想到用 LightGBM、XGBoost、深度学习或者做大量特征工程。但在这份数据上复杂模型并不一定有效。主要原因是训练样本太少。只有 200 个训练文件却要预测 198 个目标。如果把问题直接当作普通监督学习模型很容易记住训练集噪声而不是学到稳定规律。因此这个任务的关键不是模型越复杂越好而是如何利用 198 只股票之间的横截面关系如何控制模型复杂度如何处理异常值和停牌/常数目标如何让最终提交文件可验证、可复现。最终在我的复现和验证中表现最稳定的方案非常朴素一个跨股票 Huber 回归组件加上一个基于 I146 特征的决策树桩组件再做简单加权融合。一个关键点是在这个任务上下一刻等于这一刻这种什么都不做的朴素预测就能拿到约 0.425 的 Private Score。这意味着模型需要从噪声中找到超越随机游走的信号而不是盲目追求拟合精度。4. 方法一跨股票 Huber 回归第一个核心组件是跨股票 Huber 回归。直觉是同一交易日里股票之间并不是完全独立的。某些股票可能受共同市场因子、行业联动或相似信息冲击影响。因此可以用其他股票的变化来预测目标股票的未来变化。具体做法如下1. 对 198 只股票计算训练集上的两两 Pearson 相关性矩阵198×1982. 对每个目标股票选出相关性绝对值最高的 top-20 候选股票3. 过滤 6σ 极端离群值对每个候选股票单独跑 HuberRegressor 做 t 检验4. 保留 p 0.04 的候选选 p 值最小的 2 个作为最终预测变量5. 用这 2 个变量做多变量 Huber 回归拟合预测增量乘以 0.5 收缩系数6. 得到组件 E_robust_pp.csv。为什么使用 Huber 回归金融数据中异常点很多普通线性回归容易被极端值带偏。你可以这样理解普通最小二乘回归像直接取所有评委打分的算术平均——只要有一个评委打了离谱的 0 分或 100 分整个均分就被带跑了。Huber 回归则像专业赛事评分——去掉一个最高分去掉一个最低分对极端打分自动降权不让少数离谱值绑架整体判断。因此更适合这种噪声较重的小样本金融数据。这个方法体现了一个重要思想在小样本下与其堆复杂模型不如先找到稳定的结构性信息。这里的结构性信息就是股票之间的横截面联动——不要只盯着一只股票的过去价格更要看看它周围 197 个邻居现在情况如何。5. 方法二I146 情绪特征决策树桩第二个核心组件只使用一个特征I146。这听起来很反直觉。数据里有 244 个 I 特征为什么最终选择一个单独特征原因是在小样本任务中多特征模型很容易过拟合而一个稳定的单特征规则有时反而泛化更好。I146 决策树桩的逻辑非常简单1. 取每个样本最后一个时间步的 I1462. 枚举可能的分裂阈值3. 将训练样本分成 high / low 两组4. 观察两组目标变化的均值差异5. 在测试集上按同一阈值分组预测增量乘以 0.3 收缩系数6. 得到 E_i146_stump_pp.csv。它本质上是一个非常浅的决策树只做一次二分。你可以把它想象成你在每个时刻只问一个问题——I146 高还是低高于某个阈值的一组和低于阈值的一组在目标均值上存在可利用的差异。就这么简单。虽然表达能力很弱但这种弱表达能力正好限制了过拟合。这个组件的价值不在于复杂而在于稳定。它为最终融合提供了与 Huber 回归不同来源的信息Huber 回归利用的是邻里关系其他股票怎么动I146 树桩利用的是情绪方向匿名特征在说什么。两者来源不同、互不重复组合在一起才有增益这就是集成的本质。6. 后处理常数目标修复金融数据里存在一些目标在最后几个时间步几乎不变化的情况。这可能对应停牌、无交易或数据本身保持常数。如果某只股票在最后几个时间步的标准差接近 0那么继续让模型预测一个变化值往往会引入额外噪声。更稳妥的方式是直接把预测值设为最后一个已知值。项目中的 post-processing 逻辑就是做这件事if last_6_steps_std 1e-9:prediction last_known_value这个步骤看似简单但对最终分数有帮助。它体现了比赛中非常常见的一点模型之外的数据规则和后处理往往和模型本身一样重要。7. 最终融合方案最终提交由两个后处理后的组件加权融合得到M 0.40 * E_robust_pp 0.60 * E_i146_stump_ppM np.clip(M, -30, 30)对应文件为E_robust_pp.csv # 跨股票 Huber 回归组件E_i146_stump_pp.csv # I146 决策树桩组件M_r40_i60_c30.csv # 最终提交文件其中clip(-30, 30)的作用可以继续用评委打分的类比来理解Huber 回归是去掉最高分和最低分——降低极端值的权重而 clip 是打分规则本身规定 0-10 分——不管模型算出什么离谱数字输出强制框死在 ±30% 以内。一支股票一天涨跌超过 30% 极其罕见所以把预测截断在这个范围里既能防住 ±500% 这种荒谬输出拖垮 RMSE又不会伤害正常预测。最终提交文件的 Private Score 为0.42426。这个结果与榜首0.42239非常接近说明轻量级模型在该任务上已经具有很强竞争力。8. 为什么仓库中保留预生成组件这是复现项目中特别需要说明的一点。仓库中提供了E_robust_pp.csv和E_i146_stump_pp.csv这两个预生成组件为了保证最终提交文件可以被bit-for-bit 精确验证。原因在于sklearn.linear_model.HuberRegressor的底层 solver 可能受到环境影响例如scikit-learn 版本BLAS / LAPACK 实现操作系统CPU 架构。这些差异在单个预测值上可能很小但在 310 × 198 的预测矩阵上会累积最终可能导致提交文件和公开结果不完全一致。因此本项目采用两条复现路径路径 A直接运行 verify_submission.py验证最终融合公式和提交文件一致性路径 B下载 Kaggle 原始数据后运行 reproduce_ens_v2.py复现完整训练流程和方法逻辑。这样既能保证最终结果可验证也能保留完整的建模过程。9. 项目工程化整理为了让项目适合公开发布我对仓库做了以下整理1. 不上传 Kaggle 原始数据只保留 data/raw/.gitkeep2. 使用 .gitignore 防止误提交 data/raw/*.csv、__pycache__、.pyc、venv 等文件3. 添加 MIT License4. 提供 verify_submission.py 验证最终融合文件5. 提供 REPRODUCE.md 说明不同复现路径6. 将方法分析和复现过程放入 docs/。10. 如何运行项目安装依赖pip install -r requirements.txt如果只想验证最终提交文件python verify_submission.py如果想完整复现训练过程需要先从 Kaggle 官方页面下载原始数据并放入data/raw/然后运行python reproduce_ens_v2.py需要注意的是完整训练过程可能因为本地环境差异产生轻微数值偏差。因此最终分数

相关新闻

豆包、千问同日下线智能体:一份AI拟人化监管新规的技术合规深度解读

豆包、千问同日下线智能体:一份AI拟人化监管新规的技术合规深度解读

2026/7/16 23:09:00

前言 2026年7月4日,字节跳动旗下豆包和阿里旗下通义千问几乎同时宣布: 豆包:智能体功能将于 7月15日 下线,用户可导出历史数据至 10月15日通义千问:拟人化互动类及用户自建智能体 7月10日 先行下线,全部智…

Windows 11/10 OpenSSH 客户端 3 种安装方式对比:GUI、PowerShell、离线包

Windows 11/10 OpenSSH 客户端 3 种安装方式对比:GUI、PowerShell、离线包

2026/7/16 23:15:02

Windows 系统下 OpenSSH 客户端的三种安装方案深度评测对于需要在 Windows 环境中进行远程服务器管理的开发者和运维人员来说,OpenSSH 客户端是不可或缺的工具。本文将全面对比 GUI 图形界面安装、PowerShell 命令安装和离线包安装这三种主流方案,帮助您…

当40岁失业门将沃齐尼亚扑出梅西4次必进球,我悟了:这就是Hermes Agent 自进化架构的终极形态

当40岁失业门将沃齐尼亚扑出梅西4次必进球,我悟了:这就是Hermes Agent 自进化架构的终极形态

2026/7/9 17:27:47

文章目录一、一场让全世界程序员沉默的比赛二、沃齐尼亚的"学习闭环":一个被忽视的认知模型三、Hermes Agent:一个会"记住教训"的 AI 架构3.1 三层记忆 沃齐尼亚的三重认知体系3.2 Skill 自动沉淀 赛后复盘写成肌肉记忆3.3 上下文…

VSCode CMake调试进阶:从配置到CMake脚本调试

VSCode CMake调试进阶:从配置到CMake脚本调试

2026/7/16 23:10:55

1. 为什么需要调试CMake脚本?每次修改CMakeLists.txt后都要反复试错?明明变量传递逻辑没问题却总报错?CMake 3.27版本带来的调试器功能彻底改变了这种低效工作模式。想象一下,当你的项目出现以下症状时:条件编译分支始…

企业微信第三方应用扫码登录:从配置到回调的实战解析

企业微信第三方应用扫码登录:从配置到回调的实战解析

2026/7/16 23:10:55

1. 企业微信第三方应用扫码登录概述企业微信第三方应用扫码登录是一种安全便捷的身份验证方式,允许用户通过企业微信App扫描二维码快速登录第三方应用。这种方式不仅提升了用户体验,还确保了身份验证的安全性。对于开发者而言,实现这一功能需…

实战指南:Windows防火墙高级规则配置与安全策略设计

实战指南:Windows防火墙高级规则配置与安全策略设计

2026/7/16 23:10:55

1. Windows防火墙基础概念与安全策略设计Windows防火墙作为操作系统内置的安全防护组件,本质上是一个基于主机的流量过滤系统。它通过分析网络数据包的源/目标地址、端口号、协议类型等特征,按照预设规则决定是否允许通信。在实际工作中,我发…

Demo 跑得通只是热身:为什么你的大模型简历在“权限与日志”这关就挂了?

Demo 跑得通只是热身:为什么你的大模型简历在“权限与日志”这关就挂了?

2026/7/16 23:10:55

聊《一份看似完整的AI大模型就业方案,为什么投递时没效果?》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要很多程序员转做大模型开发时,习惯把精力全砸在 Prompt 调优和 Age…

A股量化分析平台部署指南:从环境配置到批量回测实战

A股量化分析平台部署指南:从环境配置到批量回测实战

2026/7/16 23:10:55

这类工具最值得先看的不是功能列表,而是能不能在普通环境里稳定跑起来。我一般会先确认它到底解决的是数据复盘、策略回测还是实时决策问题,再决定要不要花时间部署。这个 A 股方向模型平台的核心价值在于把主观感觉换成数据驱动。它用本地模型分析历史行…

CANN AscendC MakeLayout布局构造

CANN AscendC MakeLayout布局构造

2026/7/16 23:00:54

MakeLayout 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/16 14:29:31

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

2026/7/16 0:09:31

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

跨境电商多语言商品图翻译方案实现

跨境电商多语言商品图翻译方案实现

2026/7/16 0:09:31

一、问题引入对于做跨境电商的卖家来说,多语言商品图的制作一直是令人头疼的环节。当你准备在亚马逊、Shopee、Lazada等多个平台同步上架新品时,首先遇到的就是图片翻译问题。以一位做家居用品的卖家为例,他需要将200张商品图片中的英文文案全…

Windows系统文件d3dx9_36.dll丢失找不到问题解决

Windows系统文件d3dx9_36.dll丢失找不到问题解决

2026/7/16 0:09:31

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…