👋 欢迎来到c.w.的Blog

别回头别停留往前走

【LLM】从零开始学大语言模型 | 6 | Encoder-Decoder和掩码

Encoder-Decoder 架构与 Mask 机制:从翻译模型到自回归生成 在理解了 Attention、Multi-Head Attention、FFN 以及 Transformer Block 之后,我们已经拥有了一个可以反复堆叠的基础模块。下一步要回答的问题是:这些模块如何组成一个完整的模型?在 2017 年的论文《Attention Is All You Need》中,Transformer 被设计成一个 Encoder-Decoder 架构,最初主要用于机器翻译这样的序列到序列任务。也就是说,输入是一段序列,输出也是一段序列,而且输入和输出长度可以不同。 这篇文章将从整体架构、Decoder 的特殊结构、Mask 机制、训练时的 Loss 与反向传播,以及多层 Decoder 中 Cross-Attention 的 KV 来源几个方面,把 Encoder-Decoder Transformer 的工作方式完整梳理一遍。 一、从单个 Transformer Block 到 Encoder-Decoder 架构 1. Encoder 与 Decoder 的分工 可以把 Encoder-Decoder 结构理解成一个翻译官的工作台。 左侧是 Encoder,也就是编码器。它的任务是深度阅读源语言。例如输入一句中文:“我 / 爱 / AI”,Encoder 会通过多层网络逐步理解这些词之间的关系:谁是主语,谁是谓语,哪个词修饰哪个词,整句话的整体语义是什么。经过若干层 Encoder Block 之后,模型得到的不是一串孤立的词向量,而是一组包含上下文信息的特征向量。可以把它看作 Encoder 对源语言句子进行抽象压缩后得到的“语义表示”。 右侧是 Decoder,也就是解码器。它的任务是逐字生成目标语言。例如它要生成英文:“I / love / AI”。Decoder 不能像 Encoder 那样一次性随意看完整句目标语言的全部内容,因为在真正生成文本时,模型只能依赖已经生成的内容。Decoder 需要一边参考 Encoder 对源语言的理解,一边根据当前已经生成的词预测下一个词。 ...

August 21, 2026 · 6 min · 1093 words · c.w.

【LLM】从零开始学大语言模型 | 7 | Encoder-only架构和BERT

Encoder-only 架构与 BERT 家族:理解型大模型的构建方式 在 Transformer 的完整结构中,Encoder 与 Decoder 共同组成了一套既能理解文本、又能生成文本的模型框架。但在真实工业应用中,不同任务对模型能力的要求并不相同。有些任务需要模型不断生成新的词元,例如机器翻译、对话生成、文章续写;而另一些任务只需要模型读懂输入文本,然后给出判断、分类、标注或打分。 正是因为任务目标不同,Transformer 在后续发展中逐渐演化出了几类典型架构。其中第一类,就是专门面向文本理解任务的 Encoder-only 架构。这一方向最具代表性的模型,是 Google 在 2018 年提出的 BERT。 本文将系统梳理 Encoder-only 架构的设计动机、BERT 的核心训练任务、特殊 Token 的作用,以及“预训练 + 微调”这一改变 NLP 发展路径的技术范式。同时,我也会把一些常见疑问自然地融入解释中,例如:BERT 的伟大是否主要来自训练任务设计?微调时所谓“在顶层加一个分类器”到底是什么意思?Encoder-only 模型最后输出的矩阵又如何接到具体任务上? 一、从完整 Transformer 到 Encoder-only 1. Encoder 的特长:双向理解上下文 在原始 Transformer 中,Encoder 的职责是接收一段输入序列,并通过多层 Self-Attention 和前馈网络,为序列中的每个词元生成富含上下文信息的表示。 Encoder 的关键特点是:它的 Self-Attention 通常不限制词元之间的可见范围。对于输入序列中的任意一个词元,它既可以关注左侧上下文,也可以关注右侧上下文。也就是说,模型在表示一个词时,能够同时利用这个词前后的信息。 举例来说,对于句子: 我 今天 去 买 了 苹果 如果要理解“苹果”这个词的含义,模型不仅可以看到左侧的“我 今天 去 买 了”,也可以在条件允许时看到右侧可能出现的词。虽然这个例子右侧可能没有更多内容,但在更复杂的句子中,右侧上下文常常非常重要。例如: He deposited some money in the bank(他在银行存了钱) 与: ...

August 21, 2026 · 4 min · 846 words · c.w.

【LLM】从零开始学大语言模型 | 5 | Transformer

从多头注意力到完整 Transformer Block:结构、原理与训练逻辑的系统讲解 本文假设你已经了解词向量、位置编码以及单头 Self-Attention 的基本思想。在这个基础上,我们继续向前推进:为什么单头注意力不够用?多头注意力到底在做什么?Attention 之后为什么还要接一个前馈网络?残差连接和层归一化为什么是深层 Transformer 能够训练的关键?最终的 Transformer Block 又如何组成一个完整的语言模型? 我们会尽量把这些问题放在同一条主线里讲清楚:以一个"预测下一个词"的语言模型为例,从输入词向量开始,一步一步说明数据如何被加工,参数如何被训练,以及每个组件为什么必须存在。 一、从任务出发:Transformer 在语言模型中做什么 1. 语言模型的核心任务 为了让讨论有明确的目标,我们采用现代大语言模型最常见的训练任务之一:预测下一个词。 给定一句话的前半部分,例如: 今天天气真好,我想去 模型的任务是预测下一个最可能出现的词,例如: 公园 这看起来只是"猜下一个词",但要做好这件事,模型需要理解词义、语法、指代关系、常识推理,甚至语气和语境。因此,Transformer 并不是简单地查表,而是要把原始词向量逐层加工成更适合预测的语义表示。 2. Transformer 的整体流水线 一个典型的 Decoder-only 语言模型,前向过程大致可以概括为: 词编号 → 词嵌入与位置编码 → 多个 Transformer Block → LM Head → 下一个词的概率分布 更具体地说: 输入文本首先被切成 token,并转换为整数编号。 每个 token 编号通过词嵌入矩阵变成一个稠密向量。 为了让模型知道 token 的位置,再加入位置编码。 得到的向量矩阵进入第一个Transformer Block。 经过多个 Block 的逐层加工后,得到更高层的语义表示。 最后的 LM Head 将某个位置的隐藏向量映射到词表大小的 logits。 通过 Softmax 得到下一个词的概率分布。 如果输入序列的形状是 [batch_size, seq_len, d_model],那么经过每一个 Transformer Block 后,形状通常保持不变,仍然是 [batch_size, seq_len, d_model]。也就是说,Block 的工作不是改变序列长度或向量维度,而是不断改变每个 token 向量内部的语义内容。 ...

August 21, 2026 · 6 min · 1135 words · c.w.

【LLM】从零开始学大语言模型 | 4 | Attention

从注意力机制到自注意力与位置编码:Transformer 核心机制详解 在这篇文章中,我们从一个非常自然的问题出发:为什么深度学习在处理序列信息时,会从 RNN 逐渐走向 Attention,再进一步走向 Transformer 中的 Self-Attention?我们会把注意力机制的直觉、数学公式、工程意义,以及它与 RNN 的本质区别讲清楚,并进一步讨论 Self-Attention 中非常关键的缩放因子、位置信息丢失和位置编码问题。 为了避免概念混乱,本文会特别澄清几个常见误解:Attention 不是简单地把 RNN 的隐藏状态替换成 Q、K、V;W_Q、W_K、W_V 也不是所谓“三层感知机”;早期 Attention 与现代大模型中常见的 Self-Attention 之间既有历史联系,也有本质差别。 一、从 RNN 的串行记忆到注意力机制的直觉 1. RNN 的串行记忆为什么容易遗忘 在 RNN 中,序列通常是一个词一个词地被处理。假设当前时刻的输入是 $x_t$,上一时刻的隐藏状态是 $h_{t-1}$,那么当前时刻的隐藏状态可以写成: $$ h_t = \tanh(W_{hh}h_{t-1} + W_{xh}x_t+b) $$ 这里最重要的角色是隐藏状态 $h_t$。它可以被理解为 RNN 的“记忆胶囊”:模型把之前看到的信息压缩进这个向量里,然后带着这个向量继续往下走。 这种方式在短序列上很自然,但问题也很明显。 首先,信息必须一站一站传递。第 1 个词的信息要先影响第 2 个词,再影响第 3 个词,一直传到第 100 个词。换句话说,如果第 100 个词想知道第 1 个词说了什么,它只能依赖前面经过 99 次传递后残留下来的状态。 其次,隐藏状态通常是固定维度的向量。无论句子有多长,所有历史信息都要被压缩进同一个有限空间里。这样一来,早期信息很容易被后来的信息覆盖、稀释或干扰。 这就是 RNN 长距离依赖困难的根源:不是模型“不想记住”,而是它的结构决定了信息必须通过一条很长、很窄、不断被压缩的通路传递。 2. 人类阅读中的选择性关注 我们来看一个很常见的英文句子: The animal didn’t cross the street because it was too tired. ...

August 21, 2026 · 7 min · 1313 words · c.w.

【LLM】从零开始学大语言模型 | 3 | RNN

序列建模的演进与困境:彻底理解 RNN、LSTM 与 GRU 前言 在上一篇文章中,我们学会了把文字变成计算机可以处理的向量——词向量,相当于拿到了处理文字的"数字砖块"。接下来的问题自然是:如何把这些砖块砌成一面能理解"上下文"的墙?语言天生带有顺序,同样几个词,顺序不同,意思可能完全相反。本文将讲述早期的研究者如何试图给模型装上"记忆",以及这些尝试为何最终走入死局。只有把这份"痛"理解透彻,日后才能真正体会 Transformer 带来的范式革命。 全文将沿着三个问题展开:RNN 是干什么的?它靠什么机制实现?它又卡在了哪里? 一、MLP 是"失忆"的,而语言是有顺序的 回顾一下多层感知机(MLP,也就是神经网络的基本形态)。从数学上看,一个训练好的 MLP 就是一个固定的函数 $y = f(x)$:输入 $x$,经过逐层的线性变换与非线性激活,得到输出 $y$。这里要注意"函数"二字的含义——每一次调用都是独立的。你输入 $x_1$ 得到 $y_1$,再输入 $x_2$ 得到 $y_2$,这两次计算在底层完全不共享任何内部状态,前一次输入对后一次输出没有任何影响。换句话说,MLP 没有记忆:处理完一个输入就忘,根本不知道上一个输入是什么。 但语言恰恰是讲究顺序的。“我打了他"和"他打了我”,词完全一样,仅因顺序不同,意思就完全相反。如果把每个词独立地喂进 MLP,模型看到的只是一堆孤立的词,看不见顺序,也看不见上下文。这就像一页一页随机抽着读一本书,永远拼不出完整的情节。 因此,要处理语言,就需要一种带记忆的结构:它在处理当前输入时,能够同时参考"之前发生过什么"。这正是循环神经网络(Recurrent Neural Network, RNN)的出发点。 二、先明确目标:RNN 最终输出什么? 在讲机制之前,有必要先说清楚 RNN 是用来干什么的。不知道目的,就很容易在过程的细节里迷路。 RNN 的目的,是处理变长的序列数据(文本、语音等),把它压缩成包含上下文信息的向量,或者直接输出另一个序列,从而完成分类、翻译、预测等任务。具体而言,最典型的任务形态有三种: 多对一(Many-to-One):输入一整句话,输出一个标签。典型例子是情感分类:模型依次读入"这 / 电影 / 太 / 棒 / 了",读完最后一个词后,给出"正面 95%、负面 5%“这样的判断,目的是分辨这句话是夸还是骂。 序列到序列(Seq2Seq):输入一个序列,输出另一个序列。典型例子是机器翻译:一个 RNN 作为编码器(Encoder)读入中文"我 / 爱 / 你”,把整句话压缩成一个浓缩语义的上下文向量;另一个 RNN 作为解码器(Decoder)依据这个向量,逐个词地生成英文"I → love → you"。 多对多(Many-to-Many):每读入一个词,同时输出一个标签。典型例子是词性标注:对"我 / 吃 / 苹果",模型同步输出 [代词, 动词, 名词],用于分析句子的语法结构。 ...

August 21, 2026 · 3 min · 535 words · c.w.

【LLM】从零开始学大语言模型 | 2 | 词嵌入

从 One-Hot 到词嵌入:让计算机理解文字的语义空间 自然语言处理要解决的第一件事,其实非常朴素:怎样把人类语言变成计算机能够计算、能够学习、能够比较的数学对象。 一句话看起来很简单,比如:我喜欢吃苹果。但对计算机来说,这串文字本身并不能直接参与矩阵乘法、梯度下降和概率计算。计算机擅长处理的是数字,尤其是连续的、可以进行加减乘除和求导的数值。因此,自然语言处理的第一步,就是把“文字符号”转换成“数值表示”。 这篇文章将从最基础的 One-Hot 编码讲起,逐步过渡到现代深度学习中广泛使用的词嵌入,也就是 Word Embedding。我们会解释为什么 One-Hot 编码虽然简单却不够好,词向量为什么能够表达语义,Word2Vec 是如何训练出词向量的,以及现代大模型中的 Embedding 层和中文 Tokenization 又是怎么一回事。 理解这些内容,是后续理解 Transformer、注意力机制以及大语言模型中各种矩阵运算的重要前提。 一、计算机的“文字障碍” 计算机本质上处理的是数字。更准确地说,是基于二进制数值进行算术运算和逻辑运算。如果我们把一句话直接交给模型,例如:我喜欢吃苹果模型并不能天然理解“我”“喜欢”“吃”“苹果”这些符号意味着什么。它们只是字符,是离散的语言单位。 这里至少有三个困难。 1. 文字是离散符号 语言中的词或者字,本质上是离散符号。我们可以说“苹果”和“香蕉”都是水果,但很难说“苹果”比“香蕉”大多少。数字则不同。对于数值 3 和 5,我们可以说 5 比 3 大,差值是 2。这种连续性让数学运算变得自然。但词语之间没有这种天然的数值大小关系。因此,我们需要人为设计一种数值表示,使离散符号能够进入连续数学空间。 2. 词汇量很大,容易造成维度灾难 人类语言的词汇量非常庞大。中文有常用字、生僻字、词语、成语、专有名词;英文有单词、词形变化、缩写、外来词。一个实际语言系统的词表规模可能从几万到几十万不等。如果用最朴素的方法,每个词占用一个独立维度,那么向量维度会变得非常高。假设词表有 10 万个词,那么每个词都需要一个 10 万维向量来表示。这会带来严重的稀疏性和计算负担。 3. 普通编码无法表达语义关系 人类语言中,词与词之间存在复杂关系。例如: “猫”和“狗”都是常见动物; “苹果”和“香蕉”都是水果; “医生”和“医院”经常共同出现; “国王”和“女王”之间存在性别对应关系。 如果只是简单给每个词编号,计算机无法知道这些关系。我们需要一种表示方法,使得语义相近的词在数值空间中也更接近。 换句话说,我们希望把离散符号变成连续的、低维的、带有语义结构的数学对象,通常是向量。这就是词嵌入要解决的问题。 二、One-Hot编码:最朴素的词表示方法 最直观的想法是:给词典里的每个词编号,然后用一个向量来表示它。 假设我们的词典只有 4 个词["苹果", "香蕉", "猫", "狗"],我们可以这样表示: 1 2 3 4 苹果 = [1, 0, 0, 0] 香蕉 = [0, 1, 0, 0] 猫 = [0, 0, 1, 0] 狗 = [0, 0, 0, 1] 这种表示方法叫作 One-Hot 编码,也叫独热编码 它的意思是:每个词对应一个向量,向量中只有一个位置是 1,其余位置全是 0。这个 1 的位置代表该词在词表中的编号 如果词表大小为 $V$,那么每个词都可以表示成一个 $V$ 维向量。设某个词的索引为 $i$,则它的 One-Hot 向量记作: ...

August 21, 2026 · 4 min · 723 words · c.w.

【LLM】从零开始学大语言模型 | 1 | 神经网络和多层感知机

一、从生物神经元到人工感知机 深度学习的名字里带有“神经”二字,是因为它最初的灵感来自生物神经元。一个生物神经元大致是这样工作的:树突接收来自其他神经元的信号,细胞体对这些信号进行整合;当总信号超过某个阈值时,神经元就会被激活,并通过轴突向外发出脉冲。人工感知机就是对这一过程的高度简化。1957 年前后,Frank Rosenblatt 提出了人工感知机模型。它的数学表达非常简单: $$y = f(W^T x + b)$$ 也可以写成: $$y = f\left(\sum_{i=1}^{n} w_i x_i + b\right)$$ 其中: $x$ 是输入特征向量。例如一张图片的像素值、一个样本的若干数值特征; $W$ 是权重向量,表示每个输入特征的重要程度; $b$ 是偏置,可以理解为一个阈值,决定神经元是否容易被激活; $f$ 是激活函数,或者说输出函数; $y$ 是神经元的输出。 很多初学者第一次看到这个公式时会问:这里的 $f$ 到底是什么?是不是一个 0/1 函数?这个猜测是有道理的。在最早的感知机模型中,$f$ 确实常常是阶跃函数: $$ f(z)= \begin{cases} 1, & z > 0 \\ 0, & z \le 0 \end{cases} $$ 也就是说,从二维来看,如果加权求和的结果大于 0,输出 1;否则输出 0。这看起来就是一个硬性的二分类器。从几何上看,感知机在输入空间中定义了一个超平面: $$ W^T x + b = 0 $$ 这个超平面把数据分成两类:一侧输出 1,另一侧输出 0。在二维空间里,它是一条直线;在三维空间里,它是一个平面;在更高维空间里,它是超平面。因此,感知机本质上是一个线性分类器。 不过,阶跃函数虽然直观,却有一个严重问题:它在 $z=0$ 处不可导。不可导意味着我们无法用微积分中的链式法则去计算梯度,也就很难通过“误差反向传播”来更新参数。所以,在现代神经网络中,感知机公式里的 $f$ 通常不再是阶跃函数,而是更平滑、至少几乎处处可导的函数,例如 Sigmoid、Tanh、ReLU 等。这些函数统称为激活函数。就是说,今天当我们写: ...

August 21, 2026 · 6 min · 1252 words · c.w.

【量化】从零到LGBM | 9 | LGBM的金融应用(下):模型解释、进阶方向与完整工作流

LightGBM 量化实战篇(下):SHAP 解释、进阶方向与完整工作流 前两篇分别讨论了金融数据的截面预处理与保守调参、排序学习目标函数与 Purged 交叉验证。至此,量化 LightGBM 的基础框架已经搭建完成:数据被正确处理,模型以合理的方式训练和验证。 但基础框架的完成并不意味着工作的结束。模型上线后,一系列更深层次的问题会接踵而来:基金经理需要知道"模型今天为什么选这些股票"、模型运行数月后效果开始衰减该怎么办、是否可以让模型直接优化 Rank IC、深度学习能否与 LightGBM 互补。本篇将逐一讨论这些问题,并在最后将全部流程串联为一个完整的八步工作流。 一、SHAP:打开 LightGBM 的黑盒 在量化机构中,模型的可解释性并非可选项,而是刚需。基金经理、风控部门、投资委员会都会提出这样的问题:今天为什么选择这些股票?模型是否在依赖某个异常因子?近期的收益究竟来自真正的 Alpha 还是某个风格暴露?回撤发生后能否定位具体原因? LightGBM 由成百上千棵树组成,直接理解其决策逻辑几乎不可能。SHAP 是目前最为广泛使用的模型解释工具。 1. SHAP 的直觉:公平分配边际贡献 SHAP(Shapley Additive exPlanations)的理论基础源于博弈论中的 Shapley Value。可以借助一个直观的例子来理解:假设三人合作赚取了 100 万元,如何分配才算公平?平均分配未必合理,因为每个人的贡献并不相同。Shapley Value 的思路是:考察每个人在所有可能的加入顺序下的边际贡献,然后对所有排列取平均值。 映射到特征上,公式是: $$\phi_i = \sum_{S \subseteq F \setminus {i}} \frac{|S|!(|F|-|S|-1)!}{|F|!} \left[ v(S \cup {i}) - v(S) \right]$$ 其中 $S$ 是不包含特征 $i$ 的特征子集,$v(S)$ 是仅使用集合 $S$ 中特征时模型的预测值,$\phi_i$ 是特征 $i$ 的 Shapley 值。该公式的具体形式无需记忆,其核心含义可概括为一句话:SHAP 旨在公平地量化模型最终预测中每个特征的贡献度。 2. 在 LightGBM 选股中,SHAP 解释什么? 假设模型为某只股票输出了 $+3.0%$ 的预测分数,SHAP 可以将这一预测分解为: ...

August 21, 2026 · 2 min · 402 words · c.w.

【量化】从零到LGBM | 8 | LGBM的金融应用(中):排序学习、对冲与交叉验证

LightGBM 量化实战篇(中):排序学习、Beta 对冲与 Purged 交叉验证 上一篇讨论了金融数据的特殊性质、截面预处理方法和保守的超参数调优策略。完成这些环节后,我们已经知道如何将金融数据正确地处理并喂入 LightGBM。但还有一个关键问题尚未回答:模型的优化目标应该是什么? 回归目标(预测绝对收益率)和排序目标(学习股票的相对强弱)是两种截然不同的思路。选定目标函数后,还需要理解选股得到的相对强弱如何转化为实际收益,以及如何通过严格的交叉验证确保模型没有偷看未来数据。这三个问题构成了本篇的核心内容。 一、排序学习:让模型直接回答"谁更强" 量化选股中存在一个核心认知:我们关注的并非绝对收益预测的精度,而是排序的正确性。假设模型预测 A 涨 3.1%、B 涨 2.9%,而实际 A 涨 1.2%、B 涨 1.0%,绝对收益的预测值与实际值差距显著,但排序关系是正确的。当投资组合仅持有排名前若干只股票时,排序的正确性已经满足需求。因此,目标函数的设计应当与这一目标保持一致。 1. 回归目标的问题 LightGBM 默认支持回归目标,比如最小化均方误差: $$\mathcal{L} = \sum_i (y_i - \hat{y}_i)^2$$ 直接以未来收益率作为标签、训练模型预测绝对收益,会面临多方面的挑战:收益率本身噪声含量高,精确预测具体的涨跌幅极其困难;收益率分布具有显著的厚尾特征,少数暴涨或暴跌的股票会严重拉偏均方误差的优化方向;模型倾向于将优化资源集中在拟合中间区域的普通股票上,而投资者真正关注的恰恰是头部和尾部的标的;此外,投资组合的构建仅依赖相对排序,而非绝对预测值。因此,回归目标并非量化选股的最优选择。 2. LambdaRank:直接学排序 LightGBM 支持排序学习目标(objective = "lambdarank")。其核心思路并非预测具体的收益率数值,而是学习一个排序分数。在每个交易日,股票的因子特征输入模型后,输出一个连续的 score 值: $$s_{i,t} = f(x_{i,t})$$ 这个 score 既不是排名也不是概率,而是一个纯粹用于排序的数值。以下是一个输出示例: 股票 模型分数 A 2.51 B 2.13 C 0.87 D -0.42 按分数从大到小排列,即为模型给出的股票强弱顺序。 训练过程中,模型可以获取真实标签(例如经未来收益率排序后划分的等级)。使用 lambdarank 时,需要传入 group 信息,以告知模型哪些样本属于同一组。在日频选股场景中,每个交易日即为一个 group: 1 group = [4000, 4020, 3980, ...] # 每天有多少只股票 训练数据必须按照 group 信息进行排序,同一天的股票数据需要连续排列。 ...

August 21, 2026 · 3 min · 611 words · c.w.

【量化】从零到LGBM | 7 | LGBM的金融应用(上):数据预处理与保守调参

LightGBM 量化实战篇(上):金融数据特性、截面处理与保守调参 前六篇文章聚焦于 LightGBM 的算法本身——树的分裂机制、GBDT 的残差拟合框架、XGBoost 引入二阶导数的意义,以及 LightGBM 通过 Histogram 和 Leaf-wise 策略实现的效率提升。那些内容属于算法原理的范畴。 但当 LightGBM 被部署到真实的股票市场中时,算法本身的精巧并不能保证结果的可靠。数据是否被正确地喂入模型、标签如何定义、回测切分如何避免未来信息泄露、模型表现异常时如何诊断——这些问题在 Kaggle 等标准竞赛中鲜少遇到,但在量化投资中却是决定成败的关键环节。 本系列共三篇,围绕一个核心问题展开:如何在量化场景中正确地使用 LightGBM。第一篇讨论金融数据的特殊性质、截面预处理方法和保守的超参数调优策略——这些是模型训练之前必须解决的输入端问题。 一、金融数据与普通机器学习数据的差异 有过机器学习实践经验的读者或许熟悉这样的工作流:在猫狗图片分类、房价预测等任务中,完成特征工程、选择合适的模型、调优超参数,性能指标通常就能稳步提升。然而,将同样的流程移植到股票市场中,往往会出现一种令人困惑的现象——回测阶段表现优异,实盘阶段却大幅失效。 这一落差的根源并不在于 LightGBM 算法本身,而在于金融数据区别于一般机器学习数据的特殊性质。 1. 信噪比极低 在图像分类任务中,猫的视觉特征是稳定且可辨识的;房价与面积之间的关系也具有较好的统计稳定性。但股票收益率的构成远为复杂——宏观消息、资金流向、散户情绪、政策变动、短期流动性冲击、纯粹的随机波动交织在一起。其中真正具有预测价值的成分,仅占收益率总体波动的很小一部分。信号微弱而噪声强大,这是金融数据最本质的特征。 因此,量化建模的评估标准不应聚焦于模型在历史数据上的拟合精度,而应关注其在未见数据上的预测稳定性。 2. 分布不稳定(概念漂移) 图像分类的决策边界不会因为日历翻页而改变,但金融市场的运行规律始终处于动态漂移之中。小市值风格可能在今年有效而明年失效;动量策略可能连续三年盈利,随后进入长达一年半的回撤期;某个量价规律一旦被市场参与者广泛识别,拥挤交易效应便会迅速侵蚀其超额收益。 这就是所谓的 Concept Drift(概念漂移)。金融市场中的规律并非物理定律,它是参与者博弈的产物。当参与者的结构和行为模式发生变化时,原本有效的规律也会随之改变。 因此,量化模型的设计应当趋于保守。对于那些缺乏坚实经济学解释、仅在特定时段表现出统计显著性的规律,应当审慎对待。模型应当优先捕捉那些更为普适、更经得起时间检验的模式。 3. 排序比绝对值重要 在量化选股场景中,模型并不需要精确预测某只股票明天的涨幅是 2.1% 还是 2.3%。假设市场中有 5000 只股票,投资组合最终可能只持有排名前 100 只。模型的核心价值在于能否准确地将这 100 只股票从全部标的中识别出来——具体的绝对收益预测值并非关键,排序的正确性才是核心。 这一认知对后续目标函数的选择具有直接的指导意义。 二、截面处理:量化数据预处理的灵魂 在标准机器学习流程中,特征工程的常规做法是对整个数据集进行统一的标准化处理——对所有样本减去均值、除以标准差。然而,股票数据的结构决定了这种方法并不适用。 股票数据本质上是面板数据(Panel Data):横轴为某一天的全部上市股票,纵轴为时间序列。在任意一个交易日,所有股票的数据集合构成一个截面(Cross-Section)。许多量化因子在绝对数值层面的含义并不稳定,真正具有信息量的是截面内的相对位置。 1. 为什么绝对数值靠不住? 以市盈率(PE)为例。假设有两只股票,A 的 PE 为 15,B 的 PE 为 100。表面上看 A 似乎更便宜,但实际情况远比这复杂。牛市中流动性充裕,市场整体估值中枢上移,PE=100 并不罕见;熊市中估值中枢下移,PE=15 也未必代表低估。此外,不同行业天然具有不同的合理估值区间——同一年内,电子行业与银行行业的 PE 量级差异极大。如果直接将绝对数值输入模型,模型很容易学到表面化的规律,例如"某年 PE 低的股票表现好",并将低 PE 泛化为一条通用规则。然而,当宏观环境切换后,这类规律往往会迅速失效。 ...

August 21, 2026 · 3 min · 475 words · c.w.