halo 的技术博客

返回

一个残酷的现实#

打开任何一个量化社区,你都会看到大量宣称”我用 DeepSeek/ChatGPT 预测股票涨跌”的帖子。点进去一看,99% 的做法是:把 K 线数据扔给模型,问”明天涨还是跌?”

这种做法叫 Zero-shot Prompting,答案是:不准。非常不准。

大模型确实能理解金融文本,但从零样本就直接预测股价走势——和抛硬币的区别不大。原因很简单:通用大模型的训练数据里,股价是一个随机变量加上海量噪音,它没见过你的数据分布,也没学过你的预测任务。

那要怎么做?答案是 Fine-tuning(微调)

但事情远没有这么简单。微调大模型做金融预测,每一步都布满了坑。这篇文章就是一份完整的实战地图——告诉你从哪里走,以及在哪里会摔跟头。

第一步:明确你要预测什么#

这是最重要的步骤,大多数人都跳过了。

“预测股价”是一个太模糊的目标。你需要精确到:

  • 预测目标:是涨跌方向?是收益率幅度?是波动率?还是事件发生的概率?
  • 预测周期:是日频?分钟频?周频?不同频次的数据分布完全不同
  • 评估标准:单纯看准确率?还是看夏普比率?最大回撤?或者说你能不能用这个预测赚到真金白银?

建议从最简单的开始:预测 N 日后的涨跌方向(二分类)。这个任务相对干净,数据充足,评估标准清晰(准确率 + AUC)。如果你连二分类都做不好,别想直接做收益率回归。

第二步:构建训练数据——这是真正花时间的地方#

微调大模型的魔鬼不在模型里,在数据里。

2.1 金融文本数据的获取#

大模型的优势在于理解文本,所以你的训练数据不能只有数字。一个好的金融微调数据集应该包含:

  • 新闻标题和摘要:从财经网站、雪球、东方财富抓取,带时间戳
  • 财报关键指标:营收、利润、毛利率同比环比变化
  • 研报摘要:券商研报的结论和评级变化
  • 公告信息:重大合同、增减持、分红派息
  • 社交媒体情绪:微博、雪球热帖的讨论热度和情感倾向

每条数据的格式要统一加工成 (文本描述, 标签) 对。举个例子:

输入文本: "贵州茅台2025年营收同比增长15%,净利润增长18%,毛利率维持在92%以上。机构目标价上调至2500元。"
标签: 上涨 (如果未来5日确实上涨了)
plaintext

2.2 标签工程——容易被忽视的关键#

标签不是直接用”涨”或”跌”。你需要考虑:

  • 阈值过滤:涨跌超过 1% 才算方向,剔除横盘噪音
  • 未来窗口:用 T+1 还是 T+5 的涨跌打标签?不同的窗口对应不同的策略
  • 样本平衡:牛市中上涨标签偏多,需要做采样或加权重
  • 信息泄露检查:绝对不能把未来的信息混入训练数据

数据标注流程图

2.3 数据规模建议#

  • 起步阶段:5000-10000 条高质量的文本-标签对
  • 理想规模:30000 条以上,覆盖至少 2 个完整牛熊周期
  • 最少要求:不低于 2000 条,否则模型基本学不到有效信号

第三步:选择基座模型#

并不是越大的模型越好。金融微调要考虑性价比:

模型参数量优势劣势
Qwen2.5-7B7B中文最强,部署成本低金融领域未经专门训练
Llama-3-8B8B社区生态好,工具链成熟中文能力略弱
DeepSeek-V3671B MoE推理能力极强微调成本高,部署要求高
ChatGLM-4-9B9B中文理解好,推理快长文本处理有瓶颈

推荐方案:用 Qwen2.5-7B-Instruct 作为基座模型,中文能力强、推理速度快,一张 RTX 4090 就能跑 LoRA 微调。

如果是做量化因子类的数值预测(非文本),大模型可能并不是最佳选择,传统 ML 模型(XGBoost、LightGBM)在这个场景下可能效率更高且更稳定。

第四步:微调方法选择#

4.1 LoRA / QLoRA —— 个人和小团队的首选#

LoRA(Low-Rank Adaptation) 是目前性价比最高的微调方案。它不修改原始模型权重,而是训练一个低秩的”适配器”矩阵,叠加在原有权重上。

核心参数设置建议:

  • r=16(秩):金融任务复杂度适中,16 起步
  • alpha=32:alpha 通常设为 r 的两倍
  • target_modules: q_proj, k_proj, v_proj, o_proj(注意力层)
  • learning_rate=2e-4:金融数据噪音大,学习率不宜过高

用 QLoRA(4-bit 量化 + LoRA),一张 RTX 4090 24GB 就能微调 7B 模型,训练 5000 条数据大约需要 2-3 小时。

4.2 全参数微调 —— 机构级别的选择#

如果你有 A100/H100 集群和百万级别的金融文本数据,全参数微调能带来更好的效果。但成本是 LoRA 的 10-50 倍,且容易过拟合。建议先用 LoRA 跑通流程,确认有效后再考虑全参数。

4.3 训练技巧#

  • Warmup:前 10% 的 step 逐步增大学习率
  • 梯度裁剪:clip_grad_norm=1.0,金融数据容易出现极端梯度
  • 早停:验证集 loss 连续 3 个 epoch 不降就停
  • 梯度累积:单卡显存不够时,用梯度累积模拟更大 batch

LoRA微调架构图

第五步:评估——最容易被自欺欺人的环节#

5.1 不要只看准确率#

如果一支股票 80% 的交易日都在涨,你预测”永远涨”就有 80% 准确率——但这毫无意义。

需要看的核心指标:

  • 精确率(Precision):说涨的里面真正涨的比例
  • 召回率(Recall):所有真正涨的里面你说对了多少
  • F1 分数:精确率和召回率的调和平均
  • AUC-ROC:区分涨跌的整体能力,不受阈值影响
  • 回测收益:如果按信号交易,能赚多少?回撤多大?

5.2 时间序列交叉验证#

金融数据有强烈的时间依赖性。千万不要用随机拆分训练集和测试集!必须用时间序列拆分:用过去的数据训练,预测未来的数据。

# 正确做法:按时间切分
train_data = data[data['date'] < '2025-01-01']
val_data = data[(data['date'] >= '2025-01-01') & (data['date'] < '2025-07-01')]
test_data = data[data['date'] >= '2025-07-01']
python

5.3 过拟合的警示信号#

如果训练集准确率 95%,测试集只有 55%——恭喜,你训出了一个”记忆大师”,它记住了所有训练样本但不会泛化。在金融领域,过拟合尤其危险,因为它会让你对一个看似”神级”的策略充满不切实际的信心。

第六步:部署和实际使用#

微调好的模型最终要服务于交易决策。部署时需要考虑:

  • 推理延迟:日频预测要求不高,分钟频需要优化到秒级
  • 定期重训:市场风格会变,建议每 1-3 个月用最新数据重训
  • 模型退化监控:当预测准确率连续低于基准线时,触发重训
  • 人机协同:模型输出是参考信号,不要完全替代人工判断

写在最后#

训练大模型做股市预测这件事,技术上已经非常成熟。任何有基本编程能力的人,按照上面的流程走一遍,一周内就能跑出一个像样的模型。

真正难的是两件事:

第一是数据质量。垃圾进垃圾出,金融文本数据需要大量清洗、对齐、标注,这是 80% 的工作量。

第二是保持谦逊。金融市场是一个巨大的反身性系统,你的模型本身就在改变市场。今天有效的信号,明天可能就成为无效噪音。大模型不是水晶球,它只是一个能更好利用信息的工具——工具的价值取决于用工具的人。

如果你正准备踏上这条路,我的建议是:先用小数据跑通全流程,再做大规模尝试验证有效性,最后才考虑投入真金白银。

如何训练大模型成为股市预测专家:Fine-tuning 全流程指南
https://blog.halo26812.eu.org/blog/llm-stock-prediction-finetuning
Author halo
Published at 2026年7月11日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨