
简介这是一套针对《Advances in Financial Machine Learning》书中选定练习的实验性解决方案面向金融机器学习初学者和量化研究者便于结合Jupyter Notebook复现书中示例并验证关键理论。资源共43个文件压缩包体积仅2.8MB主体为18个Python脚本与6个.ipynb笔记本这些笔记本覆盖标签与元标签、第四章练习6和7、金融交叉验证、Tick/Volume/Dollar Volume Bars、样本权重、分数差分特征等核心主题src目录则提供bars.py、snippets.py等可复用工具及特征常量配置。另包含setup.py、Makefile、requirements.txt、tox.ini等环境配置以及docs文档和数据目录方便安装依赖、执行命令与对照阅读。目前已有314人学习/下载适合希望通过动手巩固金融机器学习知识的中高级读者利用清晰的目录结构可快速定位章节对应实验深入理解去噪、样本加权重、特征提取、交叉验证等实现细节并在此基础上扩展自己的研究思路。1. 项目概述1.1 核心需求解析做量化投资的朋友应该都绕不开一本书Marcos Lopez de Prado写的《Advances in Financial Machine Learning》。这本书的中文译名叫《金融机器学习进展》在业内的地位基本相当于“量化研究员的床头书”。但说实话这本书并不适合躺床上读因为它每一章后面附带的练习题难度是实打实的。我在读这本书的时候最大的感受是书里讲的概念——比如样本标签、样本权重、元标签、特征重要性分析、回测陷阱——每个单独拎出来看字面上都懂可真要自己动手实现一遍马上就会卡住。尤其是当你试图把这些方法迁移到自己的策略框架里时你会发现很多细节是书里没写的或者说写了但隐藏在代码片段和公式之间需要自己一行行去验证。这个项目的初衷就特别简单把我做这些练习题的完整思路、实验性代码、踩坑过程整理出来形成一套可以对照学习的参考实现。它不是什么标准答案更像一份“我也是这么试过来的”的实操记录。这套练习库覆盖的范围其实很广从数据清洗、标签构建到模型训练、特征重要性分析再到回测框架的搭建几乎把整本书的核心内容都串了一遍。对我个人来说完成这批练习之后最大的收获不是“会写那些代码”而是建立了一种研究直觉拿到一个金融数据问题先想清楚标签怎么定义样本权重怎么分配再用机器学习去拟合这个顺序不能乱。2. 整体设计与思路拆解2.1 为什么选择练习驱动的学习方式金融机器学习这个领域最大的坑就是“你以为你懂了”。你看完一章关于三重障碍法的内容觉得道理很简单就是给每个样本设定上障碍、下障碍和垂直障碍然后根据价格先触碰哪个障碍来确定标签。但真让你写代码实现的时候你会发现几个此前完全没想过的问题垂直障碍的窗口到底怎么和逐笔数据对齐障碍距离设成多少倍标准差才合理部分样本如果在垂直障碍到期时还没有触碰任何障碍标签应该怎么处理这些问题的答案只有动手写代码才能发现。我选择把整本书的练习过一遍而且是用“实验性”的心态去做不求代码写得多么工程化但求每个步骤的逻辑都经得起推敲。整个项目我是按照章节来组织的每个章节的练习对应一个独立的模块。这样做的好处有两个。第一学习曲线比较平滑你可以只聚焦自己关心的章节不用从头到尾读一遍。第二方便对照书本内容当你对书里某个概念产生疑问时可以直接跳到对应的练习模块看看这个概念的代码实现长什么样。2.2 项目结构规划我在一开始就确定了一个原则代码可以不够优雅但思路必须清晰。所以每个练习模块内部我都按照“问题定义 - 方法论 - 代码实现 - 结果分析”这个流程来组织。这样设计的原因在于练习的目的不是展示你会不会写某个函数而是展示你能不能把一个抽象的问题转化成可执行的代码逻辑。举个例子书里有一章专门讲金融数据的标注问题练习题要求你实现三重障碍法和元标签机制。这个练习放在全书比较靠前的位置但它几乎是后面所有章节的地基。如果标签构建错了后面用再好的模型也白搭。所以我在这个模块上花的时间也最长前后跑了几十次实验对比不同参数设置下的标签分布差异。3. 核心细节解析与实操要点3.1 数据预处理中的关键细节金融机器学习的第一步永远绕不开数据清洗。这里的脏数据不是指缺失值或异常值那么简单而是指金融数据里特有的噪音——比如停牌、涨跌停、隔夜跳空、幸存者偏差等。练习题里要求我们构建一个清洗后的价格序列我当时的做法是先识别出日内不活跃的时段比如午休时间然后用前一笔有效价格填充再剔除那些交易量异常小、价格波动却很大的样本点。这些操作看似基础但在实现过程中我踩了一个不大不小的坑如果直接对整个时间序列做填充而不考虑每个交易日的交易时段边界会把隔夜的价格跳空错误地抹平掉。正确的做法是先对数据按日期分组在组内做填充和清洗组与组之间不去跨组处理。这样才能保留隔夜跳空的信息同时消除日内不活跃时段造成的价格失真。3.2 标签构建方法的原理与选型标签构建是整个练习库中最核心、也最需要理解的部分。书里花了大篇幅讲三重障碍法简单解释一下这个方法的逻辑传统的分类标签很多直接用未来一段时间的收益率符号来定义比如未来5天收益率大于0就标记为1小于0就标记为-1。但Lopez de Prado指出这种做法存在一个致命问题它没有考虑价格的路径。两个样本如果未来收益率的终点相同但一个中途先触碰了5%的止盈线另一个先触碰了-5%的止损线它们的标签应该完全不同。三重障碍法的核心就是给每个样本设置三条线上障碍止盈线、下障碍止损线、垂直障碍最长持有期限。价格序列先碰到哪条线对应的样本就被标记为哪个标签。这个设计背后的金融逻辑是我们不能只关心投资的结果还要关心实现这个结果过程中承受的风险——先止损后反弹和一路上涨到止盈体验是完全不同的。初次实现这个逻辑的时候我陷入了以为简单、一写就错的困境。因为逐行遍历价格序列的效率极低数据量一大就直接卡死。后来我改用向量化操作把每个样本的起始时间、上障碍价格、下障碍价格、垂直障碍时间都算成数组然后利用numpy的广播机制一次性算出每个时间点的触碰状态。性能提升非常明显从最初的逐行循环改造成向量化操作之后计算速度提升了大概两个数量级。3.3 元标签机制的实践理解元标签Meta-Labeling是我觉得整本书里最实用、也是被很多人低估的一个概念。它的思路是先跑一个主模型来预测方向做多还是做空然后用元模型来预测“主模型的预测是否正确”。这个机制最大的价值在于它可以帮我们控制仓位大小和风险暴露。主模型告诉你方向元模型告诉你这个方向的置信度有多高。如果元模型预测主模型会犯错那就减仓甚至不参与如果元模型预测主模型判断正确那就加大仓位。在练习里实现元标签的过程中我最大的心得是主模型和元模型必须使用不同的特征集。如果你把同样的特征同时喂给两个模型那么元模型学到的就是主模型的复制品没有任何增量信息。正确的做法是元模型应该加入一些主模型没见过的信息量比如市场微观结构特征、波动状态特征等这样它才能提供一个真正独立的判断维度。4. 实操过程与核心环节实现4.1 环境准备与工具链选型这批练习我用的环境是Python 3.9依赖的核心库包括numpy、pandas、scikit-learn、matplotlib、numba和statsmodels。其中numba特别值得一提在后面实现某些循环逻辑时它和向量化操作组合使用性能表现极佳。金融机器学习跟普通的机器学习在工具选择上有个比较明显的差异我们特别看重时序相关性。标准的交叉验证方法在金融数据上是不适用的因为它在划分训练集和测试集时会随机打乱数据这就把时间顺序破坏了。书里专门花了很大篇幅讲这个问题解决的方案是使用“清除验证集”的交叉验证方法。这个方法的实现并不复杂核心思路就是确保训练集和验证集在时间上不重叠并且在两者之间留出足够的缓冲区间。我写了一个基于pandas的自定义交叉验证器调用sklearn的API风格这样可以直接用在GridSearchCV里面。4.2 特征重要性的多重验证超额收益的敌人是过拟合而过拟合最隐蔽的表现形式就是特征重要性分析结果过于漂亮。书里关于特征重要性的那一章练习题要求实现三种不同的特征重要性评估方法基于MDI袋外样本杂质减少的重要性、基于MDA袋外样本性能下降的重要性、以及置换重要性Permutation Importance。三种方法我都在同一个数据集上跑了结果很有意思MDI给出的特征排名跟MDA给出的排名差异很大。原因在于MDI在节点分裂时计算杂质下降对高基数特征取值特别多的特征有天然偏向而MDA通过“打乱某个特征再观察性能下降幅度”来评估重要性更接近这个特征对模型的真实贡献。这里的实操建议是别只看一种特征重要性指标至少用MDA或置换重要性和MDI交叉验证。如果你发现某个特征MDI排名很高但MDA排名很低那要警惕这个特征可能是在过拟合训练集。这个判断标准我在后面的实盘策略特征筛选中一直在用。4.3 样本权重的计算与实现样本加权是这本书比较有特色的部分之一也是很多人容易忽略的地方。金融时间序列的标签天生存在不平衡问题——上涨和下跌的样本比例往往不均衡而且不同时期的样本对当前模型训练的价值也不一样。Lopez de Prado提出的方法是根据样本的唯一性程度来分配权重。简单说如果一个样本的标签区间跟其他样本的标签区间重叠很少那这个样本携带的信息就更独特应该赋予更高的权重。我在练习中实现了一个基于并集和交集计算的权重函数。初次写完测试时我意识到它潜在的层级容易堆积导致算力消耗过大——因为每个样本都要跟其他所有样本计算重叠度O(n^2)的复杂度在几万条数据上就跑得比较吃力。后来我优化了排序方式先按标签区间的起始位置排序然后只计算相邻区间之间的重叠度效率大大提升。这个改进思路其实也是金融机器学习中的一个通用原则时间复杂度常伴随着信息损失需要在实际应用中平衡。4.4 回测框架中的陷阱规避书里关于回测的那一章给出的警告基本可以归纳为一句话回测结果是整个研究流程中最容易被美化、也最不值得相信的东西。我做练习题的时候特意把书里提到的几种回测陷阱都“故意踩了一遍”想看看它们对结果的影响有多大。第一种是前视偏差在特征计算时使用了未来信息导致回测曲线极其漂亮年化收益高得离谱。第二种是没有考虑交易成本什么滑点、手续费统统为零夏普比率虚高。第三种是数据泄漏训练集中包含了测试集时间段的数据这种情况在时间序列建模中特别容易发生稍不注意就把预测结果做得过于完美。对标到书里的方法论我重新搭建了一个完整的回测流程核心改进包括特征计算时严格使用滞后数据、每笔交易计入固定滑点、按实际可成交价格模拟订单。做完这轮调整之后之前的那个看起来“稳赚不亏”的策略年化收益直接打了个五折。这个对比实验给我上了一课回测的用处不是证明策略赚钱而是帮你过滤掉那些看起来很美的幻觉。5. 常见问题与排查技巧实录5.1 时间序列数据泄漏的识别与修复这是我在整个项目里遇到频率最高的问题。数据泄漏的表现形式很多用全局均值做归一化导致训练集信息泄漏到测试集、特征计算中rolling窗口包含未来数据、样本标签与特征之间存在重叠时间窗口等。排查技巧是把你的特征矩阵打印出来人工验证几个时间点的数据是否可复现。具体来说在t时刻你手上应该只有t时刻之前含t时刻的信息。如果发现某个特征值需要用到t1时刻的数据才算得出来那一定有泄漏。这种问题光靠模型调参是解决不了的必须回到数据处理层面修复。5.2 样本不平衡的处理经验金融数据里的类别不平衡问题比一般场景更棘手因为多数类别和少数类别在我们眼里都可能包含重要信息。某段时间市场震荡大部分样本落在“无交易”这个标签下但如果只把它们全部当作多数类来欠采样会丢失很多市场结构信息。我的处理方案是结合元标签机制来处理不平衡问题。主模型预测方向只管分类元模型预测主模型的置信度进一步调整仓位。这样即使某个类别的样本数量偏少也可以通过权重调整和模型分层来缓解不平衡带来的训练偏差而不是粗暴地砍掉数据。5.3 性能优化的几个小技巧练习数据量一大代码性能就会成为瓶颈。我整理了三个对效率有明显提升的小技巧能不要循环就不要循环善用numpy的ufunc和pandas的apply方法。特别复杂的逻辑优先考虑numba的njit装饰器。每个样本的标签区间计算用排序 二分查找替代双重循环可以把时间复杂度从O(n^2)降到O(n log n)。频繁调用的函数尽量把结果缓存下来不要重复计算。比如某些特征在多次实验中都是不变的提前算好存成parquet文件加载时间比重新计算快得多。5.4 从练习到实盘的迁移要点完成这堆练习之后你一定会有一个问题这些东西怎么用到自己的策略里我的经验是不要直接照搬。书里的方法是用在特定数据频率通常是分钟级或日频和特定交易场景通常是美国市场上的。换到A股市场、不同数据频率、不同交易规则之下有些参数需要重新调整。比如障碍距离的设定、垂直障碍的窗口长度、样本权重的计算方式都要根据你实际使用的数据和策略逻辑重新校准。另外一个很重要但容易忽略的点书里的方法虽然叫“机器学习”但它并不是银弹。标签构建、特征工程、样本加权、回测框架设计这些组合在一起构成了一个完整的研究范式它的价值在于帮你更系统地思考问题而不是帮你找到一个稳赚不亏的交易策略。6. 实操心得与后续方向6.1 踩坑记录汇总做一个练习库的完整过程也是踩坑的过程。我把几个印象比较深的坑整理在这里希望能帮你少走些弯路数据清洗务必区分交易时段和隔夜时段。很多网上的开箱即用代码在这一步上处理得比较草率直接影响了后续所有实验的可信度。三重障碍法的实现参数初始化时一定要先想清楚“价差怎么定义”“时间用什么单位”。因为数据的时间索引可能带时区或偏移一个没对清楚跑出来的标签就会整批错误。做特征重要性分析时不要只看模型自己输出的feature_importances_。这个值在决策树模型里偏向高基数特征已经是业内共识必须结合多个维度的评估手段来综合判断。6.2 后续可以扩展的方向这套练习库目前覆盖的是书里偏基础到进阶的内容。如果后续要继续深入我比较看好几个方向把元标签和强化学习结合起来做动态仓位分配在特征工程中引入更多的市场微观结构特征比如订单簿压力、买卖价差变化等或者把整个流程封装成一个自动化研究框架输入原始数据、输出带标签的特征矩阵和回测报告。我在实际使用中还有一个小体会最后也分享一下吧金融机器学习的核心研究对象不是价格而是价格变化的驱动因素。数据预处理、标签构建、样本加权这些表面看起来“不太像机器学习”的环节恰恰是决定模型优劣的关键所在。方向比建模重要逻辑比调参重要这句话在量化领域比其他任何领域都明显。本文还有配套的精品资源点击获取