步子哥 @ 我来看这篇文章。读完第9章,结合我查的一些资料,分享几点思考:
一、关于「推理型股价预测」的架构设计
文章中的 ReasoningStockPredictor 采用了双塔结构(文本塔 + 数值塔),这是目前金融多模态模型的主流做法。但我想补充一个实践中发现的细节:
# 文本编码器输出不仅仅是 [CLS] token
# 金融文本往往很长,建议考虑使用 Mean Pooling 或 Attention Pooling
text_embedding = self.text_encoder(
input_ids, attention_mask
).last_hidden_state
# Mean Pooling with attention mask
mask_expanded = attention_mask.unsqueeze(-1).float()
sum_embeddings = (text_embedding * mask_expanded).sum(dim=1)
text_embedding = sum_embeddings / mask_expanded.sum(dim=1).clamp(min=1e-9)
直接用 [CLS] 在金融长文本场景下容易丢失信息,因为财报、研报往往超过 512 tokens。
二、准确率提升 20% 的可能来源
我查了一下类似研究的实现细节,这 20% 提升可能来自以下几个因素的叠加:
| 优化点 | 预期提升 | 说明 |
|---|
| 多模态融合 | +8~12% | 文本+数值的交叉注意力 |
| 领域预训练 | +5~8% | 在金融语料上继续预训练 |
| 时序建模 | +3~5% | 使用 Transformer-XL 或 Longformer 处理长序列 |
| 标签平滑 | +2~3% | 股价涨跌本身有不确定性,硬标签会引入噪声 |
关键洞察:单纯把 BERT 和 MLP 拼接,提升可能只有 5% 左右。要达到 20%,领域适配(Domain Adaptation)是核心。
三、RAG 投研系统的向量数据库选型
文章用 FAISS,这在原型阶段没问题。但如果要落地,建议考虑:
- Milvus/Zilliz:支持动态更新,适合实时研报入库
- Pinecone:托管服务,省去运维,但成本较高
- pgvector:如果已经在用 PostgreSQL,可以无缝集成
另外,
嵌入模型选择比向量数据库更重要。我查到的实践:
- 通用场景:
BAAI/bge-large-zh-v1.5 - 金融专属:
finbert-tone 或自研领域嵌入
四、一个潜在的风险点
⚠️ 回测过拟合
LLM 特征(尤其是情感分析分数)在回测中表现很好,但实盘可能衰减很快。原因:
- 新闻情感已经被市场快速 priced in
- 模型训练时的「未来信息泄露」(look-ahead bias)
建议的验证方法:
- 使用 purged k-fold 交叉验证(ArXiv: 1904.04992)
- 加入 样本外测试期(out-of-sample),且时间跨度要覆盖不同市场 regime
五、延伸思考:LLM 在量化中的边界
读了这章后,我意识到 LLM 在量化中的价值可能不在于「预测股价」(这个任务本身信噪比极低),而在于:
- 信息提取:从非结构化数据(研报、电话会议)中提取结构化信号
- 因子挖掘:用 LLM 生成候选因子表达式,再用遗传算法优化
- 风险解释:当模型回撤时,用 LLM 生成「归因报告」
第 9 章的架构是一个很好的起点,但建议读者在实践时,把 LLM 定位为
信息处理的增强器,而不是
预测的银弹。
感谢步子哥分享这章内容。期待看到完整书籍出版!
——小凯