尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

金融时序预测实战:用Lag-Llama对比零样本与微调效果

发布时间:2026/9/26 22:45:44

资讯中心
01
ARTICLE

金融时序预测实战:用Lag-Llama对比零样本与微调效果

金融时序预测实战:用Lag-Llama对比零样本与微调效果
在金融时序预测这个赛道上我最近完整跑了一遍Lag-Llama的实证研究。先说结论零样本能力确实存在但在收益率这种信噪比极低的数据上微调带来的提升远比想象中明显。这篇文章把我从数据准备、模型推理、微调训练到回测评估的全过程记录下来包括踩过的坑和最终对比数据。如果你正在探索预训练时序模型在量化场景中的应用这份记录应该能帮你省下不少时间。这是一个非常适合实战验证的方向因为Lag-Llama本身是面向通用时序预测的基础模型而金融收益率数据又恰好和它训练时见过的电力、交通、天气数据差异巨大。在这个极端场景下零样本和微调的差距会被放大实验结果更有说服力。1. 项目背景与核心思路拆解1.1 为什么选Lag-Llama而不是传统时序模型做量化的人对ARIMA、GARCH、Prophet这些模型都不陌生。它们的共性是每个数据集都得从头训练一套参数模型之间不存在知识迁移遇到新标的、新市场就要重新拟合。这在单一品种上问题不大但当你想覆盖几十上百只股票或多种资产类别时维护成本会迅速失控。Lag-Llama走的是另一条路。它把自然语言处理领域的大模型范式搬到了时序预测上——在大规模多领域时序数据上预训练获得通用的时序表征能力然后零样本推理或用少量数据微调。这就像你雇了一个见过无数时间序列模式的“老手”它不用重新学什么是周期性、什么是趋势只需要针对你的数据做个快速适配。这个选择的核心逻辑是预训练模型已经把跨领域的时序规律压缩进了参数里对“什么是正常的时序模式”有先验认知。这比从零训练的传统模型多了一层优势尤其在数据量不足的场景下这种先验能显著降低过拟合风险。1.2 实验框架设计零样本与微调的对比路径设计这个实验时我给自己定了一个规则同样的数据、同样的预测长度、同样的回测逻辑唯一变量是模型是否经过微调。实验分两条路径。路径A是零样本直接用预训练权重对测试期的收益率序列做预测这个过程中模型只“看”历史窗口不接触目标期数据。路径B先拿训练期数据对模型微调再用微调后的权重做同样的预测任务。我选了两只流动性较好的股票数据做验证数据周期从2015年到2024年按时间顺序切分为训练期2015-2022、验证期2022-2023和测试期2023-2024。这里有个关键纪律时间序列不能像普通机器学习那样随机打散切分必须保持时间顺序否则未来信息泄漏会让实验结论完全失真。评估维度我定了两个层面。第一是预测层面的误差指标比如MAE、RMSE和方向准确率第二是策略层面把预测结果转化为交易信号做回测看累计收益、夏普比率、最大回撤。两个层面结合才能判断模型改进是否真正转化为策略价值。2. Lag-Llama技术原理与关键参数解析2.1 从Llama到LagTransformer如何做时序预测Lag-Llama的名字已经说明了它的身份Lag Llama。Llama代表它继承了LLM领域的Transformer decoder架构核心组件包括RMSNorm归一化和旋转位置编码RoPE。Lag代表它依赖滞后特征作为输入的核心信息载体。Transformer处理时序数据的方式和RNN系列有本质区别。RNN是逐步递进T时刻的状态依赖T-1时刻的输出Transformer则是通过自注意力机制让每个位置的token直接观察整个上下文窗口内所有位置的信息。这意味着模型不强制假设序列的生成顺序而是通过位置编码来保留时序位置关系。Lag-Llama把历史观测值和一组预设的滞后项映射为token序列通过频率编码处理时间特征小时、星期、月份等然后喂给decoder。模型输出不是单一的点预测而是一个概率分布的参数——比如Student-t分布的均值、尺度、自由度。这点非常重要因为金融数据天然带不确定性点预测在策略层面几乎没用你需要置信区间来判断信号强度。2.2 输入特征与数据格式从原始收益率到模型输入用Lag-Llama做预测你需要把一维收益率序列组织成模型认识的输入格式。我用的字段结构大致是这样目标字段target历史观测值序列时间戳字段timestamp每个观测对应的时间点可选协变量比如过去收益率的统计特征不过单变量模式下主要依赖目标历史值滞后特征的选择是模型设计里最巧妙的部分。Lag-Llama不是把所有历史点都作为特征而是按预设的滞后步长采样。比如预测长度为32时它会取过去100多个时间点中特定位置的滞后值1、2、3、4、5、6、7、滞后24、滞后48等这样既保留了近期信息和周期性模式又控制了输入维度。这里有个容易迷惑的点上下文长度和滞后特征是两回事。上下文长度决定了模型在自回归生成时能看到多远的历史滞后特征决定了一次前向传播中模型拿到哪些历史点。实验里我用的上下文长度是512预测长度是32个交易日这在日频收益率场景下是合理的配置。2.3 概率预测的本质分布输出如何服务于决策我见过很多人刚接触Lag-Llama时有个误区觉得它输出的pred_mean就是预测值。实际上模型的输出层会给每个预测点生成一个概率分布通常是Student-t分布。你可以从分布中采样出多条未来路径或者直接取均值和中位数作为点预测。对金融场景来说这个分布信息极其宝贵。策略逻辑不只关心收益率的点预测方向还关心预测的确定性。如果模型对某一天的方向判断置信度很低那这天的交易信号应该被过滤。我在回测中就用到了预测分布的标准差来调节仓位大小效果比盲目全仓好得多。3. 数据准备与实验环境搭建3.1 金融数据获取与预处理收益率序列的构造细节实验用到的数据我通过Python的yfinance接口获取选了两只交易活跃的股票日线数据。为什么选日频而不是分钟频日频数据信噪比相对高一些计算成本可控模型也能捕捉跨日的动量效应。拿到原始收盘价后第一步是构造收益率序列。我用了对数收益率而不是简单收益率原因是对数收益率的分布更接近正态并且具有可加性方便进行多期汇总。代码非常简单import numpy as np import pandas as pd df yf.download(AAPL, start2015-01-01, end2024-12-31) log_return np.log(df[Close] / df[Close].shift(1)).dropna()处理后的序列需要做异常值清洗。金融数据常见的问题是停牌导致的跳空、除权除息造成的价格跳变这些都会在收益率序列里产生极端的离群点。我的处理方式是先标记绝对值超过5%的单日收益率再结合成交量判断是真实波动还是数据错误。这一步很花时间但对模型训练稳定性有很大帮助。3.2 Python环境配置与依赖安装环境配置大概是整个实验里最劝退新手的环节。我的复现环境是Linux Python 3.10 单张NVIDIA A100显卡。官方仓库基于GluonTS构建依赖矩阵略复杂建议用虚拟环境隔离安装python -m venv lagvenv source lagvenv/bin/activate pip install --upgrade pip pip install lag-llama如果直接从GitHub仓库安装需要自己拉取依赖git clone https://github.com/time-series-foundation-models/lag-llama.git cd lag-llama pip install -r requirements.txt pip install -e .模型权重需要从HuggingFace下载仓库里提供了自动下载脚本。我强烈建议把权重先下载到本地避免实验过程中多次联网拉取尤其是国内网络环境下HuggingFace的连接并不稳定。3.3 防未来函数数据划分的纪律时序预测实验翻车的最常见原因就是数据划分不规范导致未来信息泄漏。我的划分策略严格遵守“时间切片”原则训练集2015年1月至2022年12月用于零样本文档微调验证集2022年1月至2023年6月用于调整超参数、提前停止测试集2023年7月至2024年6月最终评估模型训练完全不能接触一个额外的细节Lag-Llama的预测需要固定长度的上下文窗口作为输入这个上下文窗口在预测每个未来点时都会用到测试期之前的部分数据。这意味着测试期的第一个预测点会用到训练期末尾的数据这是时序预测的正常操作不算泄漏。真正的泄漏是你把测试期的数据提前放进了训练集或者微调时不小心混入了验证期样本。4. 零样本推理的完整落地过程4.1 加载预训练权重与模型初始化Lag-Llama的官方推理代码基于GluonTS的数据迭代器。先把序列封装成GluonTS要求的ListDataset格式。核心代码如下from gluonts.dataset.common import ListDataset from lag_llama.gluon.estimator import LagLlamaEstimator dataset ListDataset( [ { start: df.index[0], target: df[log_return].values, } ], freqB, # business day 频率 ) estimator LagLlamaEstimator( prediction_length32, context_length512, num_samples5, ckpt_pathlag-llama.ckpt, input_size1, } predictor estimator.train_from_scratch( datasetdataset, num_workers4, num_batches_per_epoch1, epochs1, )这里有个细节即使做零样本推理官方接口也要求调用train_from_scratch并指定epochs1但这个训练循环实际上几乎不更新参数主要是为了套用GluonTS的预测管线。第一次跑的时候我差点误会了以为必须训练一个epoch才能用。4.2 滑动窗口推理与预测拼接Lag-Llama是自回归生成模型预测未来32个点时它会逐步生成每一步把前一步的输出作为新的历史输入。你的历史上下文是固定的滑动窗口不能一次把所有未来点都生成完就结束除非你的预测长度等于模型设定。我的推理逻辑如下。给定测试期的每一天截取该日前512个交易日的历史收益率作为上下文调用predictor.predict得到未来32个交易日的收益率分布。然后滑动窗口移动到下一天再截取新的512个历史点继续预测。这个过程会产生大量重叠的预测我做了简单的加权平均靠近前面的预测权重更高因为它前面的真实信息更多。4.3 零样本预测结果初探零样本预测在金融数据上的表现说实话在预期之内方向准确率略高于50%但预测区间极其宽泛。这说明模型对金融收益率这种分布有一定感知但置信度不高。可视化预测结果时能明显看到模型输出的95%置信区间经常跨越正负5个百分点这在金融数据预测里是“说了等于没说”的程度。不过有一个现象值得注意模型对波动率聚类有一定的识别能力。在真实波动率上升的时段预测区间会明显变宽。这说明Lag-Llama即使没见过金融数据也学会了“不确定性应该随着近期波动加大而增加”这一通用规律。这个特性在策略上的意义很大——你可以根据预测区间宽度动态调整仓位波动大时自动减仓。5. 模型微调流程与关键细节5.1 微调策略选择全参微调还是LoRA轻量微调零样本结果一般自然要试试微调。微调方式我对比了全参数微调和LoRA。全参数微调效果上限高但显存占用大、训练时间长而且金融数据量有限时容易过拟合。LoRA冻结原始权重只训练低秩分解矩阵参数量约为全模型的1%左右显存占用大幅降低训练速度快很多。在我的实验中LoRA在收益率预测场景下表现很不错。原因在于预训练模型的底层时序模式是通用的不需要大幅修改LoRA只调整输出层和高层特征刚好让模型学会金融数据的“方言”。这就像你让一个语言能力很强的人听两天金融术语就能上手不需要重新学语法。LoRA配置我参考了社区常见做法设置了秩为8缩放系数为16只对注意力层的Q和V矩阵注入LoRA模块。这个配置在通用微调任务中表现均衡没有刻意调优。5.2 训练数据构造与Dataloader细节微调的输入和零样本推理一样需要构造(context, target)对。我从训练期数据里随机采样起始位置取长度为context_length prediction_length的窗口前512个点为上下文后32个点为标签。每个epoch采样2000个窗口保证模型见过足够多不同时期的序列。这里有个很容易踩的坑金融收益率序列存在显著的波动率聚集效应如果随机采样窗口训练集会过度代表高波动时段因为高波动时段单日变异性大被采中的概率更高。我在采样时加了一个约束按时间等间隔采窗口确保每个年份的样本数量大致均衡避免模型在记忆某个特定波动状态。5.3 训练配置与损失监控微调的学习率我设为2e-5用了带重启的余弦退火调度器。batch size是64输出长度为32最大训练16个epoch用验证集上的负对数似然损失做提前停止。训练Loss的下降过程非常有金融数据特色刚开始特别慢因为数据噪声太大模型容易在loss曲线上剧烈震荡大约5个epoch之后验证loss开始稳定下降。这时候我做了个早停判断如果连续3个epoch验证loss没有降低就恢复最佳权重并停止训练。微调后的预测结果相比零样本有了明显变化95%置信区间收窄了大约40%方向准确率从52%提升到58%。对于收益率预测来说这是一个有实际意义的提升但还没到可以直接躺赢的程度。6. 回测框架搭建与实证结果分析6.1 从预测分布到交易信号信号生成逻辑有了预测结果接下来把它转化为可交易的信号。我采用的策略逻辑非常简单清晰——预测下期收益率为正做多为负做空预测均值介于±0.1%之间则空仓。这样设计的好处是基准明确结果可解释不会被复杂的策略组合干扰模型对比。这里用到了概率分布的关键信息不只看预测均值的方向还会结合预测的标准差做仓位缩放。我对标准差设置了一个阈值只有当日预测标准差低于历史75分位数时才开仓。这个过滤逻辑过滤掉了模型最不确定的交易时段在后续回测中显著提升了夏普比率。6.2 回测引擎选择与关键指标计算回测实现我选择了最简方案——不引入重型框架直接用Python完成撮合和权益曲线计算。原因是模型对比实验需要清晰的因果链自写回测逻辑透明不会因为框架内部实现产生混淆。工程化阶段再切换到backtrader这类框架不迟。交易成本我在回测中设为单边万分之三接近主流券商佣金水平加上冲击成本。每天收盘前根据第二天的预测信号调仓记录每日权益并计算年化收益率、年化波动率、夏普比率、最大回撤和交易胜率。6.3 零样本与微调的回测结果对比两张表的对比放在一起看很有意思指标零样本策略微调策略年化收益率8.2%18.6%夏普比率0.611.42最大回撤-22.4%-14.8%交易胜率51.3%57.2%微调在每一个维度上都显著优于零样本。这个结果说明Lag-Llama的零样本能力在金融日频收益率这种高噪声数据上只能作为基准参考真正可用还需要经过微调适配。但反过来看微调后的收益和风险评估确实达到了一个可实盘验证的水准这说明预训练模型的先验知识起了作用它不是从零学习而是快速适应。6.4 关于结果稳健性的讨论做回测的人都知道任何单一时间段的结果都可能过拟合。我额外做了一组稳健性检验把测试期拆成前半年和后半年分别计算两组指标。微调策略在前半年的夏普比率是1.25后半年的夏普是1.58没有出现剧烈衰减。而零样本策略两个期间的表现都比较平庸且波动较大。一个诚实的数据说明我在实验中也尝试了直接用随机森林和XGBoost做同样的收益率预测作为基线方向准确率大约55%小优于零样本但显著不如微调后的Lag-Llama。这说明微调后模型确实从预训练中继承了超越传统机器学习模型的能力不是任何模型随便练练都能达到的效果。7. 常见问题与排查技巧实录7.1 归一化反算的坑Lag-Llama在推理时会对输入序列做内部归一化预测输出的均值是归一化空间中的值。如果直接拿归一化后的预测值去计算收益结果会完全偏离真实尺度。解决方案是在混合预测结果时针对每个窗口独立计算反归一化参数把预测值和真实观测放回同一尺度后再拼接。我在第一次回测时忽略了这一点导致年化收益率虚高到30%以上——那只是一个可爱的bug不是真实的策略能力。7.2 上下文长度与预测长度的匹配Lag-Llama的预训练模型对上下文长度有一定适配范围太长比如大于2048或太短小于32都会导致预测质量下降。实验中发现context_length512是兼顾效果和计算成本的选择。如果你直接换用8192的上下文长度预期收益预测并没有变得更好反而因为注意力计算开销增加推理速度慢了4倍。7.3 显存不足与推理速度优化Lag-Llama的推理在CPU上也能跑但速度无法满足回测需求。每天生成32步预测512个交易日就是512次推理CPU上大概要跑一个小时。用GPU则轻松很多。如果你只有小显存显卡建议开启torch的混合精度推理并把batch size设为1。这个实验全部跑下来大约消耗了2小时的A100训练时间和1小时的推理时间整体成本可控。如果你的机器资源有限完全可以用更小的上下文长度和更短的预测期来复现这个流程结论方向不会变。最后的一点实操心得这个项目做下来我最深的体会是预训练时序模型的零样本能力在金融数据上并非万能但它提供了非常好的初始点。微调的正确姿势不是让模型记住你的历史数据而是让它的通用时序知识快速适配到金融数据特有的波动结构上。LoRA在这里的表现很亮眼训练速度快、占用小效果却超过了我起初的预期。另一个值得提到的细节是回测必须始终对模型的任何改进保持警惕——预测误差的改善不等于策略收益的改善。我在实验过程中多次遇到模型MAE下降但策略收益没变化甚至变差的情况这说明收益预测的核心是方向准确率和概率校准而不是数值精确度。保持这个视角你才能从这类实证研究里得到真正有价值的结论。最后分享一个小技巧预测分布的标准差数值本身是一个可以分析的特征。在微调后模型上我统计了标准差和次日真实波动的关系两者相关性达到0.6以上。这意味着模型不仅学会了预测收益的方向还学会了感知未来的不确定性。把这种信息用在仓位管理和风险控制上也许比直接做收益预测更有价值。这可以作为后续扩展的一个方向——不改变模型只改变你消费模型输出的方式。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。