从零搭建华尔街日报:每天 06:00 自动生成的隔夜美股分析

A股投资者最难受的时间点是每天早上醒来那一刻。美股的收盘在凌晨,想知道昨晚纳斯达克涨了还是跌了、自己那几只 QDII 基金净值会怎么变,要么半夜盯盘,要么第二天到处翻数据。我给自己搭了一套全自动方案:每天 06:00 准时推到微信上,一条消息告诉你昨晚美股发生了什么。

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

这篇文章教你怎么搭。和日报那篇一样,所有命令和 API 都在 Hermes Agent 里跑,不写一行爬虫代码。


一、数据流:四条通路,一条总结

先画一下这个页面的数据是怎么来的:

新浪 JS API(指数/个股实时价)
     curl hq.sinajs.cn/list  解析中文逗号分隔的原始报文
       ├─ 三大指数:道指(.DJI) / 纳指(.IXIC) / 标普(.INX)
       ├─ 半导体:费城 SOX(.SOX)
       └─ 七巨头:NVDA/AAPL/MSFT/GOOGL/META/MSFT/TSLA

MoltStreet AI 分析师共识
     web_search"moltstreet signal NVDA"  AI 买卖信号

QDII 净值预估
     fund-portfolio-management skill  T+1 净值偏移估算

        以上三条并行采集,同一条 cron 内串联

一条 LLM (deepseek-v4-pro)  生成三段式:指数表 + 市场分析 + 驱动因素

        写入 JSON_indices.json + _analysis.json

Flask (wallstreet_daily.html)  前端渲染卡片

核心设计:指数必须用 Sina API 实价,不允许用 fund-tracker 盘中快照(那个是 10 分钟延迟的估值,和收盘价对不上)。这在一开始的 prompt 里就写成了硬约束。


二、核心数据源:Sina JS API

Sina 的 hq.sinajs.cn 是 A 股投资者最熟悉的免费行情接口,它用一个看起来像上古时代的格式返回数据:

curl -s -H "Referer: https://finance.sina.com.cn/" \
  "https://hq.sinajs.cn/list=gb_dji,gb_ixic,gb_inx,gb_sox,gb_nvda,gb_aapl"

返回是逗号分隔的中文数据行。解析后能得到当前价、涨跌额、涨跌%、最高最低、开盘、昨收。

这个接口有几个要注意的点:

  • 必须带 Referer: https://finance.sina.com.cn/,否则会被拒
  • gb_ 前缀代表美股(Global Business),dji=道琼斯、ixic=纳斯达克、inx=标普 500、sox=费城半导体
  • 返回的是实时价,但 cron 在 06:00 触发时要取的是前一个交易日的收盘价——这个靠 cron 的 prompt 里做日期推断(跨周末回退到周五)
  • 代码里用的是带有超时防护的 curl
curl -s --max-time 10 -H "Referer: https://finance.sina.com.cn/" \
  "https://hq.sinajs.cn/list=gb_dji,gb_ixic,gb_inx,gb_sox,gb_nvda,gb_aapl,gb_msft,gb_avgo"

--max-time 10 是保底的超时门,防止 API 不响应挂住整个 cron。


三、Skill 选择

wallstreet 日报的 cron 有三层 skill:

Skill 作用 为什么必要
wallstreet-daily 华尔街日报的专用 Skill,存了指数对照表和数据格式 内置映射关系和输出模板
us-market-closing-report 处理 Sina JS 数据 → 标准化的美股收盘报告 指数/个股格式化 + 计算
moltstreet 调用 MoltStreet AI 的买卖信号 多分析师共识 + 技术面信号

主 cron 是 LLM 驱动(deepseek-v4-pro),调度在周二到周六 06:00(对应美股周一至周五收盘后)。

cronjob(action='create',
    name='华尔街日报',
    schedule='0 6 * * 2-6',           # 周二~六 06:00 (美股交易日)
    model={'provider':'custom:api.deepseek.com','model':'deepseek-v4-pro'},
    skills=['wallstreet-daily','us-market-closing-report','moltstreet'])

为什么不是全周:美股周六日不交易,周一早上没有"周五之后的收盘数据"(等于空白),所以周一只做静默——cron 的第一步就是检测是否为交易日/美股是否休市,不是就直接 [SILENT] 终止、不写文件。


四、MoltStreet:一个额外的信号层

除了指数价格本身,加了一层 MoltStreet 的 AI 信号。MoltStreet 是多模型共识平台,对每只股票有一个"多少分析师看多/看空"的聚合。cron 在拿到指数/个股数据后,用 web_search 搜 MoltStreet 的信号(如"moltstreet NVDA signal"),提取"consensus"摘要附在个股分析里。

这层信号的价值不是预测涨跌,而是知道市场当前的情绪温度。如果所有指数都涨但 MoltStreet 信号开始偏向谨慎,那条新闻的价值在于"要小心了"而不是"明天一定跌"。


五、数据输出:从 JSON 到网页

日报生成后,写两个文件到 ~/.hermes/demo2/ 目录:

  • {YYYY-MM-DD}_indices.json:四大指数 + SOX + 七巨头的收盘数据
  • {YYYY-MM-DD}_analysis.json:市场概况(~500 字)+ 驱动因素(6 个维度各 ~200 字)

Flask 管渲染。/wallstreet/ 路由读这两个 JSON 文件,用 render_demo2_html() 把数据转成 HTML 卡片,放进 wallstreet.html 模板。模板自带日期导航条——用户可以切换历史日报、而不需要后端重新生成。

同一个数据管线还驱动了主页的"每日 WallStreet 新闻"入口。

失败恢复和日报文章里写的完全一样:手动写 JSON 覆盖数据文件、网页刷新即生效。不重跑 prompt。


六、QDII 净值预估(附赠)

华尔街日报还带动了一个额外功能:QDII 基金净值预估。因为 A 股和美股有时差——白天看到的美股行情当晚才会反映在 QDII 的净值里。所以每天早上 07:55,另一个 cron 会跑:

cronjob(action='create',
    name='隔夜美股+QDII预估',
    schedule='55 7 * * 2-6',
    skills=['us-market-closing-report','fund-portfolio-management','moltstreet'])

逻辑很简单:读昨晚美股各指数的涨跌 → 结合基金的前十大持仓权重 → 估算今天 QDII 净值会涨/跌多少个百分点。加上了 fund-portfolio-management skill 提供的假期检测和净值查询。

这个结果写在 ~/.hermes/fund-tracker/qdii-analysis.json,供 DEMO6(QDII 基金分析页)直接渲染。


七、一个踩过的坑

美股和 A 股的交易日历不一样。Python 的 datetime 默认不识别美国联邦假日(如马丁路德金日、感恩节后周五),而 Sina API 在这些日子冷启动时返回的是前一个交易日的旧数据。

解决方法是 prompt 里加一个硬检查:

美东交易日 US_DATE = 通常为 CN_TODAY 的前一个日历日跨周末时回退到上周五
美股休市日周末+美国法定假日)→ 输出 [SILENT] 并终止不写文件

需要手动维护美国假日列表是这套方案最大的不完美之处。但换个角度想:这也是它和另外三篇日报的本质区别——AI 日报、Crypto、A 股都不用关心"数据源今天开不开门",只有美股需要。能把"不开门的日子安安静静不写文件"这件事做到零出错,比写出漂亮的收盘分析更难。