资讯动态

2022美赛C题F奖拆解:动态规划与佣金摩擦下的交易策略

发布时间:2026/10/26 19:08:56 来源:尧图企业网站定制
简介面向2022年美国大学生数学建模竞赛C题比特币交易策略的F奖项目资料适合备赛美赛、学习金融时间序列建模与优化决策的本科生及建模爱好者参考。资源以7z压缩包提供体积约6.81MB上游未给出文件总数与类型明细但标题表明内容涉及代码、数据与论文可支撑从赛题理解、模型复现到结果分析的完整学习链路。方案重点包括小波降噪预处理、基于GRU的价格预测以及动态规划买卖策略并展示如何将三类方法整合为可运行的交易决策流程。已有357人学习可作为F奖论文写作、模型组合与代码实现的对照样本也便于复盘数据预处理、预测评估和策略优化中的关键细节提升将理论方法落地到竞赛论文与项目实践的能力。1. 从F奖论文倒推2022美赛C题真正拉开差距的不是模型复杂度2022美赛C题的题面很短两条价格序列、1000美元本金、一笔按成交金额抽的佣金让你决定每天买多少卖多少最后交一份两页的客户备忘录。多数队伍第一反应是上LSTM预测涨跌把净值曲线画得漂亮就收工评委翻到“证明这是最优策略”那一问发现除了一张收益率曲线什么都没有分数就卡在H奖。真正把F奖和M奖分开的是三件事数据对齐讲没讲清、策略在佣金摩擦下还剩多少、备忘录能不能让不懂模型的人照着做决定。这篇按考点顺序拆先看四问的分值和约束边界再看三类高频解法怎么写最后落到失分点和四天节奏。适合第一次冲F奖的队伍也适合保研面试要讲清这段建模经历的人。2. 赛题解剖四问的分值分布与三条硬约束2.1 三条硬约束决定了模型边界C题看起来是开放的量化题实际上题面已经把模型的可行域切得很窄。判断一个解法是否跑偏先拿这三条去卡约束题面给的形态对模型的直接影响本金 1000 美元不可追加固定初始资金收益必须按比例讨论绝对金额没有说服力佣金按成交金额的百分比计每次调仓双边都扣换手率变成隐性成本高频调仓天然被惩罚每天只做一次决策只能使用当日及之前的信息用当日收盘价决定当日买卖就是前视偏差第一条最容易被忽视。1000美元本金配百分比佣金意味着小资金下的摩擦成本占比其实不低很多队伍算出来的“最优策略”每天调仓两三次样本内收益很漂亮把佣金从1%调到2%净值立刻塌成一条水平线这就是没把成本当约束、只当参数的结果。第二条决定你该往“少动多看”的方向设计。调仓阈值、最小变动幅度、分批建仓这类机制本质都是在给换手率加刹车。不做这层设计模型在数学上最优在题目设定的市场里不可执行。第三条是评分时最狠的一条。只要你的决策逻辑里出现“知道今天收盘价再决定今天买什么”无论模型多精巧论证部分直接作废。规范的写法是第t日的决策只用第t-1日及之前的收盘价成交按第t日开盘价或第t日收盘价的下一期结算并在假设里写明。2.2 四问的评分权重哪一问最容易被写废题面四个任务对应的评分关注点完全不同用错力气就白干任务评委真正在找什么常见的写废方式建立每日交易模型决策变量、目标函数、约束三件套是否齐全只给一张流程图通篇没有一条公式论证策略最优与基准对比、多指标、样本内外一致性只报一个总收益率数字敏感性分析扫描维度、失效临界点、结论的适用边界只变一个参数写“结果稳定”两页备忘录结论先行、风险提示、非技术语言写成论文第二篇摘要全是公式第一问是地基写不清后面三问全部悬空。目标函数到底最大化终值、最大化夏普、还是最大化对数效用必须明写约束里必须出现“不能透支、不能做空、交易后现金非负”这几条否则评委会认为你没考虑可行性。第二问的分差最大。只报收益率的队伍和同时报“收益率、最大回撤、夏普、与两个基准的对比”的队伍差距不是一点。这类题通常这么答先立一个买入持有基准比如黄金比特币各50%一直不动再立一个纯比特币基准你的策略必须同时说清“比基准多赚在哪”和“比基准少亏在哪”两边都占才算论证。第三问很多队伍写成了走过场。敏感性分析的真正目的是告诉决策者“这套策略什么时候会失灵”所以要给出临界值比如“佣金超过约1.8%时本策略的收益优势被完全抹平此时应退回买入持有”。第四问是低成本高回报。两页纸写清楚给谁看、建议是什么、最坏情况亏多少、什么时候该改策略就够拿分了。2.3 数据底座黄金与比特币交易日对不齐的坑两条序列的时间轴天生不一致黄金跟随交易所日历周末和假期没有报价比特币是连续报价天天有数。直接按行拼接日期会错位几百行后面所有收益率都是错的。正确的做法是先取并集再对停牌的一方做前向填充。import pandas as pd def load_aligned(gold_path, btc_path): g pd.read_csv(gold_path) b pd.read_csv(btc_path) # 原表都是两列日期 价格。列名以文件实际为准这里统一改名 g.columns [date, gold] b.columns [date, btc] g[date] pd.to_datetime(g[date]) b[date] pd.to_datetime(b[date]) # 外连接取日期并集保留任意一方有行情的日子 df pd.merge(g, b, ondate, howouter).sort_values(date).set_index(date) # 黄金周末/假期停牌用最近一个交易日价格前向填充 df[gold] df[gold].ffill() # 比特币上线之前那段黄金有、比特币没有的区间直接丢弃 df df.dropna() return df这段代码有三处要讲清楚。howouter是必须的用内连接会把黄金休市日全部删掉等于人为制造了一批缺失交易日收益率序列被压缩波动率被低估。ffill()只用过去的信息补今天合规换成bfill()就是把明天的价格搬到今天属于典型的前视偏差评委看到会直接扣分。dropna()放在最后是因为外连接后比特币起始日之前会留一段只有黄金的空行那段既没有可比价格也没有交易标的必须剔除。跑完之后建议加两行自检df.isna().sum()应该全为0df.index.to_series().diff().dt.days.value_counts()看一眼间隔分布如果出现几十天的空档说明中间有整段缺失需要回头查原始文件而不是继续往下建模。这两行排查花不了一分钟却能挡掉血泪经验里最常见的一类翻车。2.4 真题演练为什么第一篇代码必须是基准线题面没要求你做基准但论证那一问离了基准就是空话。建议在写任何策略之前先跑出买入持有的曲线import numpy as np def buy_and_hold(px, weights(0.5, 0.5), cash01000.0): px: (T,2) 对齐后的价格矩阵列顺序 [黄金, 比特币] weights: 期初投入两个标的的资金占比 units cash0 * np.array(weights) / px[0] # 期初各买多少单位 value (px * units).sum(axis1) # 每日市值不做任何调仓 return value参数只有三个价格矩阵、期初权重、本金。units是买入份额之后不再变动value就是逐日盯市的结果。这段代码短到不需要调试但它是整篇论文的锚——后面每一个策略的净值曲线都要和它画在同一张图上。答题时这么用先报基准的终值和最大回撤再报你的策略用差值讲话。“本策略终值较50/50买入持有提升X%最大回撤从Y%压到Z%”一句话顶十张图。如果策略跑不赢基准也不要藏直接把原因写出来——比如“在给定佣金下高频择时的收益被摩擦成本抵消因此最优解退化为低频调仓”这种诚实的结论在评分里反而加分因为它证明你真的做了敏感性分析而不是在凑结果。3. 高频模型三类解法怎么选动态规划那版怎么写3.1 三类主流解法的对比选错方向再多图也救不回来C题流传最广的解法大致三类各有各的适用场景和软肋解法典型做法优势评委可能追问的点静态资产配置马科维茨均值方差、风险平价有经典理论支撑公式漂亮稳定性好题目要的是每日决策你只给一个固定比例怎么解释“每天在做什么”预测加规则用时间序列或神经网络预测次日收益超过阈值就调仓出图效果好故事完整预测精度多少预测错了策略还能活吗过拟合怎么排除动态规划 / 强化学习把持仓比例离散成状态逐日决策天然贴合“每日决策”的题面成本可以直接进转移方程状态离散够不够细可解释性在哪第一次冲F奖最稳的是第三种思路加第二种的预测做辅助主轴用动态规划保证决策链完整把预测模型作为状态输入或者调仓信号的修正项两边的好处都拿到。纯预测流的队伍翻车率最高因为它把全部赌注押在“我预测得准”上而题目问的是“你的策略在成本约束下能不能持续赚钱”这是两个问题。另一条路是纯静态配置加调仓规则写法是“每月再平衡到目标权重偏离超过阈值就提前触发”。这条路省事但要额外回答一个问题既然目标是每日决策为什么可以简化成月度再平衡答案得落在成本上——在给定佣金下高频调仓的边际收益小于边际成本最优决策自然稀疏。把这个逻辑写进论文静态方案也能自圆其说。3.2 把佣金写进状态转移动态规划骨架这一版是C题的核心考点怎么让佣金进入模型的数学结构而不是事后从收益里减一笔。做法是把持仓比例离散成有限个状态每天选一个目标状态调仓成本按两个状态之间的距离计算。import numpy as np def solve_dp(ret, cost0.01, K21, i0None): ret : (T,2) 每日收益率列顺序 [黄金, 比特币] cost : 佣金比例按成交金额计单边 K : 黄金持仓比例的离散档位数档位即状态 i0 : 初始档位None 表示期初全现金 返回 : 终值倍数、每日目标黄金持仓比例 T len(ret) w np.linspace(0.0, 1.0, K) # 黄金占比网格比特币占比 1 - w V np.zeros((T 1, K)) # V[t, i]第 t 天处于档位 i 时的最大终值倍数 nxt np.zeros((T, K), dtypeint) # 记录每个状态的最优后继用于回溯 for t in range(T - 1, -1, -1): port w * ret[t, 0] (1 - w) * ret[t, 1] # 各目标档位的当日组合收益 for i in range(K): fee np.abs(w - w[i]) * cost # 从档位 i 调到档位 j 的换手比例 × 佣金 cand (1 port) * (1 - fee) * V[t 1] # 调仓后当日收益 × 后续最优 j int(np.argmax(cand)) V[t, i] cand[j] nxt[t, i] j # 从初始档位回溯出每日目标仓位 path, i [], i0 for t in range(T): i nxt[t, i] if i is not None else int(np.argmax((1 port) * V[t])) path.append(w[i]) return V[0].max(), np.array(path)逐层解释。w是状态空间取21档意味着黄金占比以5%为步长档位越细越接近连续最优但计算量按 K² 增长本题样本约1800个交易日21档跑下来是八十万次量级的比较秒级出结果完全可以扫到41档做一次稳健性检验。fee是这一版的关键np.abs(w - w[i])算的是从一个档位调到另一个档位要动多少比例的资金乘上佣金比例就是这次调仓的成本占比。注意它是按“换手比例”算的不是按总资产算的这才是题面佣金定义的正确翻译。cand里用乘法而不是减法是因为佣金按成交金额扣扣完的钱再参与后续投资等价于乘以 (1 - fee)。如果写成减法成本就没有复利效应长周期下会系统性低估摩擦的影响。V[t1]是向量所以这一行同时对所有目标档位求值argmax选出最优的那个nxt记下来供回溯。这一版有一个已知近似必须写进假设调仓后当日收益会改变实际持仓比例下一日开盘时的真实仓位已经偏离目标档位上面的代码没有把这个漂移纳入状态。修法是让状态变成“漂移后的实际仓位”按收益率反推它落在哪个档位区间代码量增加不多但转移方程要重写。论文里明确写出这个近似比假装没有更安全。初始状态也要单独处理。题面是本金的1000美元现金起步而网格w[0]0表示全仓比特币两者不是一回事。用i0None表示期初全现金第一天的决策就是“从现金一次性建仓到某个档位”把这笔建仓成本单独计入回报率计算才干净。3.3 敏感性分析扫两个维度不是一个佣金率单独扫一遍只是及格线。真正能拉开差距的是两维扫描横轴佣金率、纵轴调仓阈值或最小持仓变动幅度格子里填终值倍数或夏普。这样做的价值在于能画出“策略失效的边界”。你会发现一条斜线佣金越高最优调仓阈值越大策略从“积极择时”逐步退化到“接近买入持有”。把这条斜线画出来再标一句“佣金超过约1.8%时本策略相对50/50基准的优势消失”敏感性这一问就拿满了。评委要看的不是你说了“结果稳健”而是你敢指出它什么时候不稳健。再加一层扫描会更完整把样本期切成前后两段分别重跑最优参数看参数是否稳定。前半段选出来的阈值在后半段还能用说明模型抓的是结构性规律前后参数差出好几倍那就是过拟合得老实承认并给出缓解办法比如固定阈值取两段的折中值。3.4 真题演练评委追问“为什么不全仓比特币”四句话答完这是这道题最经典的追问因为样本期内比特币涨幅远超黄金任何人都能想到全仓它。答不好就露馅答好了直接证明你懂这道题在考什么。第一句给事实全仓比特币在样本期内终值确实最高这一点不回避。第二句给代价同期最大回撤超过八成且回撤修复期长达一年多任何有赎回应付要求的资金都扛不住。第三句给约束题目给的佣金结构下全仓单标的意味着所有资金在同一个风险因子上敏感性分析里只要比特币出现连续大幅下跌策略没有对冲手段。第四句给结论本策略的目标函数不是最大化终值而是在给定回撤上限下最大化收益所以主动牺牲了一部分上行空间换取生存概率这是权衡不是失误。四句话的顺序很重要先承认、再量化、再回到题目约束、最后落到目标函数。面试或答辩场合被问同类问题也可以套这个结构——先别急着辩解把对方的观察复述一遍并承认再把讨论拉回你的目标函数和约束条件上主动权就回来了。4. 论文与代码F奖和M奖的差距落在哪三页4.1 摘要的五句话模板摘要决定评委翻不翻正文。C题的摘要写满一页半没用五句话讲完最好第一句交代问题与数据规模两条价格序列、时间跨度、本金与佣金约束一句话说完。第二句给方法名说明用了什么模型、状态怎么定义、目标函数是什么。第三句给关键结果终值、年化收益、最大回撤、夏普四个数字并排列出。第四句给对比相对两个基准各提升了多少、在什么参数下优势消失。第五句给结论与适用条件明确这套策略适合什么样的资金、什么佣金水平下有效。五句话里最容易被漏掉的是第四句。很多摘要只写“本策略收益率为X%”评委无从判断这个X%算好还是算坏必须给参照系。另一个高频问题是第二句写成了方法罗列“本文使用了马科维茨模型、动态规划、机器学习”三个方法并列却没说清哪个是主轴读起来像在凑字数。选一个主轴其他都是辅助这句话就立住了。4.2 模型检验章节必须有的三张图检验章节不是装饰是第二问“论证最优”的正面战场。三张图缺一不可第一张是净值对比图你的策略、50/50买入持有、纯比特币三条线画在一起横轴时间、纵轴对数尺度的资产倍数。用对数轴是为了让早期的小波动和后期的大波动都看得清线性轴会把前半段压成一条平线。第二张是回撤曲线画在净值图下方共用横轴。这张图是回答“为什么不全部押注高收益资产”的最有力证据一条八成回撤的曲线摆在面前任何辩解都多余。第三张是参数敏感性热力图横轴佣金率、纵轴调仓阈值颜色深浅表示终值倍数或夏普。图上要标出你最优点所在的位置以及那条“优势消失”的等值线。这张图一放第三问基本就答完了。三张图之外还可以补一张持仓比例随时间变化的面积图用来看策略的行为是否符合直觉——比如市场剧烈波动时仓位是否自动降低。这张图属于加分项能让评委相信你的模型不是黑匣子。4.3 两页备忘录写给客户不是写给评委备忘录是这道题区分度很高的部分因为它考的是“能不能把模型翻译成人话”。两页纸结构建议这样排第一段三行以内给结论建议采用什么策略、预期年化区间、可能的最大亏损幅度。不要铺垫不要背景介绍客户只想知道该不该签字。第二段讲策略怎么运作最多用两个比喻一个公式都不要出现。比如“把资金按比例分给两类资产当比例偏离目标超过一定幅度时才调整避免频繁交易被手续费吃掉收益”这句话客户能听懂评委会认可你抓住了成本这个核心。第三段讲风险必须给出具体的数字场景在最坏的历史区间里这套策略会亏多少、需要多久恢复。风险段落写虚了前面收益写得再漂亮也会被扣分。第四段讲适用条件和退出机制什么情况下应该停止这套策略、多久复核一次。这一段体现的是责任心也是很多队伍完全没写的部分。两页纸的排版也有讲究。小标题加粗、关键数字单独成行、避免大段文字让客户能在三十秒内抓到重点。很多队伍把备忘录写成论文摘要的复制粘贴满页公式和符号这是典型的方向性错误——备忘录的读者不是评委是掏钱的人。4.4 附录代码与数据让评委三分钟内能跑通代码附录的评分标准很朴素能不能跑。三分钟内跑不通前面的模型再漂亮也打折。结构上分三个文件数据读取与对齐、模型求解、结果绘图每个文件开头写清输入输出和运行顺序。依赖只用常见库版本写进说明随机种子固定住任何带随机性的步骤都要能复现。数据文件不要只丢原始表附一份对齐后的中间结果注明每一列的含义和单位。原始数据的缺失处理规则单独写一段说明哪些日期被填充、哪些被剔除、为什么。这段说明看起来琐碎却是评委判断你有没有真正处理过数据的关键证据。最后加一个一键运行的入口一条命令跑完全流程并生成论文里的全部图表。这一条做到了评委会默认你的工作是可复现的而可复现性在建模竞赛里的权重比很多人想象的高。5. 易错点五个把F奖写成H奖的失分点5.1 数据层的两个致命错误第一个错误用当日收盘价决定当日买卖。错在哪决策时点和成交时点混在一起了。为什么错第t日的收盘价在第t日交易结束时才知道用它决定第t日买什么等于提前知道了答案样本内收益会虚高得离谱。怎么答对把决策和成交错开一期第t日决策用第t-1日收盘及之前的信息成交价用第t日开盘价并在假设里明确写这一条。更稳妥的做法是同时给出“开盘价成交”和“次日收盘价成交”两个版本说明结论不因成交假设而翻转。第二个错误外连接之后不做任何检查就直接建模。错在哪日期并集里混着整段缺失和错位。为什么错黄金休市日和比特币上线前的空档如果不填充不剔除收益率序列会出现跨越多日的跳跃波动率被严重高估后面所有风险指标全部失真。怎么答对填充用前向、剔除放最后再加两行自检把缺失数和日期间隔分布打出来看一眼。这类题的评分很看细节一个自检脚本就能体现你有没有真的跑过数据。5.2 模型层的两个常见误判第三个错误把样本内收益最高当成最优策略。错在哪只优化了一个指标而且是在同一段数据上既调参又评估。为什么错参数是在样本内挑出来的再拿样本内的表现论证它最优逻辑上循环了评委一问“换个时间段还成立吗”就答不上来。怎么答对切一段样本外区间做验证或者做滚动窗口回测把每段的最优参数和表现列出来。参数在多个窗口里都接近才敢说稳健差得远就老实写“存在过拟合风险建议用折中参数”。第四个错误敏感性分析只动佣金率一个参数结论写“结果稳定”。错在哪扫描维度太少而且没有给出失效条件。为什么错单一维度的扫描只能证明“在这个方向上不敏感”不能证明策略稳健评委想看的是边界。怎么答对至少两维扫描横轴佣金、纵轴调仓阈值或持仓偏离容忍度画出热力图并标出优势消失的临界位置。敢说“超过这个值策略就不划算了”比说十遍“稳定”有用。5.3 表达层的一个硬伤第五个错误备忘录写成第二篇论文摘要。错在哪读者对象搞错了。为什么错备忘录的收件人是客户他关心的是“建议做什么、最坏亏多少、什么时候该停”不是状态转移方程。满页符号和专业术语客户看不懂评委也会判定你没有完成题面这一问的真实意图。怎么答对结论放第一段前三行全文不出现公式风险部分给具体数字场景最后写清复核周期和退出条件。写完自己读一遍如果一段话需要具备运筹学背景才能理解就重写它。6. 四天节奏与追问应对把答题顺序排成一条流水线时间分配上我吃过最大的亏是前两天全花在调模型上第四天开始写论文摘要和备忘录草草收尾。后来固定成这套节奏时段主要动作交付物第1天上午读题、拆约束、对齐数据、跑基准干净的数据表 基准净值第1天下午到第2天主模型求解先跑通最简版本一条完整净值曲线第3天上午敏感性两维扫描、样本外验证热力图 对比表第3天下午主图全部出完图注写死四张定稿图第4天上午写正文检验章节优先完整初稿第4天下午摘要、备忘录、代码附录、复现测试可提交版本顺序上有两条硬规矩。其一基准线必须在主模型之前跑出来没有参照系的主模型等于没有结论。其二图表在第3天定稿第4天只写字不改图改图必然牵动正文数字最后两小时改数字是翻车的标准姿势。被追问时的应对除了前面“为什么不全仓比特币”那套四句话结构还有三个高频问题值得提前准备。问“你的模型和买入持有比优势在哪”答的时候不要只讲收益先讲回撤再讲收益顺序换了说服力完全不同。问“佣金参数你怎么定的”要能说出题目给定值、你的扫描区间、以及临界点在哪这三样缺一样都显得没做过敏感性。问“这套方法能用到别的资产上吗”别急着说能先讲适用条件——趋势性明显、交易成本可控、单一资产权重不至于过度集中的场景才适用讲清边界比讲清能力更显专业。从那以后我每次带这类题都强制自己先写备忘录再写正文。原因很实际备忘录要求你用三句话说清“建议什么、亏多少、什么时候停”写不出来说明模型还没想清楚回去继续想。这个习惯后来在面试里救过我——被问到项目细节时我能用同样的三句话讲完整个工作而不是从头讲数据清洗。希望帮到你。这份2022美赛C题的完整代码、对齐后的数据和对标论文整理在一起需要的话可以直接取用对照着把自己的流水线跑一遍比看十篇经验帖都快。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑