halo 的技术博客

返回

在量化投资领域,通用大语言模型虽然能生成流畅的文本,却常常在金融场景中出现”幻觉”——将2020年新冠疫情期间的市场数据与2024年的AI泡沫混为一谈,或者把港股涡轮定价机制与A股期权搞混。这并非模型能力不足,而是金融领域知识的专业壁垒太高。本文将详细解析一个量化团队如何从零开始,训练出真正”懂行”的金融专用LLM,涵盖数据工程、训练策略、对齐优化到部署推理的全流程。

一、数据工程:金融LLM的燃料选择#

训练金融LLM的第一步,是构建高质量的训练语料库。与通用语料不同,金融数据的获取难度高、噪声大、专业性强,需要精心设计的数据管道。

1.1 数据源分层架构#

金融语料可以划分为四个层次,每一层的数据量和质量要求各不相同。

第一层:结构化市场数据。包括分钟级K线、逐笔成交、Level2行情快照、融资融券余额等。这类数据的特点是数据量大(单个品种一年可达数GB)、精度高、格式规范,但纯数字形式缺乏语义信息,通常需要额外标注才能用于语言模型训练。常见的做法是将K线序列转译为文本描述,例如”2026年7月某日,沪深300指数开盘价3800点,日内最高触及3850点,成交量较前日放大20%”。

第二层:非结构化公告与研报。包括上市公司年报、半年报、招股说明书、券商研报、业绩预告、并购重组公告等。这类文本具有极强的专业性,充斥着”扣非净利润""EBITDA""商誉减值”等专业术语,是训练金融LLM最核心的语料来源。国内数据主要通过东方财富Choice、同花顺iFinD、Wind等金融数据平台获取;英文市场数据则可使用SEC EDGAR、Bloomberg、Reuters等来源。

第三层:另类数据。包括新闻资讯、社交媒体舆情(微博、雪球、Twitter/X)、卫星图像解析数据、供应链数据等。这一层数据的特点是实时性强但噪声大,需要经过情感标注、事件抽取等预处理才能使用。

第四层:公开金融知识。包括金融教材、百科词条、监管文件(证监会规则、上交所指引等)、金融论文(arXiv q-fin系列)等。这类语料提供基础知识架构,帮助模型建立金融概念之间的逻辑关联。

1.2 数据清洗与质量过滤#

获取原始数据后,需要经过严格的质量过滤流程。首先是格式标准化,将PDF年报转换为Markdown文本、修复乱码和缺失编码;然后是内容去重,使用SimHash或MinHash算法剔除重复内容;接着是质量评分,基于规则过滤广告、无关内容、纯数字表格,同时使用小型分类器(BERT-based)评估文本质量;最后是安全过滤,移除包含个人隐私信息(身份证号、手机号等)的内容。

数据配比方面,业界公认的有效配比为:市场数据描述(10-15%)、公告研报(40-50%)、另类数据(15-20%)、知识文本(20-25%)。这个配比确保模型既掌握扎实的金融知识,又具备对市场动态的敏感性。

数据工程 pipeline 示意图

二、预训练阶段:注入金融基因#

预训练阶段的目标是在通用语言模型的基础上,通过金融领域语料的继续预训练(Continue Pretraining),让模型学会金融领域的语言模式和知识关联。

2.1 训练配置策略#

继续预训练并非简单的数据替换,需要精心调整学习率调度策略。由于模型已经具备通用语言能力,金融语料的学习率应设置为预训练初期的十分之一到五分之一(通常在1e-5到5e-5区间),采用Cosine Annealing或Linear Warmup Decay调度器。训练步数通常在几千到几万步不等,取决于金融语料的总规模和通用语料的比例。

一个关键决策是是否进行多阶段训练。一种做法是先用金融知识文本打基础(2-3K步),再用市场数据描述强化(1-2K步),最后用研报公告深化(2-3K步)。多阶段训练的好处是让模型逐步从基础金融概念过渡到实盘应用场景。

2.2 知识注入效果的评估#

预训练完成后,需要评估模型是否真正习得了金融知识。常用的评估方法包括:

术语准确性测试:构造包含金融专业术语的填空题,例如”沪深300指数期货的合约乘数是___“,观察模型回答的正确率。

数值推理能力:测试模型对金融计算的理解,例如”某公司净利润10亿,总股本5亿股,每股收益为___“,检验模型是否理解EPS的定义。

上下文一致性:输入一段年报摘要,让模型续写或回答相关问题,评估其对上下文金融信息的理解深度。

预训练阶段的知识注入示意图

三、微调阶段:从”会说话”到”会交易”#

预训练后的模型已经是一个”金融通”,但还无法直接服务于量化业务。微调阶段通过SFT(监督微调)和RLHF(人类反馈强化学习),将模型能力转化为具体的量化任务能力。

3.1 SFT阶段的任务设计#

SFT微调需要构建高质量的指令数据集(Instruction Dataset)。针对量化业务场景,核心任务包括:

研报复现任务。收集研报中的投资逻辑,将”预计2026年净利润增长25%“这样的预测性陈述转化为”基于XX方法论,分析XX公司利润增长驱动因素”的指令,然后要求模型按照研报逻辑输出分析过程。

代码生成任务。这是量化团队最常用的LLM应用之一。构造包含策略描述的Prompt,例如”用Python实现一个基于双均线金叉死叉的择时策略,包含回测框架”,让模型输出完整的可执行代码。数据来源可以基于开源量化项目(如vn.py、Backtrader示例)和内部策略库的脱敏版本。

因子解读任务。输入因子名称(如”北向资金净流入”),让模型输出该因子的定义、计算方法、已知有效性和使用时注意事项。这类数据需要由资深Quant审核后标注。

市场事件分析。输入一段市场新闻或公告摘要,让模型输出该事件对相关资产价格的可能影响方向和逻辑。例如:“央行宣布降准25个基点”→“对银行板块偏利好,对高负债地产公司影响中性”。

3.2 RLHF对齐:让模型”懂”量化业务的真实偏好#

RLHF是让通用LLM脱胎换骨的关键技术,在量化场景中有着独特的应用方式。

Reward Model的设计。量化场景的Reward Model与传统NLP不同——不能仅依赖人工打分,而需要结合可量化的策略表现指标。一个可行的方案是:将模型生成的策略代码放入回测引擎,根据Sharpe Ratio、最大回撤、夏普比率等指标打分,同时辅以人工对策略逻辑合理性的评价作为补充信号。

PPO训练中的KL约束。在强化学习阶段,需要对模型输出施加KL散度约束,防止模型在追求高Reward的过程中输出完全偏离金融逻辑的内容,例如为了提高回测收益而编造虚假的价格数据。KL约束系数通常设置在0.01-0.05之间,太大则模型几乎不变,太小则容易产生幻觉。

DPO直接偏好优化。近年来DPO(Direct Preference Optimization)因其稳定性和效率成为RLHF的热门替代方案。在量化场景中,DPO可用于优化模型对不同策略风格的偏好——例如对”低回撤稳健策略”的偏好高于”高收益高风险策略”,可以通过构造相应的偏好数据对来实现。

四、部署与推理优化:让模型在实盘中跑起来#

训练完成只是第一步,如何在量化业务场景中高效部署才是关键。

4.1 推理引擎选型#

金融LLM的推理延迟要求因场景而异:研报自动生成可以接受30秒以上的延迟,但盘中择时信号生成需要在毫秒级完成。实际部署中通常采用分层架构——高频实时场景使用轻量级微调模型(如Qwen-1.8B-Int4),低频分析场景使用大参数模型(如Llama-3-70B+QLoRA微调)。

推理优化技术方面,量化推理(INT8/INT4量化)、KV Cache复用、连续批处理(Continuous Batching)是三项核心技术。对于多品种并行分析场景,Continuous Batching可将吞吐量提升3-5倍。

4.2 模型服务化架构#

推荐使用vLLM或TensorRT-LLM作为推理底座,通过OpenAI兼容API接口暴露服务。量化系统的其他模块(回测引擎、风控模块、订单管理系统)通过HTTP或gRPC调用LLM服务,实现松耦合。实际部署中需要注意的一点是:量化业务对模型输出的可解释性要求很高,建议同时部署注意力可视化模块,在模型给出建议时输出关键参考依据。

五、避坑指南:金融LLM训练的常见陷阱#

数据泄露风险。训练语料中如果包含了未来信息(如用2025年的年报训练,却用来预测2024年的股价),将导致模型学到”未来函数”,在实盘中完全失效。解决方法是严格按时间切分训练集和测试集,确保所有训练数据的截止时间早于模型服务时点的历史日期。

过拟合于特定市场风格。如果训练语料过度集中于某段特定市场环境(如2020-2022年A股结构性牛市),模型可能对其他市场风格泛化能力不足。建议训练语料覆盖至少一个完整的牛熊周期(通常5-8年)。

合规性红线。金融领域对数据合规要求极高。用于训练的研报数据需确认版权许可,分析师内部的handwritten notes绝对不能用于训练,涉及内幕信息的内容必须严格剔除。

金融LLM的构建是一项系统工程,从数据采集、模型训练到业务落地,每个环节都需要量化工程师与AI研究者的深度协作。当这套pipeline成熟运转后,一个经过领域微调的7B模型在研报解读任务上的表现,往往能超过参数规模数倍于它的通用模型——这就是领域专精的力量。

从零构建金融LLM:量化团队训练专属模型的完整技术路径
https://blog.halo26812.eu.org/blog/financial-llm-training-pipeline
Author halo
Published at 2026年7月31日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨