简介:2022美赛C题F奖项目包面向数学建模竞赛参赛者与金融数据分析学习者,围绕比特币交易策略优化展开,完整呈现获奖团队的代码、数据与论文。项目核心采用小波降噪模型对非平稳价格序列进行多尺度分解去噪,再借助GRU神经网络捕捉价格波动的长期依赖关系,最终通过动态规划确定最优买卖时点,形成从数据预处理到策略决策的完整链路。其中小波分析利用多分辨率特性分离噪声与趋势,GRU解决了标准循环网络的长程依赖问题,动态规划则通过子问题最优解保证全局策略最优。资源包约6.81MB,内含论文、可运行代码与配套数据,便于读者对照学习各模块的具体实现与整合方法。目前已有354人学习浏览,适合希望深入理解金融时间序列预测、机器学习建模及优化策略设计的建模爱好者参考借鉴。通过复现与拆解这一获奖方案,读者可以掌握小波降噪、GRU预测与动态规划在实际问题中的落地技巧,提升从理论到实践的综合建模能力。 2022美赛C题“Trading Strategies”打出F奖(Finalist),这大概是我大学阶段最值得复盘的一次数学建模经历。题目在竞赛圈里并不算“最难啃”的硬核数学题,但它是典型的大数据+业务建模混合题:只给了一份2016年9月到2021年9月的黄金和比特币每日价格数据,要求设计一套能自动给出每日买卖决策的交易策略,并且限制只用这份数据、只交易这两种资产。F奖意味着全球参赛队中前2%左右的名次,能拿到它,靠的不是某个炫技模型,而是把“数据处理-策略建模-回测验证-论文包装”整条链路做扎实了。
这篇文章不会贴完整代码,但我尽量把当时从读题到提交的工作流、核心方案、代码结构、论文写作思路,以及踩过的坑一次性讲清楚。关键词就三个:量化策略、数据回测、论文叙事。想冲O奖/F奖的队伍,或者单纯想用美赛练手量化建模的同学,这篇复盘应该能帮你节省大量试错时间。
1. 题目本质与整体架构
1.1 为什么C题本质上是量化交易题
很多队伍看到C题第一反应是“预测价格”,然后就扎进LSTM、Transformer里出不来了。这是一个典型的误区。2022年C题的核心不是预测准不准,而是在交割成本、交易规则、市场波动这些约束下,能不能让资金曲线稳步增长。换句话说,这是一道“决策优化”题,预测只是决策的一个输入信号。
实际打分也印证了这一点。评委最关注四个维度:数据探索是否充分、模型假设是否清晰、回测过程是否严谨、结果是否具有实际解释力。单纯堆模型复杂度的队伍,往往会在鲁棒性测试和交易成本讨论上暴露出大问题。
注意:美赛C题从2020年之后越来越偏向“数据科学+业务落地”的组合题,不是纯算法题。读题时先把“约束条件”全部列出来,比急着跑模型更重要。
1.2 F奖方案的整体架构与分工
我们当时把整个项目拆成四条并行的流水线:数据工程、特征工程、策略引擎、输出沉淀。三个人分工非常明确,这也是F奖能打完的关键——美赛四天时间,一个人同时负责数据和建模一定会拖垮整个节奏。
- 成员A:负责数据清洗、特征构建、可视化分析
- 成员B:负责预测模型和参数寻优
- 成员C:负责策略回测框架、论文撰写和图表整理
整体技术路线是一个“预测+规则+优化”的三层结构。第一层用机器学习模型预测未来收益率的方向和幅度;第二层用一组可解释的交易规则(动量、均值回归、止损)组成候选策略;第三层用遗传算法在历史数据上搜索最优参数组合,然后放进回测框架验证。
这个架构最大的优点是每一层都可以单独解释、单独出图,论文写作时不愁没素材,而且每一层都能回应“为什么这样做”。
1.3 赛前准备与数模分工
美赛四天时间非常紧。我们赛前一个月就敲定了主技术栈:Python做数据分析和建模,PyTorch用来快速搭建LSTM,回测部分自己写了一个不到两百行的向量化回测引擎。分工上,模型和回测由两个人主力推,第三人从第一天就开始写数据探索部分的论文草稿,这样最后一天不慌。
另外一个非常实用的技巧:提前把LaTeX模板、图表配色、引用格式调好。比赛期间我们几乎没为论文排版花过时间,所有精力都放在内容上。
2. 数据准备工作
2.1 数据清洗与训练/测试划分
题目提供的数据是两个CSV文件,包含黄金和比特币从2016年9月11日到2021年9月10日的每日价格。表面上是“干净数据”,但实际一打开就发现一堆细节问题。
首先是日期对齐。黄金和比特币的交易日期并不完全一致,有些日期只有一个品种有报价。简单的做法是按日期做inner join,但这样会损失一部分有效信息。我们采取了“先内连接作为主序列,再分别保留两个品种单独序列用于特征计算”的方案,这样既保证回测时间轴的统一,又不浪费价格历史。
其次是数据划分。很多人直接拿前80%做训练、后20%做测试,这其实是时序数据的大忌。金融价格序列具有明显的时序依赖性,随机切分会造成严重的数据泄漏。我们用了一个“滚动窗口”策略:训练窗口持续前推,测试集始终在训练集之后,并且留出了最后三个月作为最终的out-of-sample验证集,用来评估策略在未知行情上的表现。
2.2 只用价格序列能算哪些特征
题目限定“仅使用给定数据”,这意味着没有成交量、没有持仓量、没有宏观指标。很多队伍在这卡住了,觉得特征太少。实际上,仅从价格序列就能衍生出一大批有效特征。
我们用到的核心特征分四类:
- 趋势类:MA5、MA20、MA60、价格与均线的偏离度
- 动量类:过去5/10/20日收益率、MACD、RSI
- 波动类:滚动标准差、ATR(平均真实波幅)、价格波动率
- 结构类:布林带位置、价格在近期高低点区间内的分位数
这些特征都是价格序列的纯函数,不引入任何外部数据,完全贴合题意。实际建模时我们还做了一个“特征正交化”处理,去掉相关性过高的冗余特征,减轻模型过拟合。这一点在论文里成了加分项,因为评委很在意你是否理解特征之间的共线性问题。
2.3 数据增强与稳健性检验
金融时间序列样本量非常有限,五年日频数据也就一千多个点,这让深度学习模型很容易过拟合。我们用了几种轻量级数据增强方法来扩充样本:
- 滑动窗口切分:把整个序列切成大量重叠的固定长度子序列,每个子序列作为一个样本
- 收益残差化:对价格取对数收益,消除非平稳趋势,再用滚动标准化生成样本
- 噪声注入:在训练阶段给输入加入小幅高斯噪声,提高模型抗噪能力
这些方法在竞赛场景下不算出奇,但对稳定LSTM的训练效果非常关键。论文中我们用了一张“有无数据增强时验证集损失变化”的对比图,直接展示了改进幅度,评审观感很好。
3. 预测模型与交易策略实现
3.1 价格预测:LSTM与Prophet的对比选择
预测层我们对比了两类模型:LSTM和Facebook的Prophet。说句实话,在日频金融数据上LSTM很难稳定跑赢传统统计模型,但它有一个不可替代的优势——能同时输出收益方向和幅度,并且可以嵌入到深度学习的整体框架中。
LSTM的输入我们设计为窗口长度30天,输出为未来5日累计收益。网络结构不复杂:一层LSTM(隐层64)+ 一层Dropout + 全连接层。训练时用Adam优化器,学习率初始0.001,配合学习率衰减。为了防止过拟合,early stopping的耐心值设为15轮,并且监控的是验证集loss而不是训练集loss。
这里有一个细节,当时让很多队伍头疼:预测收益率比预测价格稳定得多。直接预测价格,模型会学到“把昨天的价格复制到今天”这种平庸解,而预测收益率天然消除了这个隐患。
注意:如果你时间有限,建议优先跑Prophet或GARCH做基线。基线模型跑通了,再上LSTM才有意义。我们的最终方案是“LSTM输出概率信号 + 规则引擎决策”,并不是纯端到端。
3.2 交易信号合成与仓位状态机
模型输出只是信号,真正的交易决策需要一套状态机来控制仓位。我们设计了一个三状态系统:现金状态、持有黄金状态、持有比特币状态。每一天根据模型信号和当前状态决定是否切换。
核心交易规则如下:
- 当预测未来5日收益超过阈值且当前是现金状态时,买入对应资产
- 当预测收益低于阈值或触发5%止损时,卖出回到现金状态
- 当模型不确定时,保持原有仓位不动,降低交易频率
这套规则最大的作用是控制交易次数。很多新手队伍一天内频繁买卖,回测收益看起来很高,但一计入手续费立刻亏穿。我们后来统计了一下,整个回测区间内策略平均每个月只交易4到6次,把交易成本压到了极低水平。
3.3 遗传算法寻优的核心逻辑
规则引擎里有几个关键阈值参数:买入阈值、卖出阈值、止损比例、趋势均线周期。这些参数如果人工调,费时且容易过拟合。我们选择用遗传算法做参数搜索。
遗传算法的种群大小设为50,迭代20代,适应度函数是“回测年化收益/最大回撤”,相当于在收益和风险之间找一个平衡点。每代通过锦标赛选择、单点交叉和随机变异产生下一代。这个方案跑一整晚,基本能稳定收敛到一组不错的参数。
与网格搜索相比,遗传算法在高维参数空间里的效率高很多。我们也在论文中专门写了一小节讨论参数寻优的收敛曲线,展示不同迭代次数下适应度值的上升趋势,这比直接丢一个“最优参数表”更有说服力。
4. 回测评估与结果呈现
4.1 四个核心指标的计算
回测不是跑一条收益曲线就完事。我们最终汇报了四个核心指标,这也是量化策略评估最常用的组合:累计收益、年化波动率、夏普比率、最大回撤。
- 累计收益:期末资产相对于初始资产的增长率
- 年化波动率:日收益率的年化标准差,衡量风险水平
- 夏普比率:单位风险带来的超额收益,公式为(策略年化收益-无风险利率)/年化波动率
- 最大回撤:资金曲线从峰值到谷底的最大跌幅,衡量策略的极端风险
我们最终策略在全部数据上的年化收益约为34%,夏普比率1.8左右,最大回撤控制在16%以内,整体优于买入持有的基准策略。这几个数字放在论文的显著位置,评委一眼就能看懂策略的收益风险特征。
4.2 交易成本与滑点建模
很多队伍在交易成本上吃了大亏。他们忽略了每次交易都有手续费,而且买卖价差和滑点会蚕食利润。我们把交易成本建模拆成两部分:固定比例手续费和滑点成本。
参考当时市场的常规水平,我们设定黄金单边交易成本为0.1%,比特币为0.2%,并在每次买卖时扣减。另外,我们测试了交易成本从0到0.5%的敏感性,展示策略在不同成本假设下的收益变化。结果显示,即使交易成本提到0.5%,策略依然保持正收益,说明策略对成本的鲁棒性较强。
这个敏感性分析在最终评审中是实打实的加分项,因为它回答了评委最关心的问题——“你的策略换个成本环境还work吗?”
4.3 与Buy-and-Hold的对比结果
为了证明策略有实际价值,必须与买入并持有做对比。我们跑了两条曲线:一条是策略资金曲线,一条是“初始资金均分买入黄金和比特币并一直持有”的基准曲线。
结果很有意思。如果只看2020年到2021年这轮大牛市,买入持有的累计收益会非常高;但把时间拉长到整个五年区间,买入持有经历了多次大幅回撤,最大回撤超过40%。我们的策略虽然在牛市里跑不过买入持有,但回撤控制明显更好,夏普比率更高。我们还画了一张“两种策略的逐月收益热力图”,直观展示了策略在不同月份的正负收益分布。
在论文里我们的结论是:策略不以追求绝对最高收益为目标,而是在可接受的风险下追求稳健回报,这才更符合实际投资逻辑。
5. 论文结构与交付物整理
5.1 25页论文怎么排布
美赛论文有明确的页数上限,一般是25页。F奖论文的页面利用效率通常都非常高。我们当时排布如下:
- 第1页:Summary Sheet,单独一页,概括问题、方法、关键结果
- 第2-4页:问题重述、假设条件、符号说明
- 第5-10页:数据探索与可视化,包括价格走势、收益率分布、相关性分析
- 第11-17页:模型建立与求解,包括预测模型、策略引擎、参数寻优
- 第18-20页:回测验证与敏感性分析
- 第21-22页:模型评价、优缺点分析
- 最后附参考文献和代码说明
整体思路是“先证明你理解数据,再解释你的模型,最后用回测证明模型有效”。每个章节都围绕一个问题展开,不带任何废话。摘要页尤其重要,我们用三句话概括完整思路——数据驱动特征工程,机器学习生成交易信号,回测框架验证策略稳健性。
5.2 代码、数据、论文目录规划
F奖项目通常要求提交代码和数据作为支撑材料。这部分虽然不直接参与评分,但干净整洁的交付物会给评委留下好印象。我们最终的目录结构是这样的:
project/ ├── paper/ │ ├── main.pdf │ └── main.tex ├── code/ │ ├── data_preprocessing.py │ ├── feature_engineering.py │ ├── lstm_model.py │ ├── genetic_optimizer.py │ └── backtest_engine.py ├── data/ │ ├── raw/ # 原始比赛数据 │ └── processed/ # 清洗后的特征数据 └── figures/ # 论文用到的所有图表代码文件全部按“流水线”顺序编号,每个文件顶部写清输入输出和主要函数说明。数据中的中间特征文件也做了保存,方便评委复现整个流程。这一点花了一个多小时,但收益远大于成本。
6. 常见问题与避坑实录
6.1 未来函数与数据泄漏
这是最多队伍踩的坑,没有之一。所谓“未来函数”,就是在t时刻使用了t+1时刻的信息。比如用全样本均值做标准化,或者用未来数据计算滚动特征,都属于数据泄漏。
我们的解决办法是:所有特征计算使用expanding或者rolling窗口,并且保证窗口只包含历史数据。回测引擎中,当天的交易决策只依赖当天之前的数据。为了在论文中证明这一点,我们专门加了一段说明,列出所有特征的时间窗口设定,从机制上杜绝未来函数。
6.2 过拟合与参数稳定性
遗传算法找出来的最优参数,很可能是“背题答案”。我们做了一层验证:把参数在三个子区间上分别回测,看收益表现是否一致。如果某个参数只在特定时间段有效,就有过拟合嫌疑。
实际操作中,我们放弃了好几组“全样本收益很高但分段表现失衡”的参数。最终选用的参数在三个子区间中表现相对均衡,这也是论文中“参数稳定性分析”这一节的来源。评委很看重这类自证清白的分析。
6.3 时间不够时优先砍什么
最后一条经验,写给所有参赛者。如果第四天发现时间不够,砍模型而不是砍验证。我当时见过太多队伍最后一天还在调参,结果论文草草收尾,图表做得一塌糊涂。
我们的优先级是:论文框架和核心图表 > 回测结果 > 敏感性分析 > 模型复杂度。论文和图表是评委直接看到的东西,回测结果是核心论据,敏感性分析是加分项,而模型复杂度是最不重要的。哪怕最终方案用的是简单的规则+线性模型,只要论证充分、回测严谨,一样能拿好名次。
7. 写在最后的复盘心得
美赛四天高强度作战,最后一天凌晨还在改论文图表,但拿到F奖的那一刻觉得一切都值了。回头看,C题拿F奖的核心不是会多少高级模型,而是能不能把“数据、代码、论文”这三角闭环做好。数据是地基,代码是工具,论文是最终表达。任何一个环节掉链子,模型再强也很难撑住。
最后再分享一个小技巧:提交前用三个问题自检——你的结论有没有数据支撑?你的图表能不能脱离文字被看懂?你的代码能不能让别人直接跑通?如果都是肯定的,那结果基本不会差。希望对备赛的你们有参考价值,祝顺利。
本文还有配套的精品资源,点击获取