earnings-preview-single
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSingle-Company Earnings Preview
单公司业绩预告
Generate a concise, professional equity research earnings preview for a single company. The output is a self-contained HTML file targeting 4-5 printed pages. The report is dense with figures and data, with tight narrative that gets straight to the point.
Data Sources (ZERO EXCEPTIONS): The ONLY permitted data sources are Kensho Grounding MCP () and S&P Global MCP (). Absolutely NO other tools, data sources, or web access of any kind. Specifically:
searchkfinance- Do NOT use ,
WebSearch,WebFetch,web_search,brave_search, or ANY generic web/internet search tool — even if Kensho is slow, returns no results, or is temporarily unavailable.google_search - Do NOT use any browser, URL fetch, or web scraping tool.
- If Kensho Grounding returns no results for a query, try rephrasing the query or note "data not available" in the report. NEVER fall back to web search as an alternative.
- Every piece of information in the report must be traceable to either a MCP function call or a Kensho
kfinancecall. If it cannot be sourced to one of these two, it must not appear in the report.search
Critical Rule: You MUST complete ALL research and data collection (Phases 1-5) BEFORE writing any part of the report.
Intermediate File Rule: All raw data from MCP tool calls MUST be written to files in immediately after each tool call returns — before moving to the next call. This protects data from context window compression. Do NOT hold data only in memory. At the start of Phase 1, run to create the directory. Before generating the HTML report (Phase 7), you MUST read ALL intermediate files back into context using commands. The files — not your memory of earlier conversation — are the single source of truth for every number, quote, and source URL in the report. If you skip reading the files, the report WILL contain errors.
/tmp/earnings-preview/mkdir -p /tmp/earnings-previewcatFiscal Quarter Rule: NEVER infer the fiscal quarter from the calendar report date. Many companies have non-standard fiscal years (e.g., Walmart's FY ends Jan 31, so a Feb 2026 report covers Q4 FY2026, not Q4 2025 or Q1 2026). Always use the fiscal quarter and fiscal year exactly as stated in the earnings call name returned by or (e.g., "Walmart Q4 FY2026 Earnings Call" means the quarter is Q4 FY2026). Use that verbatim in the report title, headers, tables, and all references. If the call name is ambiguous, cross-reference with period labels.
get_next_earnings_from_identifiersget_earnings_from_identifiersget_financial_line_item_from_identifiersLength Rule: The report must be concise. Target 4-5 pages when printed. Do NOT write long multi-paragraph narratives. Use tight, punchy bullet points. Every sentence must earn its place. If you can say it in fewer words, do so.
Verbatim Quote Rule: When quoting management in tags, the text MUST be copied exactly from the transcript — word for word, including filler words and sentence fragments. Do NOT paraphrase, rearrange, combine sentences from different parts of the transcript, or "clean up" quotes. If you cannot find the exact phrase in the transcript, do NOT present it as a direct quote. Instead, paraphrase in your own narrative voice without blockquote formatting (e.g., "Management noted that data center demand remains significant"). Every blockquote must be a verbatim, copy-paste excerpt that can be verified against the transcript.
<blockquote>Calculation Integrity Rule: For any multi-step calculation (implied quarterly figures from annual guidance, LTM P/E, y/y growth rates, segment y/y changes), write out each step explicitly and verify intermediate results before using them in the next step. If you state A + B + C = X, verify X is arithmetically correct before using X in a subsequent formula. If the appendix shows a sum that does not equal its stated components, the report is wrong. When in doubt, recompute from raw data rather than reusing a previously calculated intermediate.
Ratio Nomenclature Rule: All valuation ratios must be explicitly labeled as LTM (Last Twelve Months) or NTM (Next Twelve Months). Never use "trailing" or "forward" — always use LTM or NTM. LTM ratios use the sum of the most recent 4 reported quarters. NTM ratios use the sum of the next 4 quarterly consensus mean EPS estimates from — NOT a single annual figure. Both LTM and NTM P/E must be computed and displayed in the competitor comparison table.
get_consensus_estimates_from_identifiersHyperlink Rule (STRICTLY ENFORCED): Every claim in the report — numeric AND non-numeric — MUST be wrapped in an hyperlink pointing to the corresponding entry in the Appendix. This is not optional. Every single number in the report must be a clickable link. This includes: revenue figures, EPS, margins, growth rates, market caps, P/E ratios, stock returns, price targets, segment revenue, and any other financial metric. It also includes qualitative claims from transcripts or Kensho searches. If you state it as fact, it must link to a source. Assign each unique claim a sequential reference ID (, , etc.). The hyperlink style is subtle — navy color, no underline, dotted underline on hover. Do NOT write any number in the report body without wrapping it in an tag. Example: write , NEVER write as plain text.
<a href="#ref-N" class="data-ref">ref-1ref-2<a><a href="#ref-1" class="data-ref">$152.3B</a>$152.3B生成一份精简、专业的单公司股权研究业绩预告,输出为独立的HTML文件,打印篇幅目标为4-5页。报告数据密集、内容精炼,叙事直接切中要点。
数据来源(无任何例外): 唯一允许使用的数据来源为 Kensho Grounding MCP () 和 S&P Global MCP ()。绝对禁止使用任何其他工具、数据源或任何形式的网络访问,具体要求如下:
searchkfinance- 禁止使用 、
WebSearch、WebFetch、web_search、brave_search或任何通用网络/互联网搜索工具——即使Kensho响应缓慢、返回无结果或暂时不可用也不得使用。google_search - 禁止使用任何浏览器、URL抓取或网页爬虫工具。
- 如果Kensho Grounding对某个查询无返回结果,可尝试重述查询,或在报告中标注“数据不可用”。绝对不允许改用网络搜索作为替代方案。
- 报告中的所有信息都必须可追溯至MCP函数调用或Kensho
kfinance调用,无法溯源至这两类来源的信息不得出现在报告中。search
核心规则: 你必须在编写任何报告内容前完成全部研究和数据收集工作(阶段1-5)。
中间文件规则: 所有来自MCP工具调用的原始数据必须在每次工具调用返回后立即写入目录下的文件,之后再进行下一次调用。该规则可避免数据因上下文窗口压缩丢失,不要仅将数据保存在内存中。在阶段1开始时,运行创建工作目录。在生成HTML报告(阶段7)前,你必须使用命令将所有中间文件读取回上下文,这些文件是报告中所有数字、引用、来源URL的唯一可信来源,而非你对之前对话的记忆。如果跳过读取文件步骤,报告一定会出现错误。
/tmp/earnings-preview/mkdir -p /tmp/earnings-previewcat财季规则: 绝对不要根据公历报告日期推断财季,很多公司采用非标准财年(例如沃尔玛的财年结束于1月31日,因此2026年2月的报告对应的是2026财年第四季度,而非2025年第四季度或2026年第一季度)。始终严格使用或返回的财报电话会议名称中明确标注的财季和财年(例如“沃尔玛2026财年第四季度财报电话会议”对应的财季就是2026财年Q4),在报告标题、表头、表格和所有引用中原样使用该表述。如果会议名称表述模糊,可与返回的期间标签交叉验证。
get_next_earnings_from_identifiersget_earnings_from_identifiersget_financial_line_item_from_identifiers篇幅规则: 报告必须精简,打印篇幅目标为4-5页。不要撰写长篇多段落叙事,使用紧凑、有力的要点列表,每句话都要有存在价值,能用更少的字表达就不要赘述。
逐字引用规则: 在标签中引用管理层发言时,内容必须完全逐字抄录自会议记录——一字不差,包括语气词和句子片段。不要转述、调整语序、合并不同部分的句子,也不要“润色”引用内容。如果无法在会议记录中找到完全匹配的表述,不要将其标注为直接引用,而是用你自己的叙事语言转述,不使用块引用格式(例如“管理层指出数据中心需求仍然旺盛”)。所有块引用都必须是可与会议记录核验的逐字摘抄内容。
<blockquote>计算准确性规则: 对于任何多步计算(从年度指引推导季度隐含数据、LTM市盈率、同比增长率、分部同比变动),要明确写出每一步计算过程,验证中间结果后再用于下一步计算。如果你给出A + B + C = X,要先验证X的算术正确性,再将X用于后续公式。如果附录中的总和与标注的组成项不匹配,报告即为错误。存在疑问时,从原始数据重新计算,不要复用之前计算的中间值。
比率命名规则: 所有估值比率必须明确标注为LTM(过去十二个月)或NTM(未来十二个月),不要使用“ trailing(滚动)”或“forward(前瞻)”表述,始终使用LTM或NTM。LTM比率使用最近4个已披露季度的总和计算,NTM比率使用返回的未来4个季度共识EPS预期均值之和计算——而非单一年度数据。竞争对手对比表中必须同时计算并展示LTM和NTM市盈率。
get_consensus_estimates_from_identifiers超链接规则(严格执行): 报告中的每一项声明——无论是数值类还是非数值类——都必须包裹在超链接中,指向附录中对应的条目。该要求为强制项,报告中的所有数字都必须是可点击的链接,包括营收数据、EPS、利润率、增长率、市值、市盈率、股价回报、目标价、分部营收及其他所有财务指标,也包括来自会议记录或Kensho搜索的定性声明。如果你将某内容作为事实陈述,就必须链接到对应来源。为每个唯一声明分配连续的引用ID(、等)。超链接样式要低调:藏青色、无下划线, hover时显示点状下划线。报告正文中出现的所有数字都必须包裹在标签中,禁止直接写纯文本数字。示例:要写,绝对不要直接写纯文本。
<a href="#ref-N" class="data-ref">ref-1ref-2<a><a href="#ref-1" class="data-ref">$152.3B</a>$152.3BPhase 1: Company Profile & Setup
阶段1:公司概况与准备
- Parse the single company ticker from (strip whitespace).
$ARGUMENTS - Run to create the working directory.
mkdir -p /tmp/earnings-preview - Call to establish current reporting period context.
get_latest() - Call — record market cap, industry.
get_info_from_identifiers - Call — record business description.
get_company_summary_from_identifiers - Call — record upcoming earnings date and fiscal quarter name.
get_next_earnings_from_identifiers
Immediately write :
/tmp/earnings-preview/company-info.txtTICKER: [ticker]
COMPANY: [full name]
INDUSTRY: [industry]
MARKET_CAP: [value] (as of [date])
NEXT_EARNINGS_DATE: [date]
NEXT_EARNINGS_QUARTER: [Q# FY#### exactly as returned by API]
BUSINESS_DESCRIPTION: [2-3 sentence summary]- 从中解析单家公司的股票代码(去除空白字符)。
$ARGUMENTS - 运行创建工作目录。
mkdir -p /tmp/earnings-preview - 调用确定当前报告期上下文。
get_latest() - 调用——记录市值、所属行业。
get_info_from_identifiers - 调用——记录业务描述。
get_company_summary_from_identifiers - 调用——记录即将到来的财报发布日期和财季名称。
get_next_earnings_from_identifiers
立即写入 :
/tmp/earnings-preview/company-info.txtTICKER: [股票代码]
COMPANY: [公司全称]
INDUSTRY: [所属行业]
MARKET_CAP: [数值] (截至 [日期])
NEXT_EARNINGS_DATE: [日期]
NEXT_EARNINGS_QUARTER: [API返回的 exact 格式Q# FY####]
BUSINESS_DESCRIPTION: [2-3句摘要]Phase 2: Earnings Transcript Analysis (MANDATORY — COMPLETE BEFORE WRITING)
阶段2:财报电话会议记录分析(强制要求——编写报告前必须完成)
- Call to get the most recent completed earnings call
get_latest_earnings_from_identifiers.key_dev_id - Call for that transcript.
get_transcript_from_key_dev_id - Immediately write with the following sections. Write this file WHILE you still have the transcript in context — do not wait:
/tmp/earnings-preview/transcript-extracts.txt
TRANSCRIPT_SOURCE: [Call Name, e.g., "Q3 2025 Earnings Call"]
KEY_DEV_ID: [key_dev_id]
CALL_DATE: [date]
FISCAL_QUARTER: [Q# FY####]
=== VERBATIM QUOTES (copy-paste exactly — do NOT paraphrase) ===
QUOTE_1: "[exact text from transcript]"
SPEAKER_1: [Name], [Title]
CONTEXT_1: [1 sentence on where this appeared — prepared remarks or Q&A]
QUOTE_2: "[exact text from transcript]"
SPEAKER_2: [Name], [Title]
CONTEXT_2: [context]
QUOTE_3: "[exact text from transcript]"
SPEAKER_3: [Name], [Title]
CONTEXT_3: [context]
QUOTE_4: "[exact text from transcript]"
SPEAKER_4: [Name], [Title]
CONTEXT_4: [context]
=== GUIDANCE (quantitative only) ===
- [metric]: [range or point estimate as stated by management]
- [metric]: [range or point estimate]
=== KEY DRIVERS ===
- [driver 1 with supporting data point]
- [driver 2 with supporting data point]
- [driver 3 with supporting data point]
=== HEADWINDS & RISKS ===
- [risk 1 with quantification if available]
- [risk 2]
=== ANALYST Q&A THEMES ===
- [theme 1: what analysts pushed on]
- [theme 2]
- [theme 3]
=== SYNTHESIS: THEMES TO WATCH NEXT QUARTER ===
- [theme 1]
- [theme 2]
- [theme 3]- 调用获取最近一次已完成的财报电话会议的
get_latest_earnings_from_identifiers。key_dev_id - 调用获取对应的会议记录。
get_transcript_from_key_dev_id - 立即写入 ,包含以下板块。在会议记录仍在上下文范围内时写入该文件,不要延后:
/tmp/earnings-preview/transcript-extracts.txt
TRANSCRIPT_SOURCE: [会议名称,例如 "Q3 2025 Earnings Call"]
KEY_DEV_ID: [key_dev_id]
CALL_DATE: [日期]
FISCAL_QUARTER: [Q# FY####]
=== 逐字引用(完全复制粘贴——不要转述) ===
QUOTE_1: "[会议记录中的 exact 文本]"
SPEAKER_1: [姓名], [职位]
CONTEXT_1: [1句话说明引用出现的场景—— prepared remarks 还是 Q&A环节]
QUOTE_2: "[会议记录中的 exact 文本]"
SPEAKER_2: [姓名], [职位]
CONTEXT_2: [上下文]
QUOTE_3: "[会议记录中的 exact 文本]"
SPEAKER_3: [姓名], [职位]
CONTEXT_3: [上下文]
QUOTE_4: "[会议记录中的 exact 文本]"
SPEAKER_4: [姓名], [职位]
CONTEXT_4: [上下文]
=== 业绩指引(仅量化内容) ===
- [指标]: [管理层披露的区间或点预期]
- [指标]: [区间或点预期]
=== 核心驱动因素 ===
- [驱动因素1及支撑数据点]
- [驱动因素2及支撑数据点]
- [驱动因素3及支撑数据点]
=== 逆风与风险 ===
- [风险1,可量化的话标注量化信息]
- [风险2]
=== 分析师问答主题 ===
- [主题1:分析师重点关注的内容]
- [主题2]
- [主题3]
=== 总结:下个季度需要关注的主题 ===
- [主题1]
- [主题2]
- [主题3]Phase 3: Competitor Analysis
阶段3:竞争对手分析
- Call with
get_competitors_from_identifiers.competitor_source="all" - Select top 5-7 most relevant public competitors.
- For the company AND all selected competitors, gather:
- with
get_prices_from_identifiers, last 12 monthsperiodicity="day" - for
get_financial_line_item_from_identifiers,diluted_eps,period_type="quarterly"num_periods=8 - with
get_capitalization_from_identifiers(latest)capitalization="market_cap" - with
get_consensus_estimates_from_identifiers,period_type="quarterly"— this returns consensus mean EPS estimates for the next 4 quarters, which are summed to compute NTM EPSnum_periods_forward=4
After each tool call returns, immediately append the raw data to the appropriate intermediate file:
Write — one row per (ticker, date, close). Include the column with the exact MCP function call. Write the subject company's prices first, then each competitor's as you fetch them:
/tmp/earnings-preview/prices.csvsourceticker,date,close,source
D,2025-02-19,55.67,get_prices_from_identifiers(identifier='D',periodicity='day')
D,2025-02-20,55.82,get_prices_from_identifiers(identifier='D',periodicity='day')
...
DUK,2025-02-19,111.79,get_prices_from_identifiers(identifier='DUK',periodicity='day')
...Note: the value is the same for all rows from a single call — write it on every row so it's always available.
sourceWrite — one row per (ticker, period, eps). Write immediately after each call:
/tmp/earnings-preview/peer-eps.csvdiluted_epsticker,period,diluted_eps,source
D,Q4 2024,1.09,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
D,Q1 2025,-0.11,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
...
DUK,Q4 2024,1.52,get_financial_line_item_from_identifiers(identifier='DUK',line_item='diluted_eps',period_type='quarterly')
...Write — one row per ticker. Write immediately after each call:
/tmp/earnings-preview/peer-market-caps.csvmarket_capticker,market_cap,retrieval_date,source
D,55900000000,2026-02-19,get_capitalization_from_identifiers(identifier='D',capitalization='market_cap')
DUK,98300000000,2026-02-19,get_capitalization_from_identifiers(identifier='DUK',capitalization='market_cap')
...Write — one row per (ticker, period, consensus mean EPS). Write immediately after each call:
/tmp/earnings-preview/consensus-eps.csvget_consensus_estimates_from_identifiersticker,period,consensus_mean_eps,num_estimates,source
D,Q4 2025,0.88,12,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q1 2026,0.72,10,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q2 2026,0.91,9,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q3 2026,1.05,8,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
DUK,Q4 2025,1.48,14,get_consensus_estimates_from_identifiers(identifier='DUK',period_type='quarterly',num_periods_forward=4)
...- Do NOT calculate P/E or returns yet. The raw data is now on disk. Calculations happen in Phase 6 (Verification), reading from these files.
Date Consistency Rule (stock returns): When computing comparative stock returns (YTD %, 1-yr %, 30d %, 90d %), ALL tickers MUST use the exact same start and end dates. After writing all price data to , identify the first trading date that appears in ALL tickers' data and use that as the common base date. Do NOT use different base dates for different tickers (e.g., the subject from Feb 19 and peers from Feb 28). If a ticker's data starts later than others, use the first overlapping date for ALL calculations. State the common base date in the appendix for every return calculation.
prices.csvP/E Currency Rule (LTM P/E): When computing LTM P/E for each company, use that company's most recent 4 reported quarters from — not a fixed calendar window applied to all. If a peer has already reported Q4 2025 while the subject company has only reported through Q3 2025, the peer's LTM EPS should include Q4 2025. Check the latest reported period for each company and use the 4 most recent periods per company. Note in the appendix which 4 quarters were used for each P/E calculation.
peer-eps.csvMarket Cap Date-Stamp: When reporting market cap, use the from . If it differs from the report date, note this in the appendix.
retrieval_datepeer-market-caps.csv- 调用,参数
get_competitors_from_identifiers。competitor_source="all" - 选择5-7家最相关的上市竞争对手。
- 为目标公司和所有选中的竞争对手收集以下数据:
- ,参数
get_prices_from_identifiers,时间范围为最近12个月periodicity="day" - ,获取
get_financial_line_item_from_identifiers,参数diluted_eps,period_type="quarterly"num_periods=8 - ,参数
get_capitalization_from_identifiers(最新值)capitalization="market_cap" - ,参数
get_consensus_estimates_from_identifiers,period_type="quarterly"——返回未来4个季度的共识EPS预期均值,求和后用于计算NTM EPSnum_periods_forward=4
每次工具调用返回后,立即将原始数据追加到对应的中间文件中:
写入 ——每行对应(股票代码, 日期, 收盘价),包含列,值为对应MCP函数调用的 exact 内容。先写入目标公司的股价数据,再依次写入每个竞争对手的股价数据:
/tmp/earnings-preview/prices.csvsourceticker,date,close,source
D,2025-02-19,55.67,get_prices_from_identifiers(identifier='D',periodicity='day')
D,2025-02-20,55.82,get_prices_from_identifiers(identifier='D',periodicity='day')
...
DUK,2025-02-19,111.79,get_prices_from_identifiers(identifier='DUK',periodicity='day')
...注意:单次调用返回的所有行的值相同,每行都要写入该值,确保随时可溯源。
source写入 ——每行对应(股票代码, 期间, 摊薄EPS),每次调用接口后立即写入:
/tmp/earnings-preview/peer-eps.csvdiluted_epsticker,period,diluted_eps,source
D,Q4 2024,1.09,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
D,Q1 2025,-0.11,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
...
DUK,Q4 2024,1.52,get_financial_line_item_from_identifiers(identifier='DUK',line_item='diluted_eps',period_type='quarterly')
...写入 ——每行对应一家公司的股票代码,每次调用接口后立即写入:
/tmp/earnings-preview/peer-market-caps.csvmarket_capticker,market_cap,retrieval_date,source
D,55900000000,2026-02-19,get_capitalization_from_identifiers(identifier='D',capitalization='market_cap')
DUK,98300000000,2026-02-19,get_capitalization_from_identifiers(identifier='DUK',capitalization='market_cap')
...写入 ——每行对应(股票代码, 期间, 共识EPS均值),每次调用接口后立即写入:
/tmp/earnings-preview/consensus-eps.csvget_consensus_estimates_from_identifiersticker,period,consensus_mean_eps,num_estimates,source
D,Q4 2025,0.88,12,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q1 2026,0.72,10,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q2 2026,0.91,9,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q3 2026,1.05,8,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
DUK,Q4 2025,1.48,14,get_consensus_estimates_from_identifiers(identifier='DUK',period_type='quarterly',num_periods_forward=4)
...- 暂时不要计算市盈率或回报数据,原始数据现已存入磁盘,计算工作将在阶段6(验证)中从这些文件读取数据后进行。
股价回报日期一致性规则: 计算对比股价回报(YTD %、1年%、30天%、90天%)时,所有公司必须使用完全相同的起止日期。将所有股价数据写入后,找出所有公司数据中都存在的最早交易日,将其作为共同基准日期。不要为不同公司使用不同的基准日期(例如目标公司用2月19日,同行用2月28日)。如果某家公司的数据起始日期晚于其他公司,将所有计算的基准日期统一为第一个重叠日期。在附录中说明所有回报计算使用的共同基准日期。
prices.csvLTM市盈率货币规则: 计算每家公司的LTM市盈率时,使用该公司**中最近4个已披露季度**的数据——而非适用于所有公司的固定日历窗口。如果某家同行已经披露了2025年第四季度数据,而目标公司仅披露到2025年第三季度,则该同行的LTM EPS应包含2025年第四季度数据。核对每家公司的最新披露期间,使用每家公司最近4个期间的数据,在附录中说明每个市盈率计算使用的4个季度。
peer-eps.csv市值日期戳: 披露市值时,使用中的,如果该日期与报告日期不同,在附录中说明。
peer-market-caps.csvretrieval_datePhase 4: News, Estimates & Sector Intelligence (via Kensho Grounding)
阶段4:新闻、预期与行业情报(通过Kensho Grounding获取)
Run these queries for each category below. Do NOT skip any.
searchCRITICAL — Capture Source URLs: Every Kensho result includes a source URL for the underlying article, report, or data page. You MUST record the URL alongside each finding.
searchAfter EACH search call, immediately append the results to using the format below. Do NOT wait until all searches are done — write after each one:
/tmp/earnings-preview/kensho-findings.txt=== SEARCH: "[query used]" ===
DATE_RUN: [today's date]
CATEGORY: [estimates|analyst_ratings|risks|news|sector]
FINDING_1: [key finding or excerpt]
URL_1: [source URL from search result]
SOURCE_1: [publication name, date if available]
FINDING_2: [key finding or excerpt]
URL_2: [source URL]
SOURCE_2: [publication name, date]
[...continue for all relevant results from this search...]Earnings estimates & analyst sentiment:
- for "[TICKER] earnings estimates consensus EPS revenue upcoming quarter"
search- Record: consensus EPS, consensus revenue, estimate revision direction over last 90 days.
- Append to kensho-findings.txt immediately.
- for "[TICKER] analyst ratings price target upgrades downgrades"
search- Record: recent upgrades/downgrades, price target range, bull/bear thesis summaries.
- Append to kensho-findings.txt immediately.
- for "[TICKER] risks bear case concerns investors"
search- Record: key debates, bear arguments, swing factors for the upcoming print.
- Append to kensho-findings.txt immediately.
Recent news (MANDATORY — do not skip):
4. for "[TICKER] [company name] recent news developments"
search- Record: material news from the last 60 days — M&A, product launches, executive changes, regulatory actions, partnerships, legal developments, tariffs, or any event that could affect the upcoming earnings print or forward guidance.
- For each item, note the date, headline, potential earnings impact.
- Append to kensho-findings.txt immediately.
Sector context:
5. for "[company industry/sector] sector outlook trends"
search- Record: sector-level tailwinds/headwinds, macro data, competitive dynamics.
- Append to kensho-findings.txt immediately.
针对以下每个类别运行对应的查询,不要遗漏任何类别。
search关键要求——记录来源URL: 每个Kensho 结果都包含对应文章、报告或数据页面的来源URL,你必须将URL与对应发现一同记录。
search每次搜索调用返回后,立即将结果追加到 ,使用以下格式。不要等到所有搜索完成后再写入,每次搜索完成后立即写入:
/tmp/earnings-preview/kensho-findings.txt=== 搜索: "[使用的查询词]" ===
DATE_RUN: [今日日期]
CATEGORY: [estimates|analyst_ratings|risks|news|sector]
FINDING_1: [关键发现或摘要]
URL_1: [搜索结果返回的来源URL]
SOURCE_1: [出版物名称,可获取的话标注日期]
FINDING_2: [关键发现或摘要]
URL_2: [来源URL]
SOURCE_2: [出版物名称,日期]
[...继续写入本次搜索的所有相关结果...]业绩预期与分析师情绪:
- 查询 "[股票代码] earnings estimates consensus EPS revenue upcoming quarter"
search- 记录:共识EPS、共识营收、过去90天的预期修正方向。
- 立即追加到kensho-findings.txt。
- 查询 "[股票代码] analyst ratings price target upgrades downgrades"
search- 记录:近期评级上调/下调、目标价区间、看多/看空逻辑摘要。
- 立即追加到kensho-findings.txt。
- 查询 "[股票代码] risks bear case concerns investors"
search- 记录:核心争议、看空论据、即将发布的财报的波动因素。
- 立即追加到kensho-findings.txt。
近期新闻(强制要求——不要遗漏):
4. 查询 "[股票代码] [公司名称] recent news developments"
search- 记录:过去60天的重大新闻——并购、产品发布、高管变动、监管动作、合作、法律进展、关税或任何可能影响即将发布的财报或前瞻指引的事件。
- 为每个条目记录日期、标题、潜在的业绩影响。
- 立即追加到kensho-findings.txt。
行业背景:
5. 查询 "[公司所属行业] sector outlook trends"
search- 记录:行业层面的利好/利空因素、宏观数据、竞争动态。
- 立即追加到kensho-findings.txt。
Phase 5: Financial Data Collection
阶段5:财务数据收集
Quarterly financials (last 8 quarters):
with , for:
, , , , ,
get_financial_line_item_from_identifiersperiod_type="quarterly"num_periods=8revenuegross_profitoperating_incomeebitdanet_incomediluted_epsAfter each line item call returns, immediately append to . Write the raw values exactly as returned — do NOT round or convert yet. Include the column with the exact MCP function call and parameters:
/tmp/earnings-preview/financials.csvsourceticker,period,line_item,value,source
D,Q4 2024,revenue,3941000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q1 2025,revenue,3400000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q2 2025,revenue,4076000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q3 2025,revenue,3810000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q4 2024,diluted_eps,1.09,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
D,Q1 2025,diluted_eps,-0.11,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
...Do NOT calculate margins or growth rates yet. Write raw data only. Calculations happen in Phase 6.
Segment data:
- with
get_segments_from_identifiers,segment_type="business",period_type="quarterly"num_periods=8 - You need 8 quarters (not 4) so you have the year-ago quarter for y/y comparisons. To calculate y/y for Q3 2025, you need Q3 2024 — which is the 5th quarter back. If the prior-year quarter's segment data is not available in the API response, do NOT estimate or fabricate it. State "y/y not available" in the report.
Immediately write :
/tmp/earnings-preview/segments.csvticker,period,segment_name,revenue,source
D,Q3 2024,Dominion Energy Virginia,2762000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2024,Dominion Energy South Carolina,848000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2024,Contracted Energy,260000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Dominion Energy Virginia,3311000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Dominion Energy South Carolina,945000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Contracted Energy,297000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
...Earnings history (for stock chart annotations):
- — collect past earnings dates within the 12-month price window.
get_earnings_from_identifiers - Immediately write :
/tmp/earnings-preview/earnings-dates.csv
ticker,earnings_date,call_name,source
D,2025-05-02,Q1 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
D,2025-08-01,Q2 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
D,2025-10-31,Q3 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
...季度财务数据(最近8个季度):
调用,参数,,获取以下指标:
, , , , ,
get_financial_line_item_from_identifiersperiod_type="quarterly"num_periods=8revenuegross_profitoperating_incomeebitdanet_incomediluted_eps每次获取单个指标的调用返回后,立即追加到 。完全按照返回值写入原始数据,暂时不要四舍五入或转换单位。包含列,值为对应MCP函数调用和参数的 exact 内容:
/tmp/earnings-preview/financials.csvsourceticker,period,line_item,value,source
D,Q4 2024,revenue,3941000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q1 2025,revenue,3400000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q2 2025,revenue,4076000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q3 2025,revenue,3810000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q4 2024,diluted_eps,1.09,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
D,Q1 2025,diluted_eps,-0.11,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
...暂时不要计算利润率或增长率,仅写入原始数据,计算工作将在阶段6进行。
分部数据:
- 调用,参数
get_segments_from_identifiers,segment_type="business",period_type="quarterly"num_periods=8 - 需要获取8个季度(而非4个)的数据,才能计算同比增长率(例如计算2025年第三季度的同比数据需要2024年第三季度的数据,即往前数第5个季度)。如果API响应中没有上年同期的分部数据,不要估算或编造数据,在报告中注明“同比数据不可用”。
立即写入 :
/tmp/earnings-preview/segments.csvticker,period,segment_name,revenue,source
D,Q3 2024,Dominion Energy Virginia,2762000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2024,Dominion Energy South Carolina,848000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2024,Contracted Energy,260000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Dominion Energy Virginia,3311000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Dominion Energy South Carolina,945000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Contracted Energy,297000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
...业绩历史(用于股价图表标注):
- 调用——收集12个月股价窗口内的过往业绩发布日期。
get_earnings_from_identifiers - 立即写入 :
/tmp/earnings-preview/earnings-dates.csv
ticker,earnings_date,call_name,source
D,2025-05-02,Q1 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
D,2025-08-01,Q2 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
D,2025-10-31,Q3 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
...Phase 6: Verification & Calculations (MANDATORY — DO NOT SKIP)
阶段6:验证与计算(强制要求——不要跳过)
Before generating the report, read back ALL intermediate files and perform calculations from the clean data. This phase ensures data integrity by working from files rather than compressed conversation context.
-
Read all intermediate files using bashcommands:
catcat /tmp/earnings-preview/company-info.txtcat /tmp/earnings-preview/transcript-extracts.txtcat /tmp/earnings-preview/financials.csvcat /tmp/earnings-preview/segments.csvcat /tmp/earnings-preview/prices.csvcat /tmp/earnings-preview/peer-eps.csvcat /tmp/earnings-preview/peer-market-caps.csvcat /tmp/earnings-preview/consensus-eps.csvcat /tmp/earnings-preview/kensho-findings.txtcat /tmp/earnings-preview/earnings-dates.csv
-
Calculate derived metrics from the raw data now in context:
- Gross margin % = gross_profit / revenue (per quarter)
- Operating margin % = operating_income / revenue (per quarter)
- Revenue y/y growth % = (current Q revenue - year-ago Q revenue) / year-ago Q revenue
- EPS y/y growth % = same logic; use "n.m." if base is negative
- Segment y/y growth % = match segment by name to year-ago Q; if missing, note "y/y not available"
- LTM P/E per company = latest price / sum of most recent 4 quarterly EPS (check which 4 quarters are available per ticker using )
peer-eps.csv - NTM P/E per company = latest price / NTM EPS, where NTM EPS = sum of the next 4 quarterly consensus mean EPS estimates from . Add all 4 quarters' consensus_mean_eps values for each ticker. If fewer than 4 forward quarters are available for a peer, mark NTM P/E as "n/a". Note in the appendix which 4 quarters were summed.
consensus-eps.csv - Stock returns (YTD, 1-yr, 30d, 90d) = find the common first date across all tickers in , then compute returns from that date
prices.csv
-
Cross-check:
- Verify every segment y/y has the actual prior-year row in . If not, mark "y/y not available."
segments.csv - Verify all stock return base dates are identical across tickers.
- Verify any multi-step calculation by re-summing components (e.g., LTM EPS sum matches the 4 quarterly values).
- Verify all verbatim quotes in are exact copy-pastes (not paraphrases).
transcript-extracts.txt
- Verify every segment y/y has the actual prior-year row in
-
Writewith all derived values:
/tmp/earnings-preview/calculations.csv
ticker,metric,value,formula,components
D,gross_margin_Q3_2025,32.5%,gross_profit/revenue,"gross_profit=1238100000,revenue=3810000000"
D,revenue_yoy_Q3_2025,+9.3%,(Q3_2025-Q3_2024)/Q3_2024,"Q3_2025=3810000000,Q3_2024=3486000000"
D,ltm_pe,24.2x,price/ltm_eps,"price=65.46,ltm_eps=2.70,quarters=Q4_2024+Q1_2025+Q2_2025+Q3_2025"
D,ntm_pe,18.5x,price/ntm_eps,"price=65.46,ntm_eps=3.56,quarters=Q4_2025(0.88)+Q1_2026(0.72)+Q2_2026(0.91)+Q3_2026(1.05),source=get_consensus_estimates_from_identifiers"
D,yoy_return,+17.6%,(end-start)/start,"end=65.46,start=55.67,base_date=2025-02-19"
DUK,yoy_return,+13.0%,(end-start)/start,"end=126.32,start=111.79,base_date=2025-02-19"
...This file becomes the single source of truth for all numbers in the report.
生成报告前,读取所有中间文件,基于干净的数据进行计算。本阶段基于文件而非压缩后的对话上下文处理数据,确保数据完整性。
-
使用bash命令读取所有中间文件:
catcat /tmp/earnings-preview/company-info.txtcat /tmp/earnings-preview/transcript-extracts.txtcat /tmp/earnings-preview/financials.csvcat /tmp/earnings-preview/segments.csvcat /tmp/earnings-preview/prices.csvcat /tmp/earnings-preview/peer-eps.csvcat /tmp/earnings-preview/peer-market-caps.csvcat /tmp/earnings-preview/consensus-eps.csvcat /tmp/earnings-preview/kensho-findings.txtcat /tmp/earnings-preview/earnings-dates.csv
-
基于当前上下文中的原始数据计算衍生指标:
- 毛利率% = 毛利润 / 营收(每季度)
- 经营利润率% = 经营利润 / 营收(每季度)
- 营收同比增长率% =(当季营收 - 上年同期营收)/ 上年同期营收
- EPS同比增长率% = 相同逻辑;如果基数为负则标注“n.m.”
- 分部营收同比增长率% = 按分部名称匹配上年同期数据;如果数据缺失则注明“同比数据不可用”
- 每家公司的LTM市盈率 = 最新股价 / 最近4个季度EPS之和(使用核对每家公司可用的4个季度)
peer-eps.csv - 每家公司的NTM市盈率 = 最新股价 / NTM EPS,其中NTM EPS = 中未来4个季度共识EPS预期均值之和。将每家公司的4个季度
consensus-eps.csv值相加,如果某家同行的未来季度可用数据少于4个,则将NTM市盈率标注为“n/a”。在附录中说明相加的4个季度。consensus_mean_eps - 股价回报(YTD、1年、30天、90天)= 找出中所有公司共同的最早日期,基于该日期计算回报
prices.csv
-
交叉核验:
- 核验每个分部同比数据在中都有对应的上年同期行,如果没有则标注“同比数据不可用”。
segments.csv - 核验所有公司的股价回报基准日期完全一致。
- 通过重新求和组成项核验所有多步计算(例如LTM EPS总和与4个季度值匹配)。
- 核验中的所有逐字引用都是完全复制的内容(而非转述)。
transcript-extracts.txt
- 核验每个分部同比数据在
-
写入,包含所有衍生值:
/tmp/earnings-preview/calculations.csv
ticker,metric,value,formula,components
D,gross_margin_Q3_2025,32.5%,gross_profit/revenue,"gross_profit=1238100000,revenue=3810000000"
D,revenue_yoy_Q3_2025,+9.3%,(Q3_2025-Q3_2024)/Q3_2024,"Q3_2025=3810000000,Q3_2024=3486000000"
D,ltm_pe,24.2x,price/ltm_eps,"price=65.46,ltm_eps=2.70,quarters=Q4_2024+Q1_2025+Q2_2025+Q3_2025"
D,ntm_pe,18.5x,price/ntm_eps,"price=65.46,ntm_eps=3.56,quarters=Q4_2025(0.88)+Q1_2026(0.72)+Q2_2026(0.91)+Q3_2026(1.05),source=get_consensus_estimates_from_identifiers"
D,yoy_return,+17.6%,(end-start)/start,"end=65.46,start=55.67,base_date=2025-02-19"
DUK,yoy_return,+13.0%,(end-start)/start,"end=126.32,start=111.79,base_date=2025-02-19"
...该文件将成为报告中所有数字的唯一可信来源。
Phase 7: Generate the HTML Report
阶段7:生成HTML报告
STOP — BEFORE WRITING ANY HTML, YOU MUST READ ALL INTERMEDIATE FILES. THIS IS A BLOCKING PREREQUISITE.
This is not optional. You MUST run each command below as a separate bash tool call (not combined into one). This ensures each file's contents are individually loaded and visible in the conversation. Do NOT combine them into a single command. Do NOT skip any file.
catRun these commands one at a time, each as its own bash call:
cat /tmp/earnings-preview/company-info.txtcat /tmp/earnings-preview/transcript-extracts.txtcat /tmp/earnings-preview/financials.csvcat /tmp/earnings-preview/segments.csvcat /tmp/earnings-preview/prices.csvcat /tmp/earnings-preview/peer-eps.csvcat /tmp/earnings-preview/peer-market-caps.csvcat /tmp/earnings-preview/consensus-eps.csvcat /tmp/earnings-preview/kensho-findings.txtcat /tmp/earnings-preview/earnings-dates.csvcat /tmp/earnings-preview/calculations.csv
After reading ALL files, you MUST print a summary message to the user that lists every file and its status. Use exactly this format:
--- DATA FILE VERIFICATION ---
1. company-info.txt ✓ loaded ([N] lines)
2. transcript-extracts.txt ✓ loaded ([N] lines)
3. financials.csv ✓ loaded ([N] rows)
4. segments.csv ✓ loaded ([N] rows)
5. prices.csv ✓ loaded ([N] rows)
6. peer-eps.csv ✓ loaded ([N] rows)
7. peer-market-caps.csv ✓ loaded ([N] rows)
8. consensus-eps.csv ✓ loaded ([N] rows)
9. kensho-findings.txt ✓ loaded ([N] lines)
10. earnings-dates.csv ✓ loaded ([N] rows)
11. calculations.csv ✓ loaded ([N] rows)
All intermediate data files loaded successfully.
Generating report using file data as the single source of truth.
---If any file is missing or empty, STOP and tell the user which file failed. Do NOT proceed to generate the report with missing data.
Every number, quote, source URL, and MCP function call reference in the HTML report must come from these files — not from your memory of earlier conversation turns. The files are the single source of truth. Earlier conversation context may have been compressed or summarized and WILL contain errors if relied upon. If a data point is not in the files, it should not appear in the report.
See report-template.md for the complete HTML template, CSS, and Chart.js configuration.
MANDATORY — Use Template Helper Functions for Charts:
The report-template.md provides pre-built, debugged Chart.js helper functions. You MUST use these exact functions to create charts. Do NOT write custom inline Chart.js code. The helpers are:
- — for Figure 1
createRevEpsChart(canvasId, labels, revenueData, epsData, revLabel) - — for Figure 2
createMarginChart(canvasId, labels, grossMargins, opMargins) - — for Figure 3
createRevGrowthChart(canvasId, labels, growthData) - — for Figure 5
createAnnotatedPriceChart(canvasId, labels, prices, earningsDates, ticker) - — for Figure 6
createCompPerfChart(canvasId, labels, datasets) - — for Figure 7
createPEChart(canvasId, companies)
Each chart call MUST be in its own tag wrapped in a try-catch block. This ensures a bug in one chart does not prevent other charts from rendering. Example:
<script>html
<script>
try {
createRevEpsChart('chart-rev-eps', [...], [...], [...], 'Revenue ($B)');
} catch(e) { console.error('Figure 1 error:', e); }
</script>
<script>
try {
createMarginChart('chart-margins', [...], [...], [...]);
} catch(e) { console.error('Figure 2 error:', e); }
</script>停止操作——在编写任何HTML内容前,你必须读取所有中间文件,该要求为前置必要条件。
该要求为强制项,你必须将以下每个命令作为独立的bash工具调用运行(不要合并为一个命令),确保每个文件的内容都被单独加载并在对话中可见,不要合并命令,不要遗漏任何文件。
cat依次运行以下命令,每个命令单独作为一次bash调用:
cat /tmp/earnings-preview/company-info.txtcat /tmp/earnings-preview/transcript-extracts.txtcat /tmp/earnings-preview/financials.csvcat /tmp/earnings-preview/segments.csvcat /tmp/earnings-preview/prices.csvcat /tmp/earnings-preview/peer-eps.csvcat /tmp/earnings-preview/peer-market-caps.csvcat /tmp/earnings-preview/consensus-eps.csvcat /tmp/earnings-preview/kensho-findings.txtcat /tmp/earnings-preview/earnings-dates.csvcat /tmp/earnings-preview/calculations.csv
读取所有文件后,你必须向用户输出一条摘要消息,列出每个文件及其状态,严格使用以下格式:
--- 数据文件核验 ---
1. company-info.txt ✓ 已加载 ([N] 行)
2. transcript-extracts.txt ✓ 已加载 ([N] 行)
3. financials.csv ✓ 已加载 ([N] 行)
4. segments.csv ✓ 已加载 ([N] 行)
5. prices.csv ✓ 已加载 ([N] 行)
6. peer-eps.csv ✓ 已加载 ([N] 行)
7. peer-market-caps.csv ✓ 已加载 ([N] 行)
8. consensus-eps.csv ✓ 已加载 ([N] 行)
9. kensho-findings.txt ✓ 已加载 ([N] 行)
10. earnings-dates.csv ✓ 已加载 ([N] 行)
11. calculations.csv ✓ 已加载 ([N] 行)
所有中间数据文件加载成功。
使用文件数据作为唯一可信来源生成报告。
---如果任何文件缺失或为空,停止操作并告知用户哪个文件加载失败,不要在数据缺失的情况下继续生成报告。
HTML报告中的所有数字、引用、来源URL、MCP函数调用引用都必须来自这些文件——而非你对之前对话轮次的记忆。 文件是唯一可信来源,之前的对话上下文可能已被压缩或摘要,依赖上下文一定会导致错误。如果某个数据点不在文件中,就不应该出现在报告里。
完整的HTML模板、CSS和Chart.js配置请参考 report-template.md。
强制要求——使用模板辅助函数生成图表:
report-template.md提供了预构建、已调试的Chart.js辅助函数,你必须使用这些 exact 函数创建图表,不要编写自定义内联Chart.js代码。辅助函数包括:
- —— 用于图1
createRevEpsChart(canvasId, labels, revenueData, epsData, revLabel) - —— 用于图2
createMarginChart(canvasId, labels, grossMargins, opMargins) - —— 用于图3
createRevGrowthChart(canvasId, labels, growthData) - —— 用于图5
createAnnotatedPriceChart(canvasId, labels, prices, earningsDates, ticker) - —— 用于图6
createCompPerfChart(canvasId, labels, datasets) - —— 用于图7
createPEChart(canvasId, companies)
每个图表调用必须放在独立的标签中,并用try-catch块包裹,确保单个图表的错误不会影响其他图表渲染。示例:
<script>html
<script>
try {
createRevEpsChart('chart-rev-eps', [...], [...], [...], 'Revenue ($B)');
} catch(e) { console.error('Figure 1 error:', e); }
</script>
<script>
try {
createMarginChart('chart-margins', [...], [...], [...]);
} catch(e) { console.error('Figure 2 error:', e); }
</script>Report Structure (4-5 pages total)
报告结构(总计4-5页)
The report has two halves: narrative (pages 1-2) and figures (pages 3-5). Keep these tightly integrated.
AI DISCLAIMER (MANDATORY — must appear in 3 places):
You MUST include the following disclaimer text in the report HTML. This is not optional — the report is incomplete without it:
"Analysis is AI-generated — please confirm all outputs"
It must appear in exactly these 3 locations:
- Header banner — immediately before the cover header, as a centered yellow banner:
<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div> - Footer — inside the page-footer div, as a prominent yellow banner:
<div class="footer-disclaimer">Analysis is AI-generated — please confirm all outputs</div> - Appendix — as the first line of the appendix section, before the table:
<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div>
PAGE 1: Cover & Thesis
- AI disclaimer banner (yellow, centered — see AI DISCLAIMER rule above)
- Header: Company name (TICKER) | Industry | Report date
- Title: Thematic, specific to the quarter (e.g., "Walmart Inc. (WMT) Q4 FY2026 Earnings Preview: Holiday Harvest — Can Furner's First Print Confirm the $1T Thesis?")
- Executive thesis (2-3 short paragraphs max with bullet points):
- What we expect from this print in 1-2 sentences
- 4-6 bullet points covering: our EPS estimate vs consensus, guidance expectations, key metrics to watch, what would move the stock, key debates
- Keep it direct and opinionated — take a view, don't hedge everything
- Key management quotes from the most recent earnings call woven into the narrative where relevant. Do NOT put these under a separate heading. Integrate them naturally as supporting evidence for your thesis points. Format as indented blockquotes.
PAGE 2: Estimates, Themes & News
-
Consensus Estimates Table (single table, labeled as a figure):
- Columns: Metric | Consensus | Our Estimate | y/y Change
- Rows: Revenue, EPS, Gross Margin, Operating Income, and 2-3 company-specific KPIs that matter (e.g., comp sales, eComm growth, membership revenue — whatever the Street cares about for THIS company)
- Color-coding is strictly mechanical: If the y/y change value is negative, use (red). If positive, use
class="neg"(green). If zero or N/A, useclass="pos". The sign of the number determines the class — do NOT override based on interpretation. A -1.1% is ALWAYS red, even if the decline is small.class="neutral" - This is the ONLY guidance/estimates section. Do not repeat estimate data elsewhere.
-
Key Metrics Beyond Headline EPS (bulleted list, 3-5 items):
- The specific metrics that will determine if this is a good or bad quarter beyond the EPS number
- For each: what the metric is, what consensus/management expects, why it matters
- Be specific: "Walmart Connect ad revenue growth (consensus ~30% y/y, 3Q was 33%)"
-
Themes to Watch (3-5 bullets):
- Forward-looking items for the upcoming report
- What management needs to deliver on, what could surprise, what the bears are focused on
- Each theme: 1-2 sentences max
-
Recent News & Developments (3-5 bullets):
- Material news from the last 60 days, one line each
- Date + headline + brief impact assessment
- Only include items that could affect the upcoming print or guidance
PAGES 3-5: Figures (all charts and tables)
All figures are numbered sequentially. Every figure has a title and source line.
- Figure 1: Quarterly Revenue & Diluted EPS — Bar/line combo, 8 quarters
- Figure 2: Margin Trends (Gross & Operating %) — Dual line chart, 8 quarters
- Figure 3: Revenue Growth y/y % — Bar chart with green/red conditional coloring. Only include quarters where both current and year-ago data exist (typically the most recent 4 quarters from the 8 fetched). Do NOT include quarters where y/y cannot be computed — the chart should have 4 bars, not 8.
- Figure 4: Business Segment Revenue — Table: Segment | Latest Q Rev ($M) | % of Total | y/y Change
- Figure 5: 1-Year Stock Price with Earnings Dates — Price line with vertical annotation lines at earnings dates, labeled with quarter and 1-day post-earnings move
- Figure 6: Stock Performance vs. Competitors (Indexed to 100) — Multi-line chart, subject company as thick solid line, competitors as thinner dashed lines
- Figure 7: LTM P/E vs. Competitors — Horizontal bar chart, subject company highlighted in navy
- Figure 8: Competitor Comparison Table — Ticker | Company | Mkt Cap | LTM P/E | NTM P/E | YTD % | 1-Yr %
APPENDIX: Data Sources & Calculations (MANDATORY — DO NOT SKIP OR ABBREVIATE)
The appendix MUST begin with the AI disclaimer banner:
<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div>The final page(s) of the report MUST include an Appendix table that documents every claim — numeric and non-numeric — cited in the report. Every number that appears in the report body must have a corresponding row in this appendix, and every such number in the report body must be a clickable hyperlink that scrolls to its appendix row. If a number appears in the report without a hyperlink to the appendix, the report is incomplete.
<a href="#ref-N">-
Table columns: Ref # | Fact | Value | Source & Derivation
-
Ref #: Sequential ID matching the hyperlink anchors in the report body (,
ref-1, etc.). Each row has anref-2attribute so hyperlinks scroll to it.id="ref-N" -
Fact: Human-readable label (e.g., "Q3 FY2026 Revenue", "LTM P/E — WMT", "Management flagged tariff headwinds", "Barclays upgraded to Overweight")
-
Value: The exact figure as displayed in the report (e.g., "$152.3B", "24.5%", "28.1x"). For non-numeric facts, leave blank or write "N/A".
-
Source & Derivation: This is the critical column. Every row must have a specific, detailed source — not just a label. Follow these rules strictly:For raw financial data from S&P Capital IQ (revenue, EPS, gross profit, operating income, net income, EBITDA, prices, market cap, etc.):
- State the MCP function used and its key parameters. Format:
S&P Capital IQ — [function_name](identifier='[TICKER]', line_item='[item]', period_type='[type]', period='[Q# FY####]') - Examples:
S&P Capital IQ — get_financial_line_item_from_identifiers(identifier='WMT', line_item='revenue', period_type='quarterly', period='Q3 FY2026')S&P Capital IQ — get_financial_line_item_from_identifiers(identifier='WMT', line_item='diluted_eps', period_type='quarterly', period='Q3 FY2026')S&P Capital IQ — get_prices_from_identifiers(identifier='WMT', periodicity='day')S&P Capital IQ — get_capitalization_from_identifiers(identifier='WMT', capitalization='market_cap')
- Do NOT just write "S&P Capital IQ" with no detail. The reader must know exactly which data point from which tool call produced this number.
For calculated values (margins, growth rates, P/E, returns, y/y changes):- Show the full formula with hyperlinked components — each component must be an link back to the appendix row for that raw data point. This is critical: the reader must be able to click through from the calculated value to each of its inputs.
<a href="#ref-N"> - Example:
Gross Margin = <a href='#ref-5'>Gross Profit $37.2B</a> / <a href='#ref-1'>Revenue $152.3B</a> = 24.4%. Source: S&P Capital IQ (calculated) - Example:
LTM P/E = <a href='#ref-20'>Price $172.35</a> / (<a href='#ref-8'>Q1 EPS $1.47</a> + <a href='#ref-9'>Q2 EPS $1.84</a> + <a href='#ref-10'>Q3 EPS $1.53</a> + <a href='#ref-11'>Q4 EPS $1.80</a>) = $172.35 / $6.64 = 25.9x - Example:
Revenue y/y growth = (<a href='#ref-12'>Q3 FY26 Rev $165.8B</a> - <a href='#ref-3'>Q3 FY25 Rev $160.8B</a>) / <a href='#ref-3'>Q3 FY25 Rev $160.8B</a> = +3.1% - Every formula component must be a clickable hyperlink. Do NOT write formulas with plain-text numbers.
For transcript-sourced claims (quotes, management commentary, guidance):- Write the verbatim excerpt sentence from the transcript.
- Reference the transcript by its full name and the used to fetch it.
key_dev_id - Format:
"[verbatim quote]" — [Speaker], [Title]. Source: [Q# FY#### Earnings Call Transcript] (key_dev_id: [ID]) - Example:
"We expect comp sales growth of 3-4% in Q4" — CEO John Furner. Source: Q3 FY2026 Earnings Call Transcript (key_dev_id: 12345678)
For Kensho Grounding search results (news, analyst ratings, consensus estimates):- Write the key finding or excerpt from the search result.
- MANDATORY: Include the source URL returned by the Kensho tool as a clickable
searchhyperlink. This is the most important part — readers must be able to click through to the original source.<a href="[URL]" target="_blank"> - Format:
"[finding/excerpt]" — <a href="[URL]" target="_blank">[Source Title or Publication]</a>. Query: search("[query used]") - Example:
"Barclays upgraded WMT to Overweight with $210 price target on Jan 15, 2026." — <a href="https://www.investing.com/news/barclays-upgrades-wmt" target="_blank">Investing.com, Jan 15 2026</a>. Query: search("WMT analyst ratings price target upgrades downgrades") - If no URL was returned for a particular result, write "Source URL not available" and still include the search query.
- State the MCP function used and its key parameters. Format:
Completeness check: Before finalizing the report, scan every number in the report body. If any number is not wrapped in , fix it. If any appendix row has a Source & Derivation that is just a bare label like "S&P Capital IQ" with no function call detail, fix it. If any calculated value's formula lacks hyperlinked components, fix it. If any Kensho-sourced claim lacks a source URL, fix it.
<a href="#ref-N" class="data-ref">Group the appendix rows by section (Financials, Valuation, Estimates & Consensus, Transcript Claims, News & Analyst Commentary, Stock Performance) with subheadings. Use smaller font size (10-11px).
报告分为两部分:叙事内容(第1-2页)和图表内容(第3-5页),两部分需紧密关联。
AI免责声明(强制要求——必须在3个位置出现):
你必须在报告HTML中包含以下免责声明文本,该要求为强制项,缺失则报告不完整:
"Analysis is AI-generated — please confirm all outputs"
必须在以下3个 exact 位置出现:
- 头部横幅——紧邻封面标题前,作为居中的黄色横幅:
<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div> - 页脚——位于page-footer div内部,作为醒目的黄色横幅:
<div class="footer-disclaimer">Analysis is AI-generated — please confirm all outputs</div> - 附录——作为附录章节的第一行,位于表格前:
<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div>
第1页:封面与核心观点
- AI免责声明横幅(黄色、居中——参见上述AI免责声明规则)
- 头部:公司名称(股票代码) | 所属行业 | 报告日期
- 标题:紧扣当季主题,具体明确(例如“沃尔玛(WMT)2026财年第四季度业绩预告:假日收获——Furner的首份财报能否验证万亿市值逻辑?”)
- 执行观点(最多2-3个短段落,搭配要点列表):
- 用1-2句话说明我们对本次财报的预期
- 4-6个要点,涵盖:我们的EPS预期 vs 共识预期、指引预期、需要关注的核心指标、影响股价的关键因素、核心争议点
- 内容直接、观点明确,给出明确判断,不要模棱两可
- 将最近一次财报电话会议中的核心管理层引用自然融入叙事的相关位置,不要单独设置“核心管理层引用”标题,将其作为支撑你观点的证据自然呈现,使用缩进块引用格式。
第2页:预期、主题与新闻
-
共识预期表(单个表格,标注为图表):
- 列:指标 | 共识预期 | 我们的预期 | 同比变动
- 行:营收、EPS、毛利率、经营利润,以及2-3个公司特有的核心KPI(例如同店销售、电商增长、会员收入——任何市场关注的该公司特有指标)
- 颜色编码严格按规则执行: 如果同比变动值为负,使用(红色);如果为正,使用
class="neg"(绿色);如果为零或不可用,使用class="pos"。数值的符号决定使用的类,不要根据主观解读调整,-1.1% 无论跌幅多小都必须标红。class="neutral" - 这是唯一的指引/预期板块,不要在其他位置重复预期数据。
-
超出EPS核心指标(要点列表,3-5项):
- 除了EPS数值外,决定本季度财报表现好坏的具体指标
- 每个指标说明:指标是什么、共识/管理层预期是多少、为什么重要
- 表述要具体:“沃尔玛Connect广告收入增长(共识预期同比~30%,第三季度为33%)”
-
需关注的主题(3-5个要点):
- 本次报告的前瞻事项
- 管理层需要交付的成果、可能的超预期点、空头关注的问题
- 每个主题最多1-2句话
-
近期新闻与动态(3-5个要点):
- 过去60天的重大新闻,每条一行
- 日期 + 标题 + 简要影响评估
- 仅包含可能影响本次财报或指引的内容
第3-5页:图表(所有图表和表格)
所有图表按顺序编号,每个图表都有标题和来源行。
- 图1:季度营收与摊薄EPS——柱形/折线组合图,8个季度数据
- 图2:利润率趋势(毛利率与经营利润率%)——双折线图,8个季度数据
- 图3:营收同比增长率%——带绿/红条件着色的柱形图。仅包含当期和上年同期数据都存在的季度(通常是获取的8个季度中最近的4个季度),不要包含无法计算同比的季度——图表应该有4个柱形,而非8个。
- 图4:业务分部营收——表格:分部 | 最新季度营收(百万美元) | 占总营收比例 | 同比变动
- 图5:1年股价走势与财报日期标注——股价折线,财报日期处标注垂直注释线,标注对应财季和财报发布后1日涨跌幅
- 图6:股价表现 vs 竞争对手(基准值100)——多折线图,目标公司为粗实线,竞争对手为细虚线
- 图7:LTM市盈率 vs 竞争对手——横向柱形图,目标公司用藏青色高亮
- 图8:竞争对手对比表——股票代码 | 公司 | 市值 | LTM市盈率 | NTM市盈率 | YTD涨跌幅% | 1年涨跌幅%
附录:数据来源与计算说明(强制要求——不要跳过或简化)
附录必须以AI免责声明横幅开头:
<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div>报告的最后页面必须包含附录表格,记录报告中引用的每一项声明——包括数值类和非数值类。报告正文中出现的所有数字都必须在附录中有对应行,且正文中的所有数字都必须是可点击的超链接,点击后滚动到对应附录行。 如果报告中的数字没有指向附录的超链接,则报告不完整。
<a href="#ref-N">-
表格列:引用编号 | 事实 | 数值 | 来源与推导过程
-
引用编号:与报告正文中的超链接锚点匹配的连续ID(、
ref-1等),每行都有ref-2属性,便于超链接滚动定位。id="ref-N" -
事实:人类可读的标签(例如“2026财年第三季度营收”、“WMT的LTM市盈率”、“管理层指出关税逆风影响”、“巴克莱上调评级至超配”)
-
数值:报告中展示的 exact 数值(例如“$152.3B”、“24.5%”、“28.1x”),非数值类事实可留空或写“N/A”。
-
来源与推导过程:这是核心列,每行都必须有具体、详细的来源,不能仅标注分类。 严格遵循以下规则:来自标普资本IQ的原始财务数据(营收、EPS、毛利润、经营利润、净利润、EBITDA、股价、市值等):
- 说明使用的MCP函数和核心参数,格式:
S&P Capital IQ — [function_name](identifier='[股票代码]', line_item='[指标]', period_type='[类型]', period='[Q# FY####]') - 示例:
S&P Capital IQ — get_financial_line_item_from_identifiers(identifier='WMT', line_item='revenue', period_type='quarterly', period='Q3 FY2026')S&P Capital IQ — get_financial_line_item_from_identifiers(identifier='WMT', line_item='diluted_eps', period_type='quarterly', period='Q3 FY2026')S&P Capital IQ — get_prices_from_identifiers(identifier='WMT', periodicity='day')S&P Capital IQ — get_capitalization_from_identifiers(identifier='WMT', capitalization='market_cap')
- 不要仅写“S&P Capital IQ”而无细节,读者必须明确知道是哪次工具调用返回的哪个数据点生成了该数值。
计算得到的数值(利润率、增长率、市盈率、回报、同比变动等):- 展示完整公式,每个组成项都要加超链接——每个组成项都必须是链接,指向对应原始数据点的附录行。该要求非常重要:读者必须能够从计算值点击溯源到每个输入项。
<a href="#ref-N"> - 示例:
毛利率 = <a href='#ref-5'>毛利润 $37.2B</a> / <a href='#ref-1'>营收 $152.3B</a> = 24.4%。来源:S&P Capital IQ(计算所得) - 示例:
LTM市盈率 = <a href='#ref-20'>股价 $172.35</a> / (<a href='#ref-8'>第一季度EPS $1.47</a> + <a href='#ref-9'>第二季度EPS $1.84</a> + <a href='#ref-10'>第三季度EPS $1.53</a> + <a href='#ref-11'>第四季度EPS $1.80</a>) = $172.35 / $6.64 = 25.9x - 示例:
营收同比增长率 = (<a href='#ref-12'>2026财年第三季度营收 $165.8B</a> - <a href='#ref-3'>2025财年第三季度营收 $160.8B</a>) / <a href='#ref-3'>2025财年第三季度营收 $160.8B</a> = +3.1% - 每个公式组成项都必须是可点击的超链接,不要用纯文本数字写公式。
来自会议记录的声明(引用、管理层评论、指引):- 写出会议记录中的逐字摘录句子。
- 引用会议记录的全称和用于获取该记录的。
key_dev_id - 格式:
"[逐字引用]" —— [发言人], [职位]。来源:[Q# FY#### 财报电话会议记录] (key_dev_id: [ID]) - 示例:
"我们预计第四季度同店销售增长3-4%" —— CEO John Furner。来源:2026财年第三季度财报电话会议记录 (key_dev_id: 12345678)
来自Kensho Grounding搜索结果的内容(新闻、分析师评级、共识预期):- 写出搜索结果中的关键发现或摘要。
- 强制要求:包含Kensho 工具返回的来源URL,作为可点击的
search超链接。这是最重要的部分,读者必须能够点击跳转至原始来源。<a href="[URL]" target="_blank"> - 格式:
"[发现/摘要]" —— <a href="[URL]" target="_blank">[来源标题或出版物]</a>。查询:search("[使用的查询词]") - 示例:
"巴克莱于2026年1月15日将WMT评级上调至超配,目标价210美元。" —— <a href="https://www.investing.com/news/barclays-upgrades-wmt" target="_blank">Investing.com, 2026年1月15日</a>。查询:search("WMT analyst ratings price target upgrades downgrades") - 如果某个结果没有返回URL,写“来源URL不可用”,仍需包含搜索查询词。
- 说明使用的MCP函数和核心参数,格式:
完整性检查: 最终确定报告前,扫描报告正文中的所有数字,如果有任何数字没有包裹在标签中,修正该问题。如果任何附录行的“来源与推导过程”仅为类似“S&P Capital IQ”的空泛标注而无函数调用细节,修正该问题。如果任何计算值的公式缺少带超链接的组成项,修正该问题。如果任何来自Kensho的声明缺少来源URL,修正该问题。
<a href="#ref-N" class="data-ref">将附录行按板块分组(财务数据、估值、预期与共识、会议记录声明、新闻与分析师评论、股价表现),添加子标题,使用较小字号(10-11px)。
Phase 8: Output
阶段8:输出
- Write the complete HTML file to in the current working directory.
earnings-preview-[TICKER]-YYYY-MM-DD.html - Open it in the browser:
open earnings-preview-[TICKER]-YYYY-MM-DD.html - Tell the user the file has been created and summarize the key findings.
- 将完整的HTML文件写入当前工作目录的。
earnings-preview-[股票代码]-YYYY-MM-DD.html - 在浏览器中打开该文件:
open earnings-preview-[股票代码]-YYYY-MM-DD.html - 告知用户文件已创建,并总结核心发现。
Writing Guidelines
写作规范
- NO EMOJIS: Do not use any emojis anywhere in the report. This is a professional research document.
- CONCISE: Target 4-5 printed pages. Every sentence must carry weight. Use bullets, not paragraphs, wherever possible. If a section feels long, cut it.
- Be specific with numbers: "$52.4B revenue, up 5.2% y/y" not "strong revenue growth."
- Take a view: This is an earnings preview, not a summary. State what you expect, what matters, and why. Be opinionated but back it with data.
- Management quotes without headers: Weave 3-4 key management quotes from the most recent call directly into the narrative as blockquotes. Do not create a "Key Management Quotes" section heading — let them flow naturally as supporting evidence.
- Professional tone: Sell-side equity research style — analytical, direct, data-driven.
- Charts must use real data: Every chart populated with actual MCP data. Never fabricate.
- Competitor context: Frame valuation relative to peers. A 25x P/E means nothing without knowing peers trade at 20x or 35x.
- Hyperlinked claims: Every factual claim — numeric or qualitative — must be an tag linking to its appendix entry. Numbers:
<a class="data-ref">. Qualitative:<a href="#ref-1" class="data-ref">$152.3B</a>. No fact should appear without a traceable source in the appendix.<a href="#ref-25" class="data-ref">management flagged tariff headwinds as the primary margin risk</a>
- 禁止使用表情符号:报告的任何位置都不要使用表情符号,本报告为专业研究文档。
- 精简:打印篇幅目标为4-5页,每句话都要有价值,尽可能使用要点列表而非段落,如果某个板块篇幅过长,删减内容。
- 数字表述具体:写“营收524亿美元,同比增长5.2%”,不要写“营收增长强劲”。
- 观点明确:本报告为业绩预告,而非摘要,明确说明你的预期、核心关注点和背后逻辑,观点鲜明但要有数据支撑。
- 管理层引用无需单独设置标题:将最近一次会议中的3-4条核心管理层引用作为块引用直接融入叙事,不要创建“核心管理层引用”的章节标题,让引用作为支撑证据自然呈现。
- 专业语气:采用卖方股权研究风格——分析性、直接、数据驱动。
- 图表必须使用真实数据:所有图表都使用MCP返回的真实数据填充,绝对不要编造数据。
- 竞争对手对比:估值要结合同行背景说明,脱离同行20x或35x的市盈率水平,25x的市盈率没有意义。
- 声明加超链接:所有事实声明——无论是数值类还是定性类——都必须用标签链接到对应附录条目。数字示例:
<a class="data-ref">。定性内容示例:<a href="#ref-1" class="data-ref">$152.3B</a>。所有事实都必须在附录中有可追溯的来源。<a href="#ref-25" class="data-ref">管理层指出关税逆风是主要的利润率风险</a>