美股行情速览助手
定位与边界
- 速览型复盘:5 分钟看完今天美股发生了什么。直观数据展示 + 关键事件梳理 + 客观市场定性。
- 禁止技术分析式预测:不画线、不数浪、不推走势、不给均线/MACD 信号、不做次日点位预判。市场简评只做基于数据的客观描述。
- 与
ah-market-briefing(A股速览)共享同一套渲染引擎与风格锁,但数据源、指数、公司、板块全部改为美股视角。 - 数据源:结构化行情数据仅腾讯自选股(westock-mcp MCP 工具,与 A股速览同源)——指数 / 个股 / 行业 ETF / 涨跌分布等数值类数据禁止用 web_search/curl/第三方 API 替代。模块六「今日重要事件」的新闻来源改用 WebSearch(
topic=finance,限当日、限权威源)。 - 默认复盘当日;用户指定日期时用
--date YYYY-MM-DD(quote 支持历史截面)。 - 无 A股/港股专属口径:本 skill 全部以美元计价,不出现「港元/人民币」分组、不出现「涨跌停/涨停板」等 A股专属概念(改为 GICS ETF 涨跌)。
交易日检查
采集前先判断目标日期是否为美股交易日(周末/美国法定节假日休市)。休市则告知用户「今日休市,无交易数据」并停止。
报告日期口径(易错,2026-07-31 踩坑固化):
- 报告日期 = 最近一个已收盘的美股交易日(美国当地日期),不是北京当日日期。美股常规时段为美东 09:30–16:00,对应北京时间 21:30–次日 04:00(夏令时)。北京时间 04:00 之后至次日 21:30 之前,"最近已收盘交易日"始终是美东前一日。
data_trade_calendar不适用于美股:该工具无market参数,返回的固定是 A股交易日历(listCode="calendar_hsj",listName="A股交易日历")。用它判定美股交易日会在美国节假日(如 7/4、感恩节)而 A 股正常开市时判错。- 正确判定方式:直接看
data_quote usIXIC,usINX返回的time字段——它就是该指数最后一次收盘对应的美国日期。该字段权威、零额外成本(指数行情本来就要拉),可完全替代日历调用。 - 去重保护:生成前先检查
daily-review/美股速览_<报告日期>_收盘版.html是否已存在。周末/节假日或同日多次触发时,最近已收盘交易日不变,存在即跳过生成,不重复消耗行情与检索配额。
前置依赖(安装前必读)
- 腾讯自选股数据源(必须):本 skill 的数值行情(指数 / 个股 / GICS ETF)来自腾讯自选股,主路径为连接
westock-mcp连接器,用 MCP 工具data_quote取数(下方命令示例的westock-data quote …仅为等价 CLI 写法,连了 MCP 时直接改用data_quote)。新闻用 WebSearch(topic=finance,限当日权威源)。 - Node.js(必须):生成后的 JS 语法校验需 Node;本机已自带则自动识别,无则需安装并确保在 PATH。
- IMA 上传(可选):仅当要把报告同步到个人知识库时才需要,且必须另行安装
ima-skill;不装则跳过「上传 IMA 知识库」整章,不影响本地生成报告。 - 路径占位符:文中
<SKILL_DIR>/<ima-skill>是占位符,运行时替换为技能实际安装目录(加载技能后由运行环境提供),切勿写死成其他人的绝对路径(如C:/Users/Administrator/...),否则换机器即失效。
固定代码清单
指数(2 个)
| 指数 | 代码 | 备注 |
|------|------|------|
| 纳斯达克指数 | usIXIC | 与 A股速览同接口取数 |
| 标普500指数 | usINX | 与 A股速览同接口取数 |
主要公司(13 家:美元计价)
| 公司 | 代码 | 市场 |
|------|------|------|
| 苹果 Apple | usAAPL | 美股 |
| 英伟达 Nvidia | usNVDA | 美股 |
| 谷歌 Alphabet | usGOOGL | 美股 |
| 微软 Microsoft | usMSFT | 美股 |
| 亚马逊 Amazon | usAMZN | 美股 |
| Meta | usMETA | 美股 |
| 特斯拉 Tesla | usTSLA | 美股 |
| SpaceX | usSPCX | 美股(纳斯达克上市公司,代码 SPCX) |
| 台积电 ADR | usTSM | 美股 |
| 博通 Broadcom | usAVGO | 美股 |
| SK 海力士 | usSKHY | 美股 |
| 美光科技 Micron | usMU | 美股 |
| 伯克希尔-A Berkshire | usBRK.A | 美股 |
数据采集(可并行,共约 6~8 次调用)
# 1. 指数+个股行情一次批量拉取(含 chg_5d/chg_20d/chg_ytd/PE/市值/成交额;chg_ytd=年初至今,供模块四 YTD 列)
westock-data quote usIXIC,usINX,usAAPL,usNVDA,usGOOGL,usMSFT,usAMZN,usMETA,usTSLA,usSPCX,usTSM,usAVGO,usSKHY,usMU,usBRK.A --raw
# 1b. 核心指数年初至今日K(供模块一 hover 走势图)—— 必须用脚本,不要用 MCP kline 工具
# 原因:MCP 返回 2 个指数 x 约 140 根 K 线的完整 OHLCV,会把上下文冲爆;脚本直接落盘。
# 在 report_data.json 其余字段写好之后、调用 generate.py 之前执行一次即可:
python <SKILL_DIR>/fetch_kline_us.py report_data.json
# 脚本行为:拉取 2 个指数日收盘,首点固定取【上一年最后一个交易日收盘】作为 YTD 基准
# (否则 hover 里的 YTD 会用 1 月首个交易日当基准,与模块四 chg_ytd 口径对不上),
# 末点对齐 indices[i].price,保证 hover 图末值与指数卡片一致;结果写入 indices[i].kline + chg_ytd。
#
# 【接口红线,勿改回】美股指数必须走 /appstock/app/kline/kline?param=<code>,day,,,320
# · A股速览用的 /app/fqkline/get 对 usIXIC/usINX 只回最新一根,会报 "no day series";
# · 响应 data 的 key 是带点的 "us.IXIC"/"us.INX",不是请求用的 "usIXIC"——
# 必须 list(data.values())[0] 取值,写 data[code] 必然 KeyError;
# · 320 根日K 回溯约 15 个月,足以覆盖上年末基准;收盘价在每行索引 2。
# 2. [模块二「美股市场概况」已删除] 原模块用双指数涨跌幅 + 覆盖个股分布呈现「大票 vs 小票」张力;
# 经用户确认,该模块整体从报告与渲染管线中移除,不再生成对应 HTML/JS 片段。
# 下方仅保留数据采集注释以供追溯:
# · 指数只写 volume(亿股),绝不写 amount(指数 amount 为点位×股数、无经济含义的名义值,当「亿美元成交额」展示即造假)。
# · 个股/ETF 的 amount 才是真实成交额。
# 3. GICS 板块 ETF 涨跌(固定 12 只 = 11 个 GICS 一级 + SOXX 半导体主题)
westock-data quote usXLK,usXLC,usXLF,usXLE,usXLV,usXLY,usXLI,usXLP,usXLRE,usXLU,usXLB,usSOXX --raw
# 11 个 GICS 一级:XLK 信息技术 / XLC 通讯服务 / XLF 金融 / XLE 能源 / XLV 医疗保健 /
# XLY 可选消费 / XLI 工业 / XLP 必需消费 / XLRE 房地产 / XLU 公用事业 / XLB 原材料。
# SOXX 单列并在名称后标「(主题)」,避免与 GICS 一级混为一谈。
# XTN(运输)、KIE(保险)是 XLI/XLF 的子集,重复计数,已弃用。
# 4. 今日重要事件(新闻):改用 WebSearch,不调 data_news
# WebSearch(topic=finance, query="2026-MM-DD 美股 重要事件/政策" 等),限当日、限权威源
# 8 大科技巨头各以「公司名 + 日期 + 新闻」查询;摘要基于搜索摘要/正文,标注来源
MCP 等价工具:
data_quote(code/codes)。data_changedist、data_sector(A股速览的沪深/申万口径)在本 skill 中不可用——已改为「GICS ETF 涨跌」单模块。 新闻取数:模块六改用 WebSearch(topic=finance,query 带当日日期 + 公司/主题,限权威源),不再调data_news;需要正文细节时用 WebFetch 取原文链接。
性能优化约定(生成提速,落地必读)
美股速览整体耗时的主要来源不是 Python 渲染,而是智能体编排循环(每步工具调用之间都有一次模型推理往返)。按以下优先级执行,可在数据口径与 v5 版式零改动的前提下,将整体耗时压缩约 60–70%:
- 并行工具调用(P0,最大杠杆):两次
data_quote(指数+个股 / 12 只 ETF)、以及 5 次 WebSearch 全部放进同一条消息的并行工具调用,不要逐个串行发起。交易日判定已合并进指数行情(见「交易日检查」,直接看data_quote返回的time字段),不单独占用一轮调用。串行 5 次 WebSearch ≈ 5×单程耗时;并行后 ≈ 单次最慢耗时。 - 消除冗余调用(P0):交易日判定无需调用
data_trade_calendar(见「交易日检查」——该工具只返回 A股日历,对美股无效)。直接用指数data_quote返回的time字段确定报告日期,省掉 1 次调用与 1 次编排往返。 - fetch 与 generate 链式合一(P1):在一条 Bash 内
python fetch_kline_us.py report_data.json && python generate.py report_data.json <out.html>,省掉一次独立进程启动与一次编排往返。 - fetch_kline_us.py 已并行化(P1,已落地):2 个指数 HTTP 请求走
ThreadPoolExecutor并发,墙钟耗时 ≈ 较慢那一个请求(原串行 ≈ 两者之和,且单请求超时曾高达 25s)。可调环境变量:KLINE_TIMEOUT(默认 10s,原为 25s)—— 收紧尾部延迟KLINE_RETRIES(默认 2)—— 上游抖动时重试KLINE_WORKERS(默认 4)、KLINE_BARS(默认 320)
- 跳过非必要重读(P2):SKILL.md 与 generate.py 契约稳定,无需每次重新 Read 源码;仅在改动契约后重读。
取舍说明:以上均为"编排/并发"层面优化,不改变任何数据口径与报告版式(v5 风格锁不变)。唯一潜在副作用是并行 WebSearch 数量增多会同时占用更多检索配额,但单份报告体量下无感知影响。若某环境对并发工具调用有限制,可退化为分组并行(先并行全部
data_quote+data_trade_calendar,再并行全部 WebSearch),仍可获大部分提速。
报告结构(6 个模块,顺序固定)
- AI 生成声明(前置):header 右上角的知识库引导语由
report_data.json的ima_badge字段驱动(不写死;示例填你自己的知识库名,不填则不显示)。模块一上方显示 AI 生成声明(琥珀色提示条),为 generate.py 硬编码的中性固定文案(仅提示"AI 生成、仅供参考",不含任何特定知识库),不经过数据层。
模块一:核心指数一览
- 2 个指数卡片:收盘点位、涨跌幅(红涨绿跌)、年初至今(YTD,见模块一卡片「年初至今」行与 hover 走势图,三者口径一致)。
- 一张当日涨跌幅排序横向柱状图(仅 2 根),直观展示纳指/标普分化。
- 卡片 hover 弹出该指数年初至今日线走势(由
fetch_kline_us.py注入kline)。
模块二(已删除):原「美股市场概况」
本模块经用户确认已从报告与渲染管线中整体移除,故不再生成对应 HTML/JS 片段,下方仅作架构追溯。 原结构:双指数涨跌幅 + 覆盖个股分布,用 13 家覆盖个股涨跌幅横向柱状图呈现「大票 vs 小票」张力。
模块三:美股板块 / ETF 涨跌
- GICS 行业 ETF:约 11 只 GICS 行业 ETF(XLK 科技 / SOXX 半导体 / XLF 金融 / XLE 能源 / XLV 医疗 / XLY 可选消费 / XLI 工业 / XLP 必需消费 / XLRE 地产 / XTN 运输 / KIE 保险),按涨跌幅降序横向柱状图(红涨绿跌)。
- 驱动逻辑必须基于当日可验证事实,禁止编造因果关系。
模块四:主要公司市场表现
- 单一美股组(13 家):每组表格,每行一家:收盘价、涨跌幅、PE(TTM)、总市值(亿美元)、成交额(亿美元)、近5日涨跌幅、近20日涨跌幅、今年以来(YTD)涨跌幅。
- 今年以来(YTD):直接取自
quote的chg_ytd字段(%);与近5日/近20日并列为三档时间尺度,直观呈现「短期反弹 vs 中期位置」的张力。 - 价格/市值/成交额单位为美元,禁止混用港元/人民币符号。
- 表格单元格不载单位后缀:表头已标注「总市值(亿)」「成交额(亿)」等,单元格仅放裸数字。
模块五:市场简评(4 段式,说人话,普通投资者能看懂)
写作目标:用大白话把"今天美股发生了什么、为什么、跟咱们有什么关系"讲清楚,让没时间盯盘、看不懂图表的普通人也能一眼抓住重点。保持客观、不喊单、不预测涨跌。
基本规矩:
- 图表(指数卡片、行业 ETF 涨跌图)里已经摆得明明白白的数字和排名,不要在简评里抄一遍。简评的价值是"图表说不清、但你想知道"的部分——背后的原因、逻辑和含义。
- 说人话,不用行话:避免"估值出清""安全边际""久期""存量博弈""价值/成长切换""流动性"这类圈内黑话。非用不可时,用大白话补一句解释(如把"估值偏高"写成"价格比公司本身值钱的水平贵了不少")。
- 每条判断都要有当天的事实或数据支撑,不空谈、不喊口号;不做明天涨跌的点位预测,也不给"买/卖"建议。
按「先说结论、再讲原因」组织,每段用加粗的一句话当小标题,让人扫一眼就懂:
- 今天整体是个什么局面:一句话说清今天美股是普涨、普跌还是冷热不均(如"今天科技股带头反弹,其他板块跟涨不多"),紧接着讲清楚钱为什么这么走——是消息刺激、避险、还是前期跌多了自然回血。
- 钱往哪儿跑了,为什么:不用重排行业涨跌榜(图里有),而讲"资金为什么弃一些、捧一些"——比如大家更爱稳当的、还是更敢押有想象力的;哪类股票被冷落、哪类被追捧。
- 今天的大事件影响了谁:挑当天最醒目的事,讲清"这事 → 影响了什么 → 哪些公司/行业直接受影响",别停在"发生了什么事"的复述。
- 放到更长一点时间看:用普通人的视角看现在处在什么位置——是贵了还是便宜了、后面值得盯什么信号(只列观察项,不预测点位)。
写法提示:每段尽量短、句子短、少用长句;多用"比如""说白了""换句话说"拉近距离。纯盘面数字罗列一律回退重写。
- 事实核查硬约束:简评里提到的公司动向、政策、监管动作等,必须来自模块六经时效性甄别后的 WebSearch 或当日权威信源。不凭记忆编造状态,不采信没经过时间核对的旧闻。说不准的事,老老实实标注"据公开报道",或干脆删除该判断。
模块六:今日重要事件(新闻来源 = WebSearch)
- 取数方式:用 WebSearch(
topic=finance)按「当日日期 + 主题/公司名」查询,限当日、限权威源(新华社、财联社、证券时报、交易所/公司公告、主流财经媒体);需要正文细节时用 WebFetch 取原文链接。禁止调腾讯自选股data_news(list 仅标题、detail 无正文)。 - 关键事件(3-5 条):从检索结果中高度精选,准入硬杠——①对当日市场有直接可见的驱动(事件与某板块异动可建立清晰因果链);②涉及政策/监管层面信号性变化;③涉及模块四 13 家追踪公司的重大动态(归入下方科技巨头板块)。排除:常规低频数据发布、日常价格波动、已在简评充分覆盖的事件、热搜个股/板块堆砌。无达标项则该小节不出现。
- 写法(说人话):每条用一句大白话标题点明"发生了什么",正文用 1–2 句讲清"这事儿跟市场、跟普通投资者有什么关系、影响了谁",避免照搬政策原文和术语堆砌。科技巨头新闻同理——先说清这事意味着什么,再补细节。
- 事件时效性判别(准入前置):关键事件的"发生时间"必须约束在当日或前一日,而非"报道时间"。对于涉及监管进展、IPO 申报/获批、重大交易、政策发布等里程碑事件,必须通过多源交叉验证确认其真实发生时间。若多家信源指向同一旧事件、且均未给出新的增量信息,则判定为「旧闻重提」,直接排除,不得以"今日有媒体报道"为由纳入当日事件。疑似的旧闻重提者可降级为进展追踪(标注「据 XX 报道,此事已推进至 YY 阶段,持续关注」),但不得单独列作当日关键事件。
- 科技巨头当日重要新闻(苹果 / 英伟达 / 谷歌 / 微软 / 亚马逊 / Meta / 特斯拉 / SpaceX):每条标题 + 主要内容摘要(基于搜索摘要/正文提炼,标注来源
w)。 - 条数红线(防凑数):8 家科技巨头各按实际重大程度列示,单家最多 3 条、不强制凑满 3 条;仅纳入当日可验证、对个股/板块有直接影响、或触及政策/监管信号性变化的事件。纯常规公告、已在简评充分覆盖、或低频数据发布一律排除。若某家当日仅 1 条重大新闻,则只列该 1 条,不补位灌水。
- 诚信底线:摘要须忠实于检索到的原文/摘要,注明来源;不得为填充数量而编造或夸大。
单位与展示规范(重要,易错)
| 字段 | 原始单位 | 展示 |
|------|---------|------|
| 指数 volume | 股 | ÷1e8 → 亿股。指数只用 volume,其 amount 是点位×股数的名义值,禁用 |
| 个股/ETF amount | 美元 | ÷1e8 → 亿美元(注:腾讯自选股美股接口 amount 字段单位已为亿美元,直接展示) |
| total_market_cap | 亿美元 | 同样 ÷1e8 后传数值;表头已有单位(总市值(亿)、成交额(亿)),单元格仅放数字、不载「亿/万亿/美元」等后缀 |
| 涨跌幅/chg_5d/chg_20d/chg_ytd | % | 忠实原值,保留两位小数,不得为美观改数;chg_ytd=年初至今,供模块四 YTD 列 |
| 任一字段数据源缺失 | — | 契约里显式写 null,generate.py 渲染为 --。绝不用 0 或估算值补位 |
- 颜色:上涨
#e63946(红)、下跌#2d6a4f(绿),美股惯例勿反。 - 浅底深字研报风;ECharts 内联嵌入 skill 目录
echarts.min.js(生成时直接写入<head>的<script>,不引外部 CDN)——报告完全自包含,离线秒开、任何预览沙箱可用。
交付
- 用 skill 目录下的
generate.py生成,不要每次手写 HTML:把 6 模块数据写入report_data.json(UTF-8,字段见下方「数据契约」),执行python generate.py <report_data.json> <daily-review/美股速览_YYYYMMDD.html>。 - 交付前对内联 JS 执行语法校验。本环境推荐:单进程
new vm.Script(code)解析(如node -e "const fs=require('fs'),vm=require('vm'); const h=fs.readFileSync('report.html','utf8'); const m=h.match(/<script[^>]*>([\s\S]*?)<\\/script>/i); if(m) new vm.Script(m[1])"),无需跨命令写临时文件,避免沙箱文件系统视图不一致导致node --check找不到文件。备选方案:环境支持跨命令文件持久化时,可将<script>内容抽到临时 .js 执行node --check。 - 聊天中只给一句摘要 + 文件路径,并用结果展示工具呈现。
- 报告结尾注明:「以上内容基于公开数据整理,仅为客观信息汇总,不构成投资建议」。
- 分享 / 预览:技能自带
sample_data.json(精简样例,字段与「数据契约」一致)。他人安装技能后,无需先采集真实数据即可python generate.py sample_data.json demo.html一键预览 v5 风格——风格随generate.py传递,与本地 v5 报告文件无关。
安装后配置
最小配置(即可使用)
无需任何配置。安装后直接走「数据采集 → 生成 HTML」流程,HTML 报告生成本地 daily-review/ 目录后可离线查看。
可选:IMA 知识库上传(不在本 skill 内置)
本 skill 只负责「生成报告」,不内置上传逻辑。如需把报告同步到个人 IMA 知识库:
- 完整上传流程(
create_media→cos-upload.cjs→add_knowledge)与 COS 签名脚本,见ima-skill的knowledge-base/SKILL.md与knowledge-base/scripts/cos-upload.cjs; - 推荐在调用本 skill 的自动化任务 / 工作流中编排「生成后上传」步骤,作为报告投递环节(避免把上传链路塞进可复用 skill,造成多份副本漂移);
- 报告 header 右上角的知识库引导语由
report_data.json可选字段ima_badge(字符串,如"📚 关注 IMA 知识库「你的知识库名」")驱动,不设则不显示——这是纯展示文本,与是否实际上传无关; - 上传时务必使用你自己的 IMA 知识库 ID,切勿沿用任何他人 ID。
生成器与渲染规范(固化,避免反复踩坑)
generate.py 已解决过往所有渲染问题,后续改动须沿用以下约束,切勿退回手写 HTML:
- 编码零风险:生成器 Python 源码保持 ASCII(无中文字面量);所有可见中文只来自
report_data.json,由json.dumps注入 HTML/JS。柱状图数据数组用ensure_ascii=True存成\uXXXX转义,杜绝字节丢失导致的中文乱码。 - 图表高度动态化:每张图高度 =
max(440, n*28)(n=数据条数)。行业图 11 条 → 440px,保证每根柱子约 28px 不被压扁。 - 坐标轴不裁切:所有图
grid.containLabel:true,长行业名(如「SK 海力士」)与右侧「+17.52%」数值标签永不溢出。 - 响应式 + 容错:
echarts.init后统一window.addEventListener('resize', ...)重绘;chart 渲染整体包try/catch,单图报错只显示顶部#chartErr错误条,不中断其余图。 - ECharts 内联自包含:
echarts.min.js缓存在 skill 目录,generate.py读取后内联进<head>的<script>(并对</script>做<\/script>转义防截断)。不引任何外部 CDN——彻底消除"打开后图表等 CDN 现拉"的延迟,离线/沙箱均秒开。ensureECharts仅作window.echarts兜底校验,不再注入 unpkg。 - 排版醒目:关键数字放大加粗、次要信息提亮(禁用
#aaa/#777死灰)。规格——模块标题 22px/800、指数价 24px/800、情绪数值 30px/800 且按语义着色(涨红 / 跌绿 / 成交蓝)、表格 14px、变动值列 700 字重。
风格锁定(Style Lock)
v5(2026-07-27)的版式即唯一权威样式。 后续所有生成(含自动化复跑)必须严格沿用,禁止擅自改动观感。
- 唯一生成入口:只能调用本目录
generate.py,禁止临时手写 HTML / 内联 ECharts 替代。 - 令牌即契约:下方设计令牌为锁定值。改动任意一项(颜色 / 字号 / 字重 / 间距 / 渐变 / 图表高度或行为)都算「风格漂移」,须先经用户明确确认方可调整,不得主动「美化」或「顺手调一下」。
- 自动化复跑同样受锁:cron 每日执行也必须走
generate.py+ 当日report_data.json,不手写、不复用旧 HTML、不临时换 CDN 或配色。
| 类别 | 令牌 | 锁定值 |
|------|------|--------|
| 语义色 | 涨红 | #e63946 |
| 语义色 | 跌绿 | #2d6a4f |
| 语义色 | 成交蓝 | #2563eb |
| 底色 | 页面背景 | #eef1f6 |
| 底色 | 卡片 / 容器 | #ffffff |
| 文字 | 主文字 | #14142b |
| 文字 | 次要文字 | #5b5b73(禁用 #aaa/#777 死灰) |
| 线条 | 边框 / 分隔 | #e9ecf2 |
| 头部 | 渐变 | linear-gradient(135deg,#1a1a2e 0%,#16213e 100%) |
| 字号 | 模块标题 | 22px / 800(左侧 5px 红色竖条) |
| 字号 | 指数价 | 24px / 800 |
| 字号 | 情绪数值 | 30px / 800(按语义着色:涨红 / 跌绿 / 成交蓝) |
| 字号 | 表格正文 | 14px(公司表格 .company-table 为 13px/6-7px padding);表头 13px / 700(公司表格 12px) |
| 布局 | 容器最大宽 | 1180px |
| 布局 | 模块内边距 | 34px |
| 图表 | 高度 | 行业图 max(440, n×28)(2 条 → 440px?不,2 条索引图 → 按 2 条计算 max(440, 2*28)=496;11 条 ETF 图 → max(440, 11*28)=748);概念图已弃用 |
| 图表 | 坐标轴 | containLabel:true;inverse:true 实现降序;barMaxWidth:22 |
| 图表 | 库加载 | ECharts 内联自包含(skill 目录 echarts.min.js 写入 <head>);无外部 CDN 依赖 → 打开即渲染,离线/沙箱可用;resize 监听 + 单图 try/catch(#chartErr 兜底) |
| 标题 | 副标题(动态) | US {收盘速览\|午间速览\|盘中速览} · 数据截至 {data_time} · 数据来源:{source};session 决定标签,三档不可混淆 |
| 页脚 | 生成时间(动态) | 数据来源:{source} | 生成时间:{真实生成时刻 YYYY-MM-DD HH:MM};严禁写死「收盘后」——中午/盘中生成须如实显示时段 |
数据契约(report_data.json 字段)
{
"date":"YYYY-MM-DD","weekday":"周一","source":"腾讯自选股(美股速览)",
"data_time":"YYYY-MM-DD HH:MM", // 美股市场:无港股口径,仅 data_time
"session":"close|noon|intraday", // session 驱动动态标题/页脚
"indices":[{"name","price","chg"(float),"volume"(字符串,亿股),"kline"(YTD日K序列:[[日期,收盘点位],...]),"chg_ytd"(float,年初至今涨跌幅%)], // 2 个;kline 与 chg_ytd 由 fetch_kline_us.py 自动写入,首点=上年最后一个交易日收盘(YTD基准),末点=当日且已对齐 price;chg_ytd 供模块一卡片「年初至今」行与 hover 走势图,三者口径必须一致
"sectors":[{"name","chg"(float)}], // GICS 板块 ETF,降序(固定 12 只:11 GICS 一级 + SOXX 主题)
"companies":[{"name","price","chg","pe","cap","amt",
"c5","c20","cytd"}], // 13 家(美元计价)
"review":[{"hl","p"}], // 4 段;hl=一句话大白话小标题,p=2-4句口语化正文(说人话、不堆术语)
"events_key":[{"t","d","w"}],"events_tech":[...], // 模块六(关键事件/关键事项 + 8 巨头新闻);t=大白话标题,d=1-2句"影响了谁/什么"说明,w=来源
"ima_badge":"📚 关注 IMA 知识库「你的知识库名」" // 可选,header 引导语;不设则不显示
}
chg/c5/c20/cytd 均为 % 浮点(忠实原值,两位小数);cytd=年初至今,模块四表头显示「今年以来」。
数据红线
- 不编造数据;某数据源为空时如实标注「当前数据源未覆盖」。
- 数字忠实原值,禁止为排版美观而失真(口语化措辞可以,数字不动)。
- 不使用「建议买入/卖出」措辞;不做走势预测。
- 数据完整性防御(必查):写入
report_data.json前须保证所有字符串字段无 U+FFFD(\ufffd,常见于编码转换错乱后的"豆腐字"占位符)——出现即视为上游数据污染,禁止在 HTML 中静默渲染成□误导读者。generate.py已自带sanitize():递归扫描全字段、统计 U+FFFD 数量并把字段路径写到 stderr,输出时把每个 U+FFFD 替换为可见占位符[?]。自动化复跑亦受此约束:脚本检测到任何 U+FFFD 时须中止 IMA 上传、回到 JSON 修复源数据,绝不带脏上传(脚本报错立即停)。手工复跑若看到[WARN] corruption marker(s) detected必须先修 JSON 再生成。
Scan to join WeChat group