从零搭建 A 股收盘分析:每天 20:00 自动生成的市场复盘

这篇是我那组日报系列里最特别的一篇。它不需要任何第三方 skill。

日报搭建系列四篇:① AI 日报② 华尔街日报③ Crypto 日报④ A 股收盘分析(本文,系列终篇)

AI 日报依赖 ai-news-aggregator 的 100+ RSS 源,华尔街日报靠 Sina JS API 拉美股指数,Crypto 日报走 CoinGecko 的价格接口。A 股收盘分析几乎什么都不装——只用 Hermes 内置的 web_searchweb_extract,加上一个大模型,就够了。

原因很简单:A 股的收盘数据全网都是文本形式散落在各家财经网站,不需要什么专门的 API 去"拉"。你搜"上证指数 YYYY-MM-DD 收盘",返回的结果就是一个文本里的数字。大模型可以直接从文本里提取。


一、为什么零 skill

我对 chinastock 做了 cron 优化时砍掉了一个叫 cn-web-search 的 skill,它是中文搜索聚合器。去掉它之后,cron 的 prompt token 数量从约 7000 降到约 1500——模型的内容审核拦截概率大幅降低。而且 web_search 本身已经能完成同一件事:搜中文财经网站、拿实际收盘指数、找资金动向和板块轮动。

所以这篇指南里,你不会看到任何 skillhub install 或第三方 API key 的步骤。整个系统纯靠内置工具跑。


二、数据流

1. 确认交易日  非交易日直接 SILENT 终止
2. web_search "A股收盘 上证 深证 创业板 科创50 {日期}"
    提取四大指数实际收盘点位涨跌幅成交额涨跌家数
3. web_search "A股 收盘 综述 板块 涨跌" + "A股 北向资金 {日期}"
    板块轮动方向资金动向北向流出/流入板块涨幅榜跌幅榜
4. web_extract  2-3 篇当日收盘分析券商研报/财经网站综述
    提取市场驱动因素政策外围行业情绪资金技术面 6 维度
5. LLM (deepseek-v4-pro)  生成三段式收盘分析
6. 写入 JSON + 推微信

整个流程是串行的。每一步依赖上一步的结果——知道了指数点位才知道今天"偏多还是偏空",搜板块涨跌和资金动向就有方向。


三、三段式输出结构

收盘分析的输出格式是所有日报里最规整的:

📈 指数表现
  - 上证综指:xxxx.xx 点,涨/跌 xx.xx (+x.xx%)
  - 深证成指:xxxx.xx 点,涨/跌 xx.xx (+x.xx%)
  - 创业板指:xxxx.xx 点,涨/跌 xx.xx (+x.xx%)
  - 科创50:xxxx.xx 点,涨/跌 xx.xx (+x.xx%)
  - 两市成交额:xxxx 亿 | 涨跌家数:xxxx / xxxx

💰 市场概况(~500 字)
  今日市场特征、板块轮动方向、资金流向特征

🔥 驱动因素(6 个维度,各 ~150 字)
  - 政策面:当日/近期政策信号
  - 外围市场:隔夜美股/港股联动
  - 行业催化:重点板块的催化事件
  - 市场情绪:成交量/涨跌比/北向资金信号
  - 资金面:北向资金、主力资金流向
  - 技术面:关键点位/均线/量价关系

三段式之所以选择 6 维度而不是更少,是因为实测发现:少于 4 个维度时 LLM 会把很多不同的因素强行塞进同一个维度里,导致分析混乱。6 个维度各管 150 字刚好是一个"说清楚重点但别啰嗦"的长度。


四、数据约束:为什么不能用 fund-tracker

这个页面的数据来源有一个硬约束:必须用 web_search 抓取实际收盘数据,不准用 fund-tracker 盘中快照。

原因我之前专门写过一篇踩坑复盘。简单说:fund-tracker 是盘中每 10 分钟采一次的估算值,有两个问题: - 它和实际收盘净值之间有误差(尤其 QDII 基金,误差更大) - 它没有涨跌家数、北向资金、板块涨跌榜这些对分析至关重要的数据

所以 cron 的 prompt 里第一句就写死了:

⚠️ 不得使用 fund-tracker 盘中快照数据。
所有指数必须是当日实际收盘值,必须来自 web_search 的结果。

这也是为什么上面那段数据流里,第二步和第三步走的是 web_search 而不是任何内部 data pipeline。


五、前端渲染:日期导航 + 数据面板

chinastock 页面的入口在 /chinastock/,默认跳最近一个交易日的收盘分析。URL 格式是 /chinastock/<YYYY-MM-DD>,支持历史回溯。

数据源是 ~/.hermes/fund-tracker/daily-analysis.json。这个 JSON 文件由 cron 生成后直接写盘,Flask 不做任何后端计算——就是读文件 → 丢给模板。模板里做三段式的分区渲染:指数表(📈 块)、市场概况(💰 块)、驱动因素(🔥 块,六格网格)。

日期导航条自动从 daily-analysis.json 的日期记录里生成,只显示有数据的交易日。


六、cron 调度

A 股交易日除周末和法定假日外基本固定。调度是每天 20:00:

cronjob(action='create',
    name='A股收盘分析',
    schedule='0 20 * * *',
    model={'provider':'custom:api.deepseek.com','model':'deepseek-v4-pro'},
    skills=[],  # 零 skill——纯 web_search + web_extract
    prompt='你是 Zimi,负责生成每日 A 股收盘分析...')

同样的 model pinning 策略:生产任务固定 deepseek-v4-pro,不受用户随时换模型的影响。

非交易日 crontab 在第一步就会退出(TZ='Asia/Shanghai' date +%A → 判断是否为周末 → [SILENT] 终止),不写文件、不推消息。


七、四篇日报系列合起来看

现在回过头来看这四篇(AI / 华尔街 / Crypto / A 股),它们共享同一副骨架:

采集策略 Skill 依赖 输出驱动 独特挑战
AI 日报 三路并行 3 个外部 skill JSON → Flask 多源去重 / 周末稀疏
华尔街日报 串行 Sina API + MoltStreet JSON → 卡片 假日判断 / 美股时区
Crypto 日报 串行 CoinGecko + 情绪指标 HTML 直出 噪音过滤
A 股收盘 串行 (纯 web_search) JSON → Flask 严禁用盘中快照

换了数据源、换了输出格式、换了调度时间,但骨架一样。这意味着:你知道怎么搭其中一个,就基本知道了怎么搭一套自己的日报系统——无论你要跟踪的是 AI 论文、基金净值、新产品发布、还是你觉得重要但不想每天手动刷的任何一个信息主题。


这四篇写完,venxine.vip 每天 06:00~20:00 自动推送到微信的所有日报就算把搭建思路交代清楚了。如果有一天你不想推 AI 新闻了,改成推行业报告或者论文摘要,骨架全保留,只换前面的采集源和最后的输出模板。这是这套架构最值钱的地方。