量化投资系统(二)——预测、报告与自动化闭环

  • ~3.87K 字
  1. 1. 一、预测管线
    1. 1.1. 1.1 标准入口:predict_real.py
    2. 1.2. 1.2 子进程 worker 隔离
  2. 2. 二、市场报告生成
    1. 2.1. 2.1 演进
    2. 2.2. 2.2 结构(11 个一级章节)
    3. 2.3. 2.3 2026-08 瘦身优化
  3. 3. 三、自动化闭环
    1. 3.1. 3.1 每日交易后链路(工作日)
    2. 3.2. 3.2 训练产出核验(重要)
    3. 3.3. 3.3 模型门控实录(2026-08-28 实例)
  4. 4. 四、配套 skill:akshare-cn-market
  5. 5. 五、验证方法论
    1. 5.1. 5.1 前向验证
    2. 5.2. 5.2 Ad-hoc 验证模式(+inf% 修复实例)
  6. 6. 六、报告推送与归档
  7. 7. 七、总结

承接上一篇,本文聚焦「预测管线、市场报告、自动化闭环」三个运行时环节,以及贯穿其中的真实踩坑案例。

一、预测管线

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
2
3
4
5
_cp = subprocess.run([sys.executable, _w], capture_output=True, timeout=900)
if _cp.returncode != 0:
raise RuntimeError(f"worker exit={_cp.returncode}") # 失败要报告,绝不假装成功
_pj = json.loads(_cp.stdout.decode())
preds = np.array([_pmap.get(s, 0.0) for s in syms])

二、市场报告生成

2.1 演进

  • v1:纯文本报告,信息密度低
  • v2:全部数据改用表格展示,可读性大增
  • v3(当前):接入真实模型预测,动态读模型注册表(IC 硬编码 → 注册表实际值)

2.2 结构(11 个一级章节)

  1. 市场总览:涨跌家数、领涨/领跌 Top8、板块轮动表、成交额集中度、波动率
  2. 新闻情绪分析:近 20 日情感均值/趋势/波动
  3. 模型预测分析:看多/看空占比 + Top40 推荐 + Bottom40 回避
  4. 权重股 Top20:成交额/20日涨跌/趋势
  5. 宏观因子分析:汇率/利率/组合判断
  6. 期货市场:33 品种 5 日涨跌表
  7. 风险监测:6 维度风险表 + 综合评分
  8. 技术指标汇总:5 大指数 MA/RSI/乖离率
  9. 模型诊断:训练样本/IC/RankIC/关键特征
  10. 策略建议:短期/中长期/风险控制
  11. 附录:数据来源 + 免责声明

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
2
3
18:30  收盘数据采集(AKShare 全市场,~5500只)
19:00 v3 模型训练(前置:走势PC补全 + 新闻情感重建)
19:45 大盘报告生成(飞书推送 + 归档 output/archive/)

训练 cron 的前置步骤(踩坑后加上的):

  1. pattern_pcs_update.py 补全走势 PC 特征(曾因预测期 9 个 PATTERN_PC 全 0 缺口)
  2. 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
2
3
4
5
6
7
8
模型: v3_20260828_1931.pkl (19:31 生成)
样本: 127,993 (股票 5195 + 期货 33)
Train IC: 0.4625 | Valid IC: 0.3243 | Rank IC: 0.3474 | IR: 1.936
因子筛选: 64 → 51 → 40 (IC>0.005 → 去相关≤0.85)
耗时: 1214s (~20.2min)

线上: v3_20260819_1533 (IC 0.3288 / RIC 0.3504 / IR 2.009)
差距: -0.0045 → 低于 0.327 替换阈值 → registry 未更新 = 预期行为

连续 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,绝不假装成功
赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!