从零搭建华尔街日报:每天 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 股都不用关心"数据源今天开不开门",只有美股需要。能把"不开门的日子安安静静不写文件"这件事做到零出错,比写出漂亮的收盘分析更难。