ensemble-cf-v2
把一份家庭画像和一段月末市场摘要,答成三道投资决策题的 Laya checkpoint。编码器是 jhu-clsp/mmBERT-base(MIT,约 322M)的全量微调,上面是 Laya 0.4.2 的决策头。权重是 fp16。
这不是生成模型,也不能用 AutoModel.from_pretrained 推理。加载入口是 laya.agent.Agent。
用法
import json
from huggingface_hub import hf_hub_download
from laya.agent import Agent
agent = Agent("ShuKe777/ensemble-cf-v2", device="cuda:0")
questions = json.loads(
open(hf_hub_download("ShuKe777/ensemble-cf-v2", "questions.json"), encoding="utf-8").read()
)
# state:英文 persona,空一行,再接该月末的宏观和 20 个行业摘要。题目与训练时相同。
out = agent.system_one(state, questions)
answers = out["answers"]
p_hold = answers["holds_equity"]["noul"] # P(未来两个月持有股票或权益基金)
share_probs = answers["equity_amount"]["probabilities"] # 5 档,键是 "0".."4"
sector_probs = answers["sector"]["probabilities"] # 20 个行业名 -> 概率,直接当作配置权重
很多人时用 predict_batch,同一组 questions 打在一个 batch 上。max_len 是 1024,head_max_len 是 256。v2 精简 persona 在这个长度里不截断。
三道题合成一个人的目标持仓时,项目里的折算是:
| 题 | 类型 | 怎么读 |
|---|---|---|
holds_equity |
noul | noul 就是 P(持有) |
equity_amount |
score | 条件于持有时,金融资产里的权益比例。五档中点是 2.5%、7.5%、15%、30%、50% |
sector |
choice | 20 个行业概率,当作配置权重,不再取 top-1 |
期望权益金额是 资产 × P(持有) × E[比例|持有],再乘行业权重。资产档代表值是 0.5 万、3 万、12.5 万、35 万、100 万元。
输入
state 是两段英文文本拼起来的:
- 精简 persona。来自中国家庭微观数据编成的画像,去掉分项消费、保留总支出。默认不附加「这个人的工作在某某行业」,那句提示会把本行业偏好放大到字面匹配。
- 决策月末的市场摘要:GDP、CPI、PPI、PMI、社零、失业率、M2、贷款利率、国债收益率,以及大盘和 20 个行业的价格、利润变化。
20 个行业由申万一级合并而来,选项顺序就是 questions.json 里的顺序:农业、食品饮料、煤炭石油、钢铁有色、化工、建筑建材、房地产、机械、电力设备与新能源、国防、汽车、电子、计算机与通信、传媒、医药、银行、非银金融、家电纺服、零售服务、公用交通。
训练
起点是 Laya multilingual(同一份 mmBERT-base)。scripts/finetune_laya.py 调用 laya.train.finetune,损失是软交叉熵 soft-ce,不是默认的 rlcd。编码器不冻结。每个 epoch 打乱 choice 题的选项顺序,避免学到位置先验。
| 优化步 | 有效 batch 64(micro-batch 8 × grad accum 8),4 个 epoch,单卡 |
| 学习率 | 编码器 2.5e-5,决策头 1e-4,权重衰减 0.01,梯度裁剪 1.0 |
| 训练题项 | 31700。同一条输入有多家标注时,分布取平均 |
| 标注 | DeepSeek-Flash;重叠部分再并入 GLM-5.3 和 Kimi-K3 |
| 情境 | 2024-09 到 2026-09 里抽的真实月份,加上一半反事实月份。反事实保留该月宏观,打乱大盘涨跌和行业利润 |
| 留出 | 2026-01 到 2026-05 的文本不进训练。评估用另外 1000 人,不与训练 persona 重叠 |
| 校准 | 400 条上按题型拟合温度。三道题的温度是 1.017、1.006、1.007 |
四个 epoch 的训练损失是 1.400、1.367、1.363、1.360。
留出评估
下面是 checkpoint 自带的评估:6000 个题项(1000 人 × 2 期 × 3 题),对照 DeepSeek 软标签的 top-1。微调前是同一个 multilingual 起点。
| 微调前 | 微调后 | |
|---|---|---|
| 全部题项,top-1 | 10.3% | 85.0% |
| 损失 | 3.432 | 1.352 |
holds_equity(2 类) |
17.0% | 99.5% |
equity_amount(5 档) |
6.3% | 88.7% |
sector(20 类) |
7.7% | 66.7% |
sector 的 top-1 只有 66.7%,因为要在 20 个行业里对上众数。仿真用的是整份概率,不是这一个类别。
同一批 1000 人、对照 DeepSeek 标签的行为指标(项目报告里的 v2):
| DeepSeek 标签 | 本 checkpoint | |
|---|---|---|
| P(持有) 区分自述有无投资的 AUC | 0.987 | 0.994 |
| 平均 P(持有),季前 / 季后 | 0.096 / 0.097 | 0.093 / 0.097 |
| 逐人 P(持有) 相关 | — | 0.99 |
| 逐人持股比例相关 | — | 0.96 |
| 逐人行业配置余弦,中位数 | — | 0.96 |
| 季前到季后配置变化的相关 | — | 0.96 |
300 个没见过的反事实市场上,逐人行业配置余弦也是 0.96。
限度
标签是大模型对同一段文字的分布,不是券商账户或调查里的真实下单。教师模型有一个共同偏差:除个别模型外,它们认为资产越多、条件持股比例越低,这和「越富裕的家庭股票占比越高」的问卷结果相反。
历史回放里,由这些决策汇总出的行业资金流对下月超额收益没有稳定的预测力。这个 checkpoint 用来做家庭配置的机制仿真,不构成交易信号。
文件
推理要读的是 model.safetensors、rl_agent_config.json、tokenizer/、encoder/config.json。questions.json 是上面三道题的定义,Agent 不会自动读它。
Model tree for ShuKe777/ensemble-cf-v2
Base model
jhu-clsp/mmBERT-base