<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>量化 on Blog</title>
    <link>/tags/%E9%87%8F%E5%8C%96/</link>
    <description>Recent content in 量化 on Blog</description>
    <generator>Hugo -- 0.146.0</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 21 Aug 2026 02:00:00 +0800</lastBuildDate>
    <atom:link href="/tags/%E9%87%8F%E5%8C%96/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【量化】从零到LGBM | 9 | LGBM的金融应用（下）：模型解释、进阶方向与完整工作流</title>
      <link>/posts/lgbm%E7%9A%84%E9%87%91%E8%9E%8D%E5%BA%94%E7%94%A8%E4%B8%8B%E6%A8%A1%E5%9E%8B%E8%A7%A3%E9%87%8A%E8%BF%9B%E9%98%B6%E6%96%B9%E5%90%91%E4%B8%8E%E5%AE%8C%E6%95%B4%E5%B7%A5%E4%BD%9C%E6%B5%81/</link>
      <pubDate>Fri, 21 Aug 2026 02:00:00 +0800</pubDate>
      <guid>/posts/lgbm%E7%9A%84%E9%87%91%E8%9E%8D%E5%BA%94%E7%94%A8%E4%B8%8B%E6%A8%A1%E5%9E%8B%E8%A7%A3%E9%87%8A%E8%BF%9B%E9%98%B6%E6%96%B9%E5%90%91%E4%B8%8E%E5%AE%8C%E6%95%B4%E5%B7%A5%E4%BD%9C%E6%B5%81/</guid>
      <description>&lt;h2 id=&#34;lightgbm-量化实战篇下shap-解释进阶方向与完整工作流&#34;&gt;LightGBM 量化实战篇（下）：SHAP 解释、进阶方向与完整工作流&lt;/h2&gt;
&lt;p&gt;前两篇分别讨论了金融数据的截面预处理与保守调参、排序学习目标函数与 Purged 交叉验证。至此，量化 LightGBM 的基础框架已经搭建完成：数据被正确处理，模型以合理的方式训练和验证。&lt;/p&gt;
&lt;p&gt;但基础框架的完成并不意味着工作的结束。模型上线后，一系列更深层次的问题会接踵而来：基金经理需要知道&amp;quot;模型今天为什么选这些股票&amp;quot;、模型运行数月后效果开始衰减该怎么办、是否可以让模型直接优化 Rank IC、深度学习能否与 LightGBM 互补。本篇将逐一讨论这些问题，并在最后将全部流程串联为一个完整的八步工作流。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;一shap打开-lightgbm-的黑盒&#34;&gt;一、SHAP：打开 LightGBM 的黑盒&lt;/h3&gt;
&lt;p&gt;在量化机构中，模型的可解释性并非可选项，而是刚需。基金经理、风控部门、投资委员会都会提出这样的问题：今天为什么选择这些股票？模型是否在依赖某个异常因子？近期的收益究竟来自真正的 Alpha 还是某个风格暴露？回撤发生后能否定位具体原因？&lt;/p&gt;
&lt;p&gt;LightGBM 由成百上千棵树组成，直接理解其决策逻辑几乎不可能。&lt;strong&gt;SHAP&lt;/strong&gt; 是目前最为广泛使用的模型解释工具。&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&#34;1-shap-的直觉公平分配边际贡献&#34;&gt;1. SHAP 的直觉：公平分配边际贡献&lt;/h4&gt;
&lt;p&gt;SHAP（Shapley Additive exPlanations）的理论基础源于博弈论中的 &lt;strong&gt;Shapley Value&lt;/strong&gt;。可以借助一个直观的例子来理解：假设三人合作赚取了 100 万元，如何分配才算公平？平均分配未必合理，因为每个人的贡献并不相同。Shapley Value 的思路是：考察每个人在所有可能的加入顺序下的边际贡献，然后对所有排列取平均值。&lt;/p&gt;
&lt;p&gt;映射到特征上，公式是：&lt;/p&gt;
&lt;p&gt;$$\phi_i = \sum_{S \subseteq F \setminus {i}} \frac{|S|!(|F|-|S|-1)!}{|F|!} \left[ v(S \cup {i}) - v(S) \right]$$&lt;/p&gt;
&lt;p&gt;其中 $S$ 是不包含特征 $i$ 的特征子集，$v(S)$ 是仅使用集合 $S$ 中特征时模型的预测值，$\phi_i$ 是特征 $i$ 的 Shapley 值。该公式的具体形式无需记忆，其核心含义可概括为一句话：&lt;strong&gt;SHAP 旨在公平地量化模型最终预测中每个特征的贡献度。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&#34;2-在-lightgbm-选股中shap-解释什么&#34;&gt;2. 在 LightGBM 选股中，SHAP 解释什么？&lt;/h4&gt;
&lt;p&gt;假设模型为某只股票输出了 $+3.0%$ 的预测分数，SHAP 可以将这一预测分解为：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【量化】从零到LGBM | 8 | LGBM的金融应用（中）：排序学习、对冲与交叉验证</title>
      <link>/posts/lgbm%E7%9A%84%E9%87%91%E8%9E%8D%E5%BA%94%E7%94%A8%E4%B8%AD%E6%8E%92%E5%BA%8F%E5%AD%A6%E4%B9%A0%E5%AF%B9%E5%86%B2%E4%B8%8E%E4%BA%A4%E5%8F%89%E9%AA%8C%E8%AF%81/</link>
      <pubDate>Fri, 21 Aug 2026 01:00:00 +0800</pubDate>
      <guid>/posts/lgbm%E7%9A%84%E9%87%91%E8%9E%8D%E5%BA%94%E7%94%A8%E4%B8%AD%E6%8E%92%E5%BA%8F%E5%AD%A6%E4%B9%A0%E5%AF%B9%E5%86%B2%E4%B8%8E%E4%BA%A4%E5%8F%89%E9%AA%8C%E8%AF%81/</guid>
      <description>&lt;h2 id=&#34;lightgbm-量化实战篇中排序学习beta-对冲与-purged-交叉验证&#34;&gt;LightGBM 量化实战篇（中）：排序学习、Beta 对冲与 Purged 交叉验证&lt;/h2&gt;
&lt;p&gt;上一篇讨论了金融数据的特殊性质、截面预处理方法和保守的超参数调优策略。完成这些环节后，我们已经知道如何将金融数据正确地处理并喂入 LightGBM。但还有一个关键问题尚未回答：&lt;strong&gt;模型的优化目标应该是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回归目标（预测绝对收益率）和排序目标（学习股票的相对强弱）是两种截然不同的思路。选定目标函数后，还需要理解选股得到的相对强弱如何转化为实际收益，以及如何通过严格的交叉验证确保模型没有偷看未来数据。这三个问题构成了本篇的核心内容。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;一排序学习让模型直接回答谁更强&#34;&gt;一、排序学习：让模型直接回答&amp;quot;谁更强&amp;quot;&lt;/h3&gt;
&lt;p&gt;量化选股中存在一个核心认知：我们关注的并非绝对收益预测的精度，而是&lt;strong&gt;排序的正确性&lt;/strong&gt;。假设模型预测 A 涨 3.1%、B 涨 2.9%，而实际 A 涨 1.2%、B 涨 1.0%，绝对收益的预测值与实际值差距显著，但排序关系是正确的。当投资组合仅持有排名前若干只股票时，排序的正确性已经满足需求。因此，目标函数的设计应当与这一目标保持一致。&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&#34;1-回归目标的问题&#34;&gt;1. 回归目标的问题&lt;/h4&gt;
&lt;p&gt;LightGBM 默认支持回归目标，比如最小化均方误差：&lt;/p&gt;
&lt;p&gt;$$\mathcal{L} = \sum_i (y_i - \hat{y}_i)^2$$&lt;/p&gt;
&lt;p&gt;直接以未来收益率作为标签、训练模型预测绝对收益，会面临多方面的挑战：收益率本身噪声含量高，精确预测具体的涨跌幅极其困难；收益率分布具有显著的厚尾特征，少数暴涨或暴跌的股票会严重拉偏均方误差的优化方向；模型倾向于将优化资源集中在拟合中间区域的普通股票上，而投资者真正关注的恰恰是头部和尾部的标的；此外，投资组合的构建仅依赖相对排序，而非绝对预测值。因此，回归目标并非量化选股的最优选择。&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&#34;2-lambdarank直接学排序&#34;&gt;2. LambdaRank：直接学排序&lt;/h4&gt;
&lt;p&gt;LightGBM 支持排序学习目标（&lt;code&gt;objective = &amp;quot;lambdarank&amp;quot;&lt;/code&gt;）。其核心思路并非预测具体的收益率数值，而是学习一个&lt;strong&gt;排序分数&lt;/strong&gt;。在每个交易日，股票的因子特征输入模型后，输出一个连续的 score 值：&lt;/p&gt;
&lt;p&gt;$$s_{i,t} = f(x_{i,t})$$&lt;/p&gt;
&lt;p&gt;这个 score 既不是排名也不是概率，而是一个纯粹用于排序的数值。以下是一个输出示例：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;股票&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;模型分数&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;A&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;2.51&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;B&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;2.13&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;C&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;0.87&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;D&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;-0.42&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;按分数从大到小排列，即为模型给出的股票强弱顺序。&lt;/p&gt;
&lt;p&gt;训练过程中，模型可以获取真实标签（例如经未来收益率排序后划分的等级）。使用 &lt;code&gt;lambdarank&lt;/code&gt; 时，需要传入 &lt;strong&gt;group&lt;/strong&gt; 信息，以告知模型哪些样本属于同一组。在日频选股场景中，每个交易日即为一个 group：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;group &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;4000&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4020&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3980&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;]  &lt;span style=&#34;color:#75715e&#34;&gt;# 每天有多少只股票&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;训练数据必须按照 group 信息进行排序，同一天的股票数据需要连续排列。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【量化】从零到LGBM | 7 | LGBM的金融应用（上）：数据预处理与保守调参</title>
      <link>/posts/lgbm%E7%9A%84%E9%87%91%E8%9E%8D%E5%BA%94%E7%94%A8%E4%B8%8A%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86%E4%B8%8E%E4%BF%9D%E5%AE%88%E8%B0%83%E5%8F%82/</link>
      <pubDate>Fri, 21 Aug 2026 00:00:00 +0800</pubDate>
      <guid>/posts/lgbm%E7%9A%84%E9%87%91%E8%9E%8D%E5%BA%94%E7%94%A8%E4%B8%8A%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86%E4%B8%8E%E4%BF%9D%E5%AE%88%E8%B0%83%E5%8F%82/</guid>
      <description>&lt;h2 id=&#34;lightgbm-量化实战篇上金融数据特性截面处理与保守调参&#34;&gt;LightGBM 量化实战篇（上）：金融数据特性、截面处理与保守调参&lt;/h2&gt;
&lt;p&gt;前六篇文章聚焦于 LightGBM 的算法本身——树的分裂机制、GBDT 的残差拟合框架、XGBoost 引入二阶导数的意义，以及 LightGBM 通过 Histogram 和 Leaf-wise 策略实现的效率提升。那些内容属于算法原理的范畴。&lt;/p&gt;
&lt;p&gt;但当 LightGBM 被部署到真实的股票市场中时，算法本身的精巧并不能保证结果的可靠。数据是否被正确地喂入模型、标签如何定义、回测切分如何避免未来信息泄露、模型表现异常时如何诊断——这些问题在 Kaggle 等标准竞赛中鲜少遇到，但在量化投资中却是决定成败的关键环节。&lt;/p&gt;
&lt;p&gt;本系列共三篇，围绕一个核心问题展开：&lt;strong&gt;如何在量化场景中正确地使用 LightGBM&lt;/strong&gt;。第一篇讨论金融数据的特殊性质、截面预处理方法和保守的超参数调优策略——这些是模型训练之前必须解决的输入端问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;一金融数据与普通机器学习数据的差异&#34;&gt;一、金融数据与普通机器学习数据的差异&lt;/h3&gt;
&lt;p&gt;有过机器学习实践经验的读者或许熟悉这样的工作流：在猫狗图片分类、房价预测等任务中，完成特征工程、选择合适的模型、调优超参数，性能指标通常就能稳步提升。然而，将同样的流程移植到股票市场中，往往会出现一种令人困惑的现象——回测阶段表现优异，实盘阶段却大幅失效。&lt;/p&gt;
&lt;p&gt;这一落差的根源并不在于 LightGBM 算法本身，而在于金融数据区别于一般机器学习数据的特殊性质。&lt;/p&gt;
&lt;h4 id=&#34;1-信噪比极低&#34;&gt;1. 信噪比极低&lt;/h4&gt;
&lt;p&gt;在图像分类任务中，猫的视觉特征是稳定且可辨识的；房价与面积之间的关系也具有较好的统计稳定性。但股票收益率的构成远为复杂——宏观消息、资金流向、散户情绪、政策变动、短期流动性冲击、纯粹的随机波动交织在一起。其中真正具有预测价值的成分，仅占收益率总体波动的很小一部分。&lt;strong&gt;信号微弱而噪声强大&lt;/strong&gt;，这是金融数据最本质的特征。&lt;/p&gt;
&lt;p&gt;因此，量化建模的评估标准不应聚焦于模型在历史数据上的拟合精度，而应关注其在未见数据上的预测稳定性。&lt;/p&gt;
&lt;h4 id=&#34;2-分布不稳定概念漂移&#34;&gt;2. 分布不稳定（概念漂移）&lt;/h4&gt;
&lt;p&gt;图像分类的决策边界不会因为日历翻页而改变，但金融市场的运行规律始终处于动态漂移之中。小市值风格可能在今年有效而明年失效；动量策略可能连续三年盈利，随后进入长达一年半的回撤期；某个量价规律一旦被市场参与者广泛识别，拥挤交易效应便会迅速侵蚀其超额收益。&lt;/p&gt;
&lt;p&gt;这就是所谓的 &lt;strong&gt;Concept Drift（概念漂移）&lt;/strong&gt;。金融市场中的规律并非物理定律，它是参与者博弈的产物。当参与者的结构和行为模式发生变化时，原本有效的规律也会随之改变。&lt;/p&gt;
&lt;p&gt;因此，量化模型的设计应当趋于保守。对于那些缺乏坚实经济学解释、仅在特定时段表现出统计显著性的规律，应当审慎对待。模型应当优先捕捉那些更为普适、更经得起时间检验的模式。&lt;/p&gt;
&lt;h4 id=&#34;3-排序比绝对值重要&#34;&gt;3. 排序比绝对值重要&lt;/h4&gt;
&lt;p&gt;在量化选股场景中，模型并不需要精确预测某只股票明天的涨幅是 2.1% 还是 2.3%。假设市场中有 5000 只股票，投资组合最终可能只持有排名前 100 只。模型的核心价值在于能否准确地将这 100 只股票从全部标的中识别出来——具体的绝对收益预测值并非关键，&lt;strong&gt;排序的正确性才是核心&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这一认知对后续目标函数的选择具有直接的指导意义。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;二截面处理量化数据预处理的灵魂&#34;&gt;二、截面处理：量化数据预处理的灵魂&lt;/h3&gt;
&lt;p&gt;在标准机器学习流程中，特征工程的常规做法是对整个数据集进行统一的标准化处理——对所有样本减去均值、除以标准差。然而，股票数据的结构决定了这种方法并不适用。&lt;/p&gt;
&lt;p&gt;股票数据本质上是&lt;strong&gt;面板数据（Panel Data）&lt;/strong&gt;：横轴为某一天的全部上市股票，纵轴为时间序列。在任意一个交易日，所有股票的数据集合构成一个&lt;strong&gt;截面（Cross-Section）&lt;/strong&gt;。许多量化因子在绝对数值层面的含义并不稳定，真正具有信息量的是截面内的&lt;strong&gt;相对位置&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id=&#34;1-为什么绝对数值靠不住&#34;&gt;1. 为什么绝对数值靠不住？&lt;/h4&gt;
&lt;p&gt;以市盈率（PE）为例。假设有两只股票，A 的 PE 为 15，B 的 PE 为 100。表面上看 A 似乎更便宜，但实际情况远比这复杂。牛市中流动性充裕，市场整体估值中枢上移，PE=100 并不罕见；熊市中估值中枢下移，PE=15 也未必代表低估。此外，不同行业天然具有不同的合理估值区间——同一年内，电子行业与银行行业的 PE 量级差异极大。如果直接将绝对数值输入模型，模型很容易学到表面化的规律，例如&amp;quot;某年 PE 低的股票表现好&amp;quot;，并将低 PE 泛化为一条通用规则。然而，当宏观环境切换后，这类规律往往会迅速失效。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【量化】从零到LGBM | 6 | LGBM代码实现和调用</title>
      <link>/posts/lgbm%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E5%92%8C%E8%B0%83%E7%94%A8/</link>
      <pubDate>Thu, 20 Aug 2026 12:29:00 +0800</pubDate>
      <guid>/posts/lgbm%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E5%92%8C%E8%B0%83%E7%94%A8/</guid>
      <description>&lt;h2 id=&#34;lightgbm-代码实现&#34;&gt;LightGBM 代码实现&lt;/h2&gt;
&lt;p&gt;在上一篇文章中，我们从数学和工程设计的角度拆解了 LightGBM 的四大核心机制。本文主要来记录其代码实现。&lt;/p&gt;
&lt;p&gt;本文分两部分回答这个问题。第一部分，我们用几百行伪代码，从零手搓一个&amp;quot;麻雀虽小、五脏俱全&amp;quot;的迷你LightGBM第二部分，我们带着手搓时拧过的每一颗&amp;quot;螺丝&amp;quot;，去学习如何正确使用 LightGBM 的 Python 官方接口。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;第一部分手搓-lightgbm&#34;&gt;第一部分：手搓 LightGBM&lt;/h3&gt;
&lt;h4 id=&#34;0-总体设计先看清整张图纸&#34;&gt;0. 总体设计：先看清整张图纸&lt;/h4&gt;
&lt;p&gt;在写代码之前，我们先明确这个迷你版本要包含哪些功能，以及它们的组装顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;EFB 特征捆绑&lt;/strong&gt;：在数据进入模型之前，把互斥的稀疏特征合并降维（预处理阶段）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;离散分箱&lt;/strong&gt;：把连续特征值映射为整数桶编号（直方图的地基）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GOSS 采样&lt;/strong&gt;：每轮迭代时，保留大梯度样本、采样小梯度样本；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直方图构建与作差&lt;/strong&gt;：以 $O(N)$ 的代价统计梯度信息，分裂时用减法省一半计算；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leaf-wise 生长&lt;/strong&gt;：用优先队列实现&amp;quot;谁增益大谁分裂&amp;quot;的精英制，并用正则化参数套上缰绳；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升主循环&lt;/strong&gt;：每轮对&amp;quot;当前预测值&amp;quot;求一二阶导数，建一棵树，累加进模型。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个顺序与 LightGBM 真实源码的数据流向是一致的。下面逐块实现。&lt;/p&gt;
&lt;h4 id=&#34;1-目标函数先明确-g-和-h-从哪来&#34;&gt;1. 目标函数：先明确 $g$ 和 $h$ 从哪来&lt;/h4&gt;
&lt;p&gt;上一篇我们反复强调：一阶导 $g_i$ 和二阶导 $h_i$ 是&lt;strong&gt;对当前模型预测值求导&lt;/strong&gt;的结果，下标 $i$ 表示第 $i$ 个样本。在代码里，这就是一个极其简单的函数。以平方损失 $L=\frac{1}{2}(\hat{y}_i-y_i)^2$ 为例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; numpy &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;grad_hess&lt;/span&gt;(pred, y):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;对预测值求导：g 是一阶导（误差推力），h 是二阶导（曲率）&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    g &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pred &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; y                 &lt;span style=&#34;color:#75715e&#34;&gt;# dL/d(pred)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    h &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ones_like(y)          &lt;span style=&#34;color:#75715e&#34;&gt;# d2L/d(pred)2，平方损失下恒为 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; g, h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意这个接口的&lt;strong&gt;通用性&lt;/strong&gt;：如果换成分类任务，只需要把损失换成对数似然，$g$ 和 $h$ 换成对应的导数即可，后面所有的树构建代码&lt;strong&gt;一行都不用改&lt;/strong&gt;。这正是 GBDT 框架&amp;quot;泛函梯度下降&amp;quot;的优雅之处——树只关心梯度，不关心具体任务。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【量化】从零到LGBM | 5 | LGBM</title>
      <link>/posts/lgbm/</link>
      <pubDate>Thu, 20 Aug 2026 11:31:00 +0800</pubDate>
      <guid>/posts/lgbm/</guid>
      <description>&lt;h1 id=&#34;lightgbm-解析更快的工程学&#34;&gt;LightGBM 解析：更快的工程学&lt;/h1&gt;
&lt;p&gt;在机器学习的集成学习领域，如果说 GBDT 奠定了“泛函梯度下降”的理论基石，XGBoost 通过二阶泰勒展开和正则化将其推向了精度的巅峰，那么 &lt;strong&gt;LightGBM（Light Gradient Boosting Machine）&lt;/strong&gt; 则是将这一框架在&lt;strong&gt;工程实现与计算效率&lt;/strong&gt;上做到极致的集大成者。&lt;/p&gt;
&lt;p&gt;随着量化金融、推荐系统等领域的数据量呈指数级爆炸（如全市场高频 Tick 数据、千万级用户行为日志），传统的树模型在内存和算力上开始捉襟见肘。2017 年，微软亚洲研究院的团队推出了 LightGBM。它的名字直白地揭示了其使命：&lt;strong&gt;Light（轻量、极速） + GBM（梯度提升树）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本文将剥离繁杂的表象，深入 LightGBM 的数学内核与底层数据结构，探讨它是如何通过四大核心“黑科技”，在不损失（甚至提升）模型精度的前提下，实现对传统算法的降维打击。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一-痛点剖析xgboost-在海量数据下的工程瓶颈&#34;&gt;一、 痛点剖析：XGBoost 在海量数据下的工程瓶颈&lt;/h2&gt;
&lt;p&gt;要理解 LightGBM 的伟大，首先必须看清 XGBoost 在面对海量数据时暴露出的两块致命短板。尽管 XGBoost 引入了加权分位数素描（Weighted Quantile Sketch）等近似算法，但其底层架构依然存在两个难以逾越的鸿沟：&lt;/p&gt;
&lt;h3 id=&#34;1-预排序pre-sorted的内存与时间枷锁&#34;&gt;1. 预排序（Pre-sorted）的内存与时间枷锁&lt;/h3&gt;
&lt;p&gt;在 XGBoost 中，为了寻找最佳的特征切分点，算法必须在&lt;strong&gt;每一棵树开始构建之前&lt;/strong&gt;，将所有样本按照每一个特征的值进行&lt;strong&gt;全局精确排序&lt;/strong&gt;，并将其存储在特定的内存块（Block）中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;时间代价&lt;/strong&gt;：对千万级样本的单个特征进行排序，时间复杂度为 $O(N \log N)$。如果有 100 个特征，排序本身的开销就极其庞大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;空间代价&lt;/strong&gt;：存储排序后的数据结构需要消耗巨大的内存。当数据量达到几十 GB 时，极易导致内存溢出（OOM），且频繁的内存读写会严重破坏 CPU 的缓存命中率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-level-wise按层生长的计算浪费&#34;&gt;2. Level-wise（按层生长）的计算浪费&lt;/h3&gt;
&lt;p&gt;XGBoost 默认采用 Level-wise 的树生长策略，即“大锅饭”模式：第一层分裂 2 个节点，第二层分裂 4 个节点，以此类推。
这种策略的死板之处在于：哪怕当前层中某些节点分裂后带来的增益（Gain）微乎其微，算法也会为了“凑齐这一层”而强行分裂。这不仅产生了大量无效的废节点，浪费了宝贵的计算资源，还增加了模型过拟合的风险。&lt;/p&gt;
&lt;p&gt;针对这两个痛点，LightGBM 从数据结构、生长策略、采样机制和特征工程四个维度进行了彻底的重构。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二-核心突破一histogram-直方图算法--彻底抛弃全局排序&#34;&gt;二、 核心突破一：Histogram 直方图算法 —— 彻底抛弃全局排序&lt;/h2&gt;
&lt;p&gt;这是 LightGBM 提速和节省内存的最核心武器。许多初学者在接触直方图算法时，容易产生概念上的混淆，我们需要从数学本质和算法复杂度上进行深度拆解。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【量化】从零到LGBM | 4 | XGBoost</title>
      <link>/posts/xgboost/</link>
      <pubDate>Thu, 20 Aug 2026 11:30:00 +0800</pubDate>
      <guid>/posts/xgboost/</guid>
      <description>&lt;h1 id=&#34;xgboost-把-gbdt-做到更优&#34;&gt;XGBoost ：把 GBDT 做到更优&lt;/h1&gt;
&lt;p&gt;在机器学习的集成学习领域，GBDT（Gradient Boosting Decision Tree）以其&amp;quot;泛函梯度下降&amp;quot;的本质，奠定了基于树的模型的理论基石。然而，将理论推向工程巅峰、在 2015 年前后横扫几乎所有结构化数据竞赛和量化私募 Baseline 的，是陈天奇博士提出的 &lt;strong&gt;XGBoost（eXtreme Gradient Boosting）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;XGBoost 并非推翻 GBDT，而是在其框架下，对**目标函数（如何计算梯度）&lt;strong&gt;和&lt;/strong&gt;树的生长方式（如何寻找分裂点）**进行了极其精妙的改造。本文将深入 XGBoost 的数学内核与工程细节，带你理解这个&amp;quot;一代霸主&amp;quot;的真正精髓。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一从一阶到二阶泰勒展开带来的精度飞跃&#34;&gt;一、从一阶到二阶：泰勒展开带来的精度飞跃&lt;/h2&gt;
&lt;h3 id=&#34;11-gbdt-的局限只看坡度&#34;&gt;1.1 GBDT 的局限：只看&amp;quot;坡度&amp;quot;&lt;/h3&gt;
&lt;p&gt;在前序课程中，我们了解到 GBDT 利用**一阶梯度（负梯度）**来决定树的生长方向。这就好比下山时，你只用脚试探哪边是下坡（一阶导数），然后朝那个方向走。这种方式虽然有效，但过于粗糙，你无法判断前方是平缓的斜坡还是陡峭的悬崖。&lt;/p&gt;
&lt;h3 id=&#34;12-xgboost-的改进同时看坡度和曲率&#34;&gt;1.2 XGBoost 的改进：同时看&amp;quot;坡度&amp;quot;和&amp;quot;曲率&amp;quot;&lt;/h3&gt;
&lt;p&gt;XGBoost 引入了&lt;strong&gt;二阶泰勒展开&lt;/strong&gt;，这正是牛顿法的思想。假设当前模型为 $F_{t-1}(x)$，我们要添加一棵新树 $f_t(x)$，新的目标函数可以近似展开为：&lt;/p&gt;
&lt;p&gt;$$Obj \approx \sum_{i=1}^N \left[ L(y_i, F_{t-1}(x_i)) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right]$$&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$g_i$：损失函数对当前预测值的&lt;strong&gt;一阶导数（梯度）&lt;/strong&gt;，代表&amp;quot;误差有多大&amp;quot;&lt;/li&gt;
&lt;li&gt;$h_i$：损失函数对当前预测值的&lt;strong&gt;二阶导数（海塞矩阵）&lt;/strong&gt;，代表&amp;quot;误差变化的剧烈程度（曲率）&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;直观理解&lt;/strong&gt;：如果将优化过程比作开车下山，一阶导数相当于方向盘和油门，告诉你该往哪边走；二阶导数则相当于路况感知系统，告诉你前方是平缓斜坡（可以踩大油门）还是急转弯（必须减速）。有了二阶信息，模型能够更精准地预测下一步该迈多大，从而更快、更稳地到达最优解。&lt;/p&gt;
&lt;h3 id=&#34;13-为什么止步于二阶&#34;&gt;1.3 为什么止步于二阶？&lt;/h3&gt;
&lt;p&gt;一个自然的疑问是：既然二阶比一阶好，为什么不继续引入三阶导数甚至更高阶？&lt;/p&gt;
&lt;p&gt;答案在于&lt;strong&gt;边际收益递减与工程成本的权衡&lt;/strong&gt;。从数学角度看，二阶导数（牛顿法）已经能够找到非常精确的局部最优解，更高阶导数对找到&amp;quot;谷底&amp;quot;的帮助微乎其微。从工程角度看，计算、存储和聚合三阶导数的开销会呈指数级上升。&lt;/p&gt;
&lt;p&gt;更重要的是，在金融等信噪比极低的场景中，用三阶导数去追求那 0.01% 的精度提升，大概率只是将市场噪音拟合得更准，实盘表现反而更差。&lt;strong&gt;二阶导数恰好在&amp;quot;拟合能力&amp;quot;和&amp;quot;抗噪鲁棒性&amp;quot;之间达到了完美的平衡。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二正则化项给模型戴上紧箍咒&#34;&gt;二、正则化项：给模型戴上&amp;quot;紧箍咒&amp;quot;&lt;/h2&gt;
&lt;h3 id=&#34;21-目标函数的完整形式&#34;&gt;2.1 目标函数的完整形式&lt;/h3&gt;
&lt;p&gt;这是 XGBoost 被称为&amp;quot;X-treme（极致）&amp;ldquo;的最重要原因。传统 GBDT 的目标函数只有损失项，而 XGBoost 的目标函数为：&lt;/p&gt;
&lt;p&gt;$$Obj = \sum_{i=1}^N L(y_i, \hat{y}&lt;em&gt;i) + \sum&lt;/em&gt;{t=1}^T \Omega(f_t)$$&lt;/p&gt;</description>
    </item>
    <item>
      <title>【量化】从零到LGBM | 3 | GBDT</title>
      <link>/posts/gbdt/</link>
      <pubDate>Thu, 20 Aug 2026 10:29:00 +0800</pubDate>
      <guid>/posts/gbdt/</guid>
      <description>&lt;h2 id=&#34;gbdt梯度提升树与函数空间中的梯度下降&#34;&gt;GBDT：梯度提升树与函数空间中的梯度下降&lt;/h2&gt;
&lt;p&gt;在集成学习的两大流派中，Boosting 的核心思想是串行训练多个弱学习器，让每一棵新树都集中纠正前面所有树留下的误差。上一篇文章我们提到，这个过程可以直观地理解为“拟合残差”。但这背后有一个容易被忽视的数学前提：只有当损失函数选用均方误差（MSE）时，“拟合残差”才严格成立。在更一般的场景下，我们需要一个更普适的框架，这就是梯度提升（Gradient Boosting）的出发点。&lt;/p&gt;
&lt;p&gt;本文将系统梳理 GBDT（Gradient Boosting Decision Tree，梯度提升决策树）的数学原理、训练流程、在量化交易中的优势与局限，并深入解释一个初学者经常困惑的问题：模型更新时所说的“加到旧模型上”到底是什么意思。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-从残差到负梯度&#34;&gt;1. 从残差到负梯度&lt;/h3&gt;
&lt;p&gt;Boosting 的原始思路可以概括为：每棵新树的目标不是直接预测原始标签，而是预测当前模型输出与真实值之间的差距，也就是残差。用公式表示：&lt;/p&gt;
&lt;p&gt;$$r_i = y_i - F_{m-1}(x_i)$$&lt;/p&gt;
&lt;p&gt;其中 $F_{m-1}$ 表示前 $m-1$ 棵树组合后的模型，$y_i$ 是样本 $i$ 的真实值。&lt;/p&gt;
&lt;p&gt;这个思路在平方损失（MSE）下是完全自洽的。如果损失函数定义为：&lt;/p&gt;
&lt;p&gt;$$L = \frac{1}{2}\sum_i (y_i - F(x_i))^2$$&lt;/p&gt;
&lt;p&gt;那么对当前模型 $F$ 求导，可以得到：&lt;/p&gt;
&lt;p&gt;$$\frac{\partial L}{\partial F(x_i)} = F(x_i) - y_i$$&lt;/p&gt;
&lt;p&gt;负梯度方向就是：&lt;/p&gt;
&lt;p&gt;$$-\frac{\partial L}{\partial F(x_i)} = y_i - F(x_i)$$&lt;/p&gt;
&lt;p&gt;恰好等于残差。因此，在 MSE 下，“拟合残差”等价于“沿着负梯度方向更新模型”。&lt;/p&gt;
&lt;p&gt;问题在于，量化交易中经常使用其他损失函数。例如分类任务使用对数损失（logistic loss），或者为了稳健性使用绝对误差损失（MAE）。在这些情况下，残差不再直接等于负梯度，原来的 Boosting 框架就需要扩展。&lt;/p&gt;
&lt;p&gt;Jerome Friedman 在 2001 年提出的 GBDT 解决了这个问题：&lt;strong&gt;每一棵新树不再固定拟合残差，而是拟合当前损失函数关于模型输出的负梯度&lt;/strong&gt;。负梯度指向损失函数下降最快的方向，因此无论损失函数是什么，只要可导，GBDT 都能工作。&lt;/p&gt;
&lt;p&gt;一个直观的类比是“蒙眼下山”。假设你站在一座山的某个位置，目标是走到山谷的最低点。你看不到全局地形，只能通过脚底感知坡度。梯度指向坡面上升最快的方向，而负梯度指向下降最快的方向。每走一步，你都沿着当前最陡的下坡方向前进。GBDT 的每一棵新树，就相当于在当前模型所在的位置计算负梯度方向，然后沿着这个方向“迈出一步”。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-gbdt-的训练流程&#34;&gt;2. GBDT 的训练流程&lt;/h3&gt;
&lt;p&gt;GBDT 的训练过程可以拆解为五个步骤，这也是 XGBoost 和 LightGBM 的共同基础。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【量化】从零到LGBM | 2 | 集成学习</title>
      <link>/posts/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0/</link>
      <pubDate>Thu, 20 Aug 2026 10:28:00 +0800</pubDate>
      <guid>/posts/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0/</guid>
      <description>&lt;h2 id=&#34;集成学习&#34;&gt;集成学习&lt;/h2&gt;
&lt;p&gt;在上一篇文章中，我们讨论了决策树的基本原理和它在量化场景下的致命缺陷：过拟合。单棵决策树很容易把市场噪声当成规律，导致回测优秀、实盘失效。一个自然的改进思路是：既然单棵树不可靠，那么能否训练多棵树，让它们共同做决定？&lt;/p&gt;
&lt;p&gt;这就是集成学习（Ensemble Learning）的核心思想。&lt;/p&gt;
&lt;h3 id=&#34;1-什么是集成学习&#34;&gt;1. 什么是集成学习？&lt;/h3&gt;
&lt;p&gt;集成学习的思路并不复杂：训练多个基础模型，再按某种方式将它们的预测结果组合起来，从而获得比单个模型更稳定、更准确的输出。这些基础模型通常被称为弱学习器（weak learner），而组合后的整体模型被称为强学习器（strong learner）。&lt;/p&gt;
&lt;p&gt;在决策树场景下，集成学习通常表现为训练多棵决策树，然后通过投票或平均的方式得到最终预测。根据训练方式和组合逻辑的不同，集成学习主要分为两大流派：&lt;strong&gt;Bagging&lt;/strong&gt; 和 &lt;strong&gt;Boosting&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;2-bagging并行的民主投票&#34;&gt;2. Bagging：并行的民主投票&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;代表模型&lt;/strong&gt;：随机森林（Random Forest）&lt;/p&gt;
&lt;p&gt;Bagging 是 Bootstrap Aggregating 的缩写，它的工作机制可以概括为三步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bootstrap 采样&lt;/strong&gt;：从原始训练集中有放回地随机抽取多个样本子集。每个子集的大小通常与原始训练集相同，但由于是有放回抽样，某些样本可能出现多次，某些样本可能一次都不出现。这样，每个子集都略有不同。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;独立训练&lt;/strong&gt;：对每个 Bootstrap 子集分别训练一棵决策树。每棵树在训练时还可以进一步引入随机性：在每个分裂节点，不比较全部特征，而是随机选取一个特征子集来寻找最佳切分。这就是随机森林中“随机”的另一个来源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;投票或平均&lt;/strong&gt;：所有树并行训练完成后，对于分类问题，最终预测由多数投票决定；对于回归问题，最终预测取所有树输出的平均值。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bagging 的核心目标是&lt;strong&gt;降低方差（variance）&lt;/strong&gt;。单棵决策树的预测结果容易受到训练数据中微小变化的影响，方差较大。通过训练多棵在不同数据子集和特征子集上得到的树，并将它们的预测结果平均，可以显著降低最终模型对特定数据扰动的敏感程度。&lt;strong&gt;形象地说，多个专家独立判断后取平均，个别专家的极端错误会被其他专家中和&lt;/strong&gt;，这就是群体平均效应在这里的体现。&lt;/p&gt;
&lt;h3 id=&#34;3-boosting串行的错题本式迭代&#34;&gt;3. Boosting：串行的错题本式迭代&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;代表模型&lt;/strong&gt;：AdaBoost、GBDT、XGBoost、LightGBM&lt;/p&gt;
&lt;p&gt;Boosting 的思路与 Bagging 完全不同。它不追求并行训练、独立投票，而是让树按顺序逐个生成，每一棵新树都重点纠正前面所有树留下的错误。&lt;/p&gt;
&lt;p&gt;具体来说：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;串行训练&lt;/strong&gt;：模型按顺序逐个添加。第一棵树先对原始目标进行拟合。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;聚焦残差&lt;/strong&gt;：第二棵树的目标不再是直接预测原始目标，而是预测“第一棵树预测值与真实值之间的差距”，也就是残差（residual）。第三棵树继续拟合前两棵树之后仍未解释的部分。这个过程可以不断重复。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;加权累加&lt;/strong&gt;：最终预测结果是所有树的输出按一定权重累加。每棵树不再是平等投票，而是根据其对整体损失下降的贡献程度来决定权重。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Boosting 的核心目标是&lt;strong&gt;降低偏差（bias）&lt;/strong&gt;。它允许模型不断修正错误，逐步逼近训练数据中那些复杂、微弱的规律。如果 Bagging 是“多个学生独立作答，最后取平均分”，那么 Boosting 更像是“一个学生反复看错题本，不断弥补自己的短板”。&lt;/p&gt;
&lt;p&gt;从数学上看，Boosting 可以理解为一个加法模型：&lt;/p&gt;
&lt;p&gt;$$F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x)$$&lt;/p&gt;
&lt;p&gt;其中 $F_{m-1}$ 是前 $m-1$ 棵树累加后的模型，$h_m$ 是第 $m$ 棵树，$\eta$ 是学习率。每一棵新树 $h_m$ 的拟合目标不再是原始标签 $y$，而是当前模型的负梯度方向，在平方损失下就是残差 $y - F_{m-1}(x)$。这也是“梯度提升”（Gradient Boosting）名称的由来。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【量化】从零到LGBM | 1 | 决策树</title>
      <link>/posts/%E5%86%B3%E7%AD%96%E6%A0%91/</link>
      <pubDate>Thu, 20 Aug 2026 09:28:00 +0800</pubDate>
      <guid>/posts/%E5%86%B3%E7%AD%96%E6%A0%91/</guid>
      <description>&lt;h2 id=&#34;决策树与查字典模型&#34;&gt;决策树与“查字典”模型。&lt;/h2&gt;
&lt;h3 id=&#34;0-量化为什么要算法&#34;&gt;0. 量化为什么要算法&lt;/h3&gt;
&lt;p&gt;这里的底层逻辑和LLM是相同的，都是将现实世界的某些东西视作一个多元函数，然后采用某种方式去逼近这个函数。&lt;/p&gt;
&lt;p&gt;在量化中，我们可以把过往的市场行情甚至新闻量化为函数的自变量，我们希望函数的输出是未来的行情预测。如果预测的好，那我们就赚钱。但是很明显，数学上不存在一个显式表达式来描述这个函数，我们就需要用一定的计算机算法去拟合这些函数，最简单的拟合就是我们高中学过的最小二乘法，LLM采用Transformer作为核心去拟合人们“说话”这个函数过程，而量化里面较为经典的就是使用LGBM去拟合“市场”这个函数过程。这就是量化算法的本质。&lt;/p&gt;
&lt;h3 id=&#34;1-什么是决策树&#34;&gt;1. 什么是决策树&lt;/h3&gt;
&lt;p&gt;想象一下，你现在是基金经理，要在 A 股 5000 多只股票中，挑出一只明天大概率上涨的股票。你的大脑里可能会浮现出一套层层递进的筛选规则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第一层判断&lt;/strong&gt;：它是沪深300成分股吗？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;否 -&amp;gt; 淘汰（风险太大）&lt;/li&gt;
&lt;li&gt;是 -&amp;gt; 进入下一层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第二层判断&lt;/strong&gt;：过去 5 天成交量是否明显放大？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;否 -&amp;gt; 淘汰（没有资金关注）&lt;/li&gt;
&lt;li&gt;是 -&amp;gt; 进入下一层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第三层判断&lt;/strong&gt;：当前市盈率（PE）是否小于 30？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是 -&amp;gt; 买入信号&lt;/li&gt;
&lt;li&gt;否 -&amp;gt; 观望信号&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;你刚刚在脑海里构建了一棵&lt;strong&gt;决策树（Decision Tree）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它也很像“查字典”。查字典时，我们不是从第一页逐页翻，而是先看首字母，再逐步缩小范围，最后定位到一个词条。决策树也是这样：通过一系列“是/否”或“大于/小于”的判断，把复杂的数据一步步划分到不同的“叶子节点”上，最终给出一个预测结果，比如“涨”“跌”或某个收益率。&lt;/p&gt;
&lt;p&gt;在计算机科学中，可以把它理解为一个多层嵌套的 &lt;code&gt;if-else&lt;/code&gt; 规则系统。更严格地说，决策树是一个树形结构：每个内部节点对某个特征做一次判断，每条分支对应一个判断结果，最终的叶子节点给出预测值。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-机器是怎么学会这棵树的核心原理&#34;&gt;2. 机器是怎么“学会”这棵树的？（核心原理）&lt;/h3&gt;
&lt;p&gt;人类可以凭经验“拍脑袋”定规则，那机器是怎么自动长出一棵树的呢？&lt;/p&gt;
&lt;p&gt;机器学习的核心思想是：&lt;strong&gt;优先寻找那个“最能区分好坏”的问题，优先提问。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在数学上，这通常通过最大化**信息增益（Information Gain）&lt;strong&gt;或最小化&lt;/strong&gt;基尼不纯度（Gini Impurity）**来实现。两者的直觉一致：都希望切分后的数据子集变得更“纯”，也就是同一组里的结果尽可能一致。&lt;/p&gt;
&lt;p&gt;举个例子：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;假设机器手里有 1000 只股票的历史数据，其中 500 只第二天上涨，500 只下跌。整体上是一团乱麻，纯度很低。&lt;/li&gt;
&lt;li&gt;机器会尝试用各种因子去切分这 1000 只股票。
&lt;ul&gt;
&lt;li&gt;如果用“股票代码尾数是奇数还是偶数”来切分，发现切完后两边仍然涨跌各半。这说明这个特征几乎没有区分能力，信息增益接近 0。&lt;/li&gt;
&lt;li&gt;如果用“过去 20 天是否连续上涨”来切分，发现：在“连续上涨”的股票中，80% 第二天出现回调；“未连续上涨”的股票中，涨跌大致各半。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;因此，对机器来说，“过去 20 天是否连续上涨”这个特征能把数据切分得更“纯”：一边大概率下跌，另一边不确定。所以，算法会优先选择这个特征作为树的&lt;strong&gt;根节点&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际训练时，算法会在每个节点遍历所有候选特征和可能的切分点，计算每一次切分带来的“纯度提升”，然后选择提升最大的那一个。这个过程不断重复，直到满足停止条件，比如达到最大深度、节点里的样本数量太少，或者继续切分不再带来明显提升。&lt;/p&gt;
&lt;p&gt;如果不加任何限制，决策树会一直分裂下去。这正是下一节要说的核心问题。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
