承接上一篇,本文聚焦「预测管线、市场报告、自动化闭环」三个运行时环节,以及贯穿其中的真实踩坑案例。
一、预测管线
1.1 标准入口:predict_real.py
每日收盘后运行,输出 output/picks.json:
- 全市场 4,963 只股票未来 5 日收益率预测
- Top30 推荐买入 + Bottom30 建议回避
- 主板过滤:剔除 sh688(科创板)/ sz300/301(创业板)+ 全部 ST/*ST
- NaN 清洗 + 内存优化(del rows / drop dates)
- 名称补全(name_lookup 字典 + 扩展名)
1.2 子进程 worker 隔离
预测计算放独立子进程(_pred_worker.py)——1.8G 内存机器上模型计算可能 OOM,子进程被杀不拖垮报告生成,自动回退 picks.json 快照。
1 | _cp = subprocess.run([sys.executable, _w], capture_output=True, timeout=900) |
二、市场报告生成
2.1 演进
- v1:纯文本报告,信息密度低
- v2:全部数据改用表格展示,可读性大增
- v3(当前):接入真实模型预测,动态读模型注册表(IC 硬编码 → 注册表实际值)
2.2 结构(11 个一级章节)
- 市场总览:涨跌家数、领涨/领跌 Top8、板块轮动表、成交额集中度、波动率
- 新闻情绪分析:近 20 日情感均值/趋势/波动
- 模型预测分析:看多/看空占比 + Top40 推荐 + Bottom40 回避
- 权重股 Top20:成交额/20日涨跌/趋势
- 宏观因子分析:汇率/利率/组合判断
- 期货市场:33 品种 5 日涨跌表
- 风险监测:6 维度风险表 + 综合评分
- 技术指标汇总:5 大指数 MA/RSI/乖离率
- 模型诊断:训练样本/IC/RankIC/关键特征
- 策略建议:短期/中长期/风险控制
- 附录:数据来源 + 免责声明
2.3 2026-08 瘦身优化
用户:「收盘报告字数少一点,2000字左右就行,其他你再检查一下」
实施:
- 识别「空话段落」模式:每节 3-6 段「从…角度来看」的模板套话(共 38 处)
- 保留全部数据表和硬指标行,删除填充段落
- 二次精简:删新闻背景段、版本历史表、风险重复段
- 结果:10,000 → 1,866 汉字,11 节结构完整,输出 token 直降 5 倍
后续检查发现的问题(「其他你再检查一下」的兑现):
- 报告头部「64→39特征/IC=0.329」与 registry(64→40/0.3288)口径不一致
- 模型诊断节「8.5 分钟/15:05 调度」静态文本过期(实际 19:00 调度)
- 附录「5102 只/2024-01至2026-07」过期
- 这些「静态旧债」被每日反思 cron 持续追踪
三、自动化闭环
3.1 每日交易后链路(工作日)
1 | 18:30 收盘数据采集(AKShare 全市场,~5500只) |
训练 cron 的前置步骤(踩坑后加上的):
pattern_pcs_update.py补全走势 PC 特征(曾因预测期 9 个 PATTERN_PC 全 0 缺口)fix_news_v2.py重建新闻情感特征(news_features 是模型特征之一,无 cron 会停更)
3.2 训练产出核验(重要)
训练 cron 要求核对产出物,不能只看退出码:
ls models_custom/ | tail -5确认存在当日 v3_*.pkl- 检查 registry deployed 是否更新(若仍指向旧 pkl,训练实际未交付)
- 比对 pattern_pcs.json / news_features 的 MAX(date) 与最新交易日一致
- 训练用后台任务时必须
process(action='wait')同步等待——禁止仅后台启动不等待
静默丢失教训:08-20/21 训练「静默丢失」——后台任务随 cron 会话终止、会话空转零执行,无任何告警。这就是「仅后台不等待」的代价。
3.3 模型门控实录(2026-08-28 实例)
1 | 模型: v3_20260828_1931.pkl (19:31 生成) |
连续 5 个交易日新模型均未超线,Valid IC 从 0.3299 缓降到 0.3243——BEST_VALID_IC=0.327 硬编码近两周未被超越,可能是阶段性高点。这是每日反思 cron 追踪的长期议题。
四、配套 skill:akshare-cn-market
触发规则:用户提到股票、股价、行情、A股、财报、年报、季报、基本面、技术面、估值、GDP、CPI、PMI、M2、国债收益率、宏观经济、金融数据时,必须先加载本 skill,不要先用 web_search 或 browser。
能力覆盖:
- 个股历史 K 线(默认最近 10 条日线,前复权)
- 大盘指数(8 个核心指数 1 年历史)
- 财务摘要、GDP/CPI/PMI/M2 货币供应
- 中美 10 年期国债收益率
合并历史:合并了 china-financial-data、finance-report-analyzer、financial-report-analysis、financial-fraud-index、akshare-financial-data 共 5 个旧 skill(2026-06-28)。
实战案例:查上证指数收盘——AKShare 快照为主 + 新浪/东财接口兜底,一次拿到完整盘面(点位/涨跌/成交额/涨跌家数),还识别出「午盘休市,最新快照停在 11:54」的边界情况。
五、验证方法论
5.1 前向验证
verify_picks_forward:追踪推荐股票后续表现backtest_forward:历史回测,验证因子有效性
5.2 Ad-hoc 验证模式(+inf% 修复实例)
项目无 canonical 测试套件,采用「ad-hoc 验证」模式。2026-08-28 +inf% 修复验证 11/11 断言 PASS:
| 场景 | 结果 |
|---|---|
| 4 只停牌复牌股基准价=0 → None | ✅ 全部排除 |
| 正常股 sh600519 → 有限数值(-3.94%) | ✅ 不受影响 |
| 序列 <21 个(新股)→ None | ✅ |
| NaN / inf 基准 → None | ✅ |
| 构造 100→110 序列,pct20=10.0 精确 | ✅ |
| 全量跑 market_report.py,输出 0 处 inf | ✅ |
验证方法要点:
- AST 抽取:从源文件编译真实 pct20 定义执行(不复制逻辑,防止「验证的是另一份代码」)
- 自验证:验证脚本自身也要被验证(算术正确性测试,防「验证通过但验证本身错了」)
- tempfile 安全路径:临时文件用 tempfile.mkstemp 生成,跑完清理
六、报告推送与归档
- 报告推送到飞书当前对话(飞书支持 Markdown 渲染,表格正常显示)
- 归档:
output/archive/report_YYYYMMDD.md - 不再更新任何网页(历史遗留的网站生成已废弃)
七、总结
量化闭环的核心不是模型有多强,而是数据完整性 + 交付可验证 + 失败不静默:
- 数据:每个特征源都要核对到最新交易日(含期货——曾被漏掉一个月)
- 交付:pkl 文件才是证据,registry 只是门控
- 失败:任务跑完要验证产出物,后台任务要 wait,绝不假装成功