Skill v1.0.0
currentAutomated scan100/100version: "1.0.0" name: next-day-prediction description: 当用户想知道明天或近期行情方向、涨跌概率、模型对个股/大盘的看法时使用(例如"明天大概怎么走""次日预测""模型怎么看""给个方向")。先校验 ML 模型是否在有效期内,再输出次日收益预测分与模型近期 IC 作为可靠性参考。
次日预测
何时使用
命中以下任意一种说法,就走这个技能:
- "明天大概怎么走?"
- "次日预测一下"
- "模型怎么看?"
- "给个方向,别废话"
- "这几只票明天谁更可能涨?"
- "今天的模型分数出了吗 / 新鲜不新鲜?"
不适用:用户问的是长期逻辑、产业链、估值(那走研究员/知识图谱技能);用户要是问"该不该买",只给统计结果,不给买卖建议(见合规边界)。
轻问 vs 深问(成本控制)
| 模式 | 用户意图 | 工具调用 | 耗时 | |
|---|---|---|---|---|
| 轻问 | 只想快速要个方向 | factor-miner-ml_metrics + 一次 factor-miner-ml_predict | 秒级~十几秒 | |
| 深问 | 要多标的横向比较 + 可靠性说明 + 报告 | metrics + 多次 predict(或一次批量 predict)+ 可选 kronos-forecast_signal 交叉验证 | 每次 predict 都要算因子,标的越多越慢 |
哪一步最贵:factor-miner-ml_predict 最贵——它要为每只标的取因子快照,Redis 里没有快照时会现场重算 Alpha158 因子(IO + 计算密集)。ml_metrics 只读模型状态,几乎免费,但每次预测前都必须先调它,用极小成本换掉"拿过期模型忽悠用户"的风险。
批量场景(>5 只标的):不要串行一只一只打,优先把多只标的的 klines 一次性塞进 klines_list 数组一次调用。若换成 K 线大模型预测这类重任务,先提交拿 job_id,再用 job_status 轮询,不要傻等。
工具链
第 0 步:确认模型是否新鲜(强制,不可跳过)
调 factor-miner-ml_metrics(),不传参数。从返回里看:
- 最后一次训练日期(last training date)
- 该模型的 IC / rank_ic / sharpe 等当日指标
- 模型文件是否存在
model_type是 lgbm 还是 master
判断规则(必须明说,不能含糊):
- 最后训练日 == 最近一个交易日 → 模型新鲜,预测可用。
- 最后训练日晚于今日 1~2 个交易日 → 可用但标注"模型是 N 天前训练的"。
- 最后训练日距今明显滞后(超过约 3 个交易日,或明显跨周跨假期)→ 判定模型过期,必须明确告诉用户"当前模型预测不可用/可靠性不足",不要拿旧分数当方向依据。
- 模型文件不存在或 metrics 为空 → 直接说没训练过,请用户先跑训练,不要编预测。
第 1 步:拿 K 线数据
factor-miner-ml_predict 需要 klines_list,格式:
klines_list = [ { "symbol": "sh600519", "klines": [ {date, open, high, low, close, volume}, ... ] } ]
数据来源二选一,先问清楚再动手:
- 用户自己提供 K 线文件/数据(最常见)——让用户给股票代码列表和 K 线,至少覆盖因子回看需要的长度(Alpha158 系的均线类因子要求 ≥ 62 根,建议给 120 根以上更稳)。
- 用户没数据时,说明可以从工程端的数据集取(日频 K 线数据集/Redis 因子快照),或让用户先跑
factor-miner-update_data更新行情再预测。不要凭空捏造 K 线。
第 2 步:出预测分
调 factor-miner-ml_predict(klines_list=<上一步数据>, model="lgbm")。
model="lgbm"是默认后端,走 Redis 因子快照,没有快照时回退现场算因子。- 只有当用户明确要 MASTER 深度模型、且确实有足够长的特征序列时,才用
model="master"(需先跑过 master 训练,对序列长度有要求);普通次日预测不要默认切它。 - 返回是预测分字典
{symbol: score}。分数高低是相对排序,不是百分比收益。
第 3 步(可选):交叉验证
用户要"更稳一点",或分数与直觉/新闻严重冲突时,可对同一标的额外跑 kronos-forecast_signal(传 klines + pred_len),用它的 direction / expected_return_pct / confidence 做交叉参考。注意它慢 N 倍(N=采样次数),只在少数标的上用。
第 4 步(可选):重任务轮询
若用户要求跑训练/批量回测:先提交拿 job_id,再用 job_status(job_id) 轮询,返回 running 就继续轮询,done 再读结果,error 就读 error 字段。不要原地等待、不要反复重投。
记忆回路(前查后记)
| 时机 | 动作 | 工具 | |
|---|---|---|---|
| 执行前 | 查同一 model_type(lgbm/master)在同一股票池、相近 IC 区间下历史的"模型预测方向 / 排序"实际兑现情况——即这套模型的历史预测准确率 | causal-memory-search_causal(query=次日预测 模型 准确率,task_tag=next-day-prediction) | |
| 执行后 | 记下本次预测:模型类型与训练日、股票池、预测分排序、当时 IC/rank_ic,以及是否因过期降级 | causal-memory-record_decision(decision=<本次模型类型 + 预测分排序结论>,outcome="待验证",context=<model_type/训练日/IC/股票池/根数>) | |
| 复检时 | 下一交易日收盘后拿到实际涨跌,用同一条 decision 回填真实兑现情况,判断当日模型预测准确率 | causal-memory-record_decision(同一条 decision,outcome=实际涨跌与预测排序的吻合度) |
本技能的历史参照维度是模型历史预测准确率:不是"用户持仓赚没赚",而是"这个模型在相似状态下给出的次日排序,历史上有多少次真的对上了"。这个记忆对用户的价值在于——IC 只告诉你模型训练时有多好,而记忆记录的是它上线后真实兑现了多少次;当同一模型类型、相近 IC 区间的历史命中率长期偏低时,即便模型"新鲜",也应把可靠性参考下调并明说,避免用户把过期或漂移的信号当成方向依据。
输出格式
Agent 的输出契约,按此顺序:
- 模型状态(必出,一行结论)
- 最后训练日、是否在有效期、model_type
- 过期就写:"⚠️ 模型最后训练日为 X,已过期,本次预测仅供参考/不可用"
- 预测结果表(按分数降序)
- 列:股票代码 | 次日预测分 | 模型近期 IC(rank_ic)| 备注
- 可靠性参考(必出)
- 引用第 0 步读到的 IC / rank_ic / sharpe;IC 低(例如 |IC| < 0.03)要明说"信号偏弱,区分度有限"
- 方向解读
- 只做相对排序描述:谁的分更高、分差是否明显、高分组 vs 低分组
- 不给目标价、不给买卖点位
- 数据与口径说明
- K 线来源、根数、预测时间点;是否用了 master/Kronos
- 固定句:"以上为模型输出,非承诺;不构成投资建议。"
轻问可压缩成 3~5 行(模型状态 + 分数排序 + 可靠性 + 免责);深问补齐表格与逐条备注。
历史参照(必填小节):若检索到同类历史,写明「类似情境 N 次,其中 X 次 <本技能的判断维度> 正确」;无历史则写「首次记录此类情境,本次判断已存入记忆供将来对照」。
合规边界
- 只输出统计计算结果:预测分、排序、IC/rank_ic/sharpe 等模型指标。
- 不输出买入/卖出/加仓/减仓建议,不输出目标价、止盈止损价位、仓位建议、收益承诺或"必涨/稳赚"这类表述。
- 不把模型分数翻译成"能涨 X%";预测分是横截面相对排序,不是收益预期。
- 涉及任何预测模型(LGBM / MASTER / Kronos),必须声明"模型输出,非承诺"。
- 模型数据不足或已过期时,宁可说"不可用",也不要给方向。
- 用户问到具体交易决策时,只提供计算依据,决策由用户自己做。
常见问题
- K 线太短导致预测失败或失真:Alpha158 因子里有 ma_60 这类长周期项,历史不足 62 根会大量 NaN。至少给 62 根,实用建议 120 根以上;不够就明确让用户补数据,不要自动缩窗口硬跑。
- 分数没有绝对值意义:预测分高低只说明"同期这批标的里模型更看好谁"。跨批次、跨日期、不同股票池之间的分数不可直接比较,报告里最好固定同一批标的出分。
- Redis 没快照会变慢:
ml_predict优先读 Redis 的因子快照,缺失时现场重算,会明显变慢甚至超时。标的数量多时先说明预计耗时,或改用批量一次提交;也可先跑每日因子计算任务把快照刷出来。 - 节假日/停牌:最近交易日不等于自然日,判断模型是否过期时按交易日算,别用自然日差几天就误判过期。