Imported from arjundrath-star/klade-analyst (
clients/_archived/reid/skills/earnings-preview/SKILL.md). Install upstream withnpx skills add arjundrath-star/klade-analyst --skill earnings-preview. Copyright stays with the author.
earnings-preview
Generate a comprehensive pre-earnings briefing that prepares the team for an upcoming earnings release. This isn't a consensus summary — it's a framework for what to listen for, where surprises might come from, and how to position. An MD should read this 30 minutes before the call and know exactly what matters.
Trigger
- "Earnings preview for [TICKER]"
- "What to expect from [COMPANY] earnings"
- "Pre-earnings analysis [TICKER]"
- "[TICKER] reports [DATE] — what are we watching?"
- "Set up the earnings for [COMPANY]"
- "Key metrics to watch for [TICKER] Q[X]"
Inputs
- Company: ticker or name (required)
- Quarter: Q1/Q2/Q3/Q4 and fiscal year (default: next reporting quarter)
- Report date: expected earnings date (if known; otherwise look up)
- Focus: full preview / beat-miss model / positioning only (default: full)
- Client context: long / short / no position / considering entry (default: no position)
Dependencies
- financial-data-api — data source stack
- sec-edgar-fetch — prior quarter filings for trend analysis
- company-brief — company context if not already familiar
⚠️ DATA SOURCING MANDATE (NON-NEGOTIABLE)
-
SEC EDGAR XBRL (PRIMARY for historical actuals):
- Prior 8 quarters of actual results for beat/miss pattern analysis
- Segment-level historical data for granular estimates
web_fetch("https://data.sec.gov/api/xbrl/companyfacts/CIK{CIK_PADDED_10}.json")
-
Massive.com API (for price data and options-implied move):
- Current stock price, 52-week range
- Pre-earnings price action (momentum into the print)
web_fetch("https://api.massive.com/v2/aggs/ticker/{TICKER}/prev?apiKey=${MASSIVE_API_KEY}")
-
web_search (PRIMARY for consensus estimates and qualitative intelligence):
- Consensus revenue, EPS, and KPI estimates
- Analyst revisions (direction and magnitude)
- Management guidance from prior quarter
- Channel checks, supply chain signals, industry data points
- Options-implied move from straddle pricing
- ALWAYS attribute consensus source: FactSet, Bloomberg, Visible Alpha, LSEG
-
FRED API (for macro context affecting the quarter):
- Relevant macro indicators that impacted the reporting period
Data Sourcing Fallback (When APIs Unavailable)
When primary APIs (Massive.com, EDGAR XBRL) return errors, rate-limit, or lack coverage for the ticker:
-
Consensus Estimates Fallback Stack:
- Visible Alpha →
web_search("[TICKER] Visible Alpha consensus estimates")— most granular segment-level estimates - Seeking Alpha →
web_fetch("https://seekingalpha.com/symbol/{TICKER}/earnings/estimates")— EPS/revenue estimates with revision history - Yahoo Finance →
web_fetch("https://finance.yahoo.com/quote/{TICKER}/analysis")— consensus EPS, revenue, growth estimates - Zacks →
web_search("[TICKER] Zacks earnings estimates consensus")— earnings surprise history included - TipRanks →
web_search("[TICKER] TipRanks analyst consensus forecast")— aggregated Wall Street estimates
- Visible Alpha →
-
Historical Actuals Fallback Stack:
- Macrotrends →
web_search("[TICKER] macrotrends quarterly revenue EPS history")— clean 8-quarter tables - Stock Analysis →
web_search("[TICKER] stockanalysis.com earnings history")— beat/miss with surprise % - Company IR page →
web_search("[COMPANY] investor relations quarterly results press releases")— primary source press releases
- Macrotrends →
-
Options Data Fallback Stack:
- Barchart →
web_search("[TICKER] barchart options implied volatility straddle")— implied move + unusual activity - Market Chameleon →
web_search("[TICKER] market chameleon expected earnings move")— historical vs implied move comparison - Yahoo Finance Options →
web_fetch("https://finance.yahoo.com/quote/{TICKER}/options")— raw options chain for manual straddle calculation - CBOE →
web_search("[TICKER] CBOE options volume put call ratio")— put/call skew data
- Barchart →
Fallback Rules:
- Always cross-reference at least 2 sources when using fallback data
- Clearly label the source in output (e.g., "Source: Seeking Alpha consensus as of [date]")
- If consensus estimates are unavailable from any source, state "Consensus unavailable — using management guidance midpoint as proxy" and explain the limitation
- For beat/miss history, company press releases (IR page) are authoritative — prefer over third-party sites
Methodology
Phase 1: Earnings Calendar & Context
Step 1: Confirm reporting details
web_search("[TICKER] earnings date Q[X] [YEAR] expected report date")
web_search("[TICKER] earnings call time webcast details")
web_search("[TICKER] fiscal year end quarter end date")
Document:
- Expected report date and time (before/after market)
- Earnings call time and webcast link
- Fiscal quarter-end date
- Days until report
Step 2: Quarter context — what happened during this period
web_search("[TICKER] news developments [QUARTER_START_DATE] to [QUARTER_END_DATE]")
web_search("[INDUSTRY] trends Q[X] [YEAR] demand supply pricing")
web_search("macro environment [QUARTER] [YEAR] GDP consumer spending interest rates")
Summarize 5-7 key events/trends during the quarter that could affect results:
- Company-specific events (product launches, deals, management changes)
- Industry trends (demand shifts, pricing changes, competitor actions)
- Macro backdrop (consumer confidence, interest rates, FX movements, commodity prices)
Phase 2: Consensus Expectations
Step 3: Pull consensus estimates
web_search("[TICKER] earnings estimates Q[X] [YEAR] revenue EPS consensus FactSet")
web_search("[TICKER] Visible Alpha estimates OR LSEG consensus revenue EBITDA")
web_search("[TICKER] analyst estimates revision trend last 30 days 90 days")
web_search("[TICKER] whisper number earnings expectations")
Build consensus table:
| Metric | Consensus | High Est | Low Est | # Analysts | 30D Revision | 90D Revision |
|---|---|---|---|---|---|---|
| Revenue | $[X]B | $[X]B | $[X]B | [X] | [+/-X%] | [+/-X%] |
| Adj. EPS | $[X.XX] | $[X.XX] | $[X.XX] | [X] | [+/-X%] | [+/-X%] |
| EBITDA | $[X]M | $[X]M | $[X]M | [X] | [+/-X%] | [+/-X%] |
| Gross Margin | [X]% | |||||
| Operating Margin | [X]% |
Revision direction matters more than the number itself. Rising estimates into the print = higher bar. Falling estimates = lowered bar (easier to beat, but sentiment is negative).
Step 4: Segment-level expectations
web_search("[TICKER] segment revenue estimates Q[X] [YEAR] breakdown")
web_search("[TICKER] [SEGMENT_NAME] revenue growth expectations")
| Segment | Est. Revenue | YoY Growth | % of Total | Key Driver |
|---|---|---|---|---|
| [Seg 1] | $[X]M | [X]% | [X]% | [driver] |
| [Seg 2] | $[X]M | [X]% | [X]% | [driver] |
Step 5: Guidance reminder Extract from prior quarter's earnings call/press release:
- Full-year revenue guidance range
- Full-year EPS guidance range
- Any segment-specific guidance
- Capital allocation guidance (capex, buybacks, dividends)
- Qualitative commentary on current quarter trends (from prior call Q&A)
Compare current consensus to midpoint of guidance:
- Consensus above guidance midpoint → Street expects a raise
- Consensus at guidance midpoint → Street takes management at face value
- Consensus below guidance → Street skeptical (bearish signal)
Phase 3: Beat/Miss History Protocol (Last 8 Quarters)
Step 6: Build the beat/miss track record Pull from EDGAR XBRL (primary) + web_search (fallback: Macrotrends, Stock Analysis, Zacks) for last 8 quarters minimum. All 8 quarters are mandatory — do not skip quarters or use "data unavailable."
Revenue Beat/Miss History:
| Quarter | Fiscal End | Consensus Rev | Actual Rev | Beat/Miss | Surprise % | Source |
|---|---|---|---|---|---|---|
| Q[X] FY[XX] | [MM/DD/YY] | $[X]M | $[X]M | Beat ✅ / Miss ❌ | +/-[X.X]% | [FactSet/LSEG/SA] |
| Q[X-1] FY[XX] | [MM/DD/YY] | $[X]M | $[X]M | Beat ✅ / Miss ❌ | +/-[X.X]% | |
| ... (all 8 quarters) |
Revenue Summary Statistics:
- Beat rate: X/8 (XX%)
- Average beat magnitude: +X.X%
- Average miss magnitude: -X.X%
- Largest beat: Q[X] FY[XX] at +X.X% ($[X]M above consensus)
- Largest miss: Q[X] FY[XX] at -X.X% ($[X]M below consensus)
- Trend: Beat magnitude [increasing / decreasing / stable] — last 4 qtrs avg: +X.X% vs prior 4 qtrs avg: +X.X%
EPS Beat/Miss History:
| Quarter | Consensus EPS | Actual EPS | Beat/Miss | Surprise % | Adj. Items | Clean Beat? |
|---|---|---|---|---|---|---|
| Q[X] FY[XX] | $[X.XX] | $[X.XX] | Beat ✅ / Miss ❌ | +/-[X.X]% | [Tax benefit, restructuring, etc.] | [Y/N] |
| ... (all 8 quarters) |
EPS Summary Statistics:
- Beat rate: X/8 (XX%)
- Average beat magnitude: +X.X%
- Average miss magnitude: -X.X%
- ⚠️ Clean vs. Dirty beats: Of X beats, Y were "clean" (operational) vs Z were boosted by one-time items (tax rate, gains, release of reserves)
- One-time item flag: [List quarters where beat was driven by non-recurring items — these are NOT real beats for pattern analysis]
Post-Earnings Stock Reaction History:
| Quarter | Rev Surprise | EPS Surprise | Next-Day Move | 5-Day Move | Guidance Change | Reaction Pattern |
|---|---|---|---|---|---|---|
| Q[X] FY[XX] | +[X]% | +[X]% | [+/-X]% | [+/-X]% | Raised / Maintained / Lowered | Beat & Rally / Beat & Sell / Miss & Recover |
| ... (all 8 quarters) |
Post-Earnings Reaction Statistics:
- Average next-day move: +/-X.X%
- Average 5-day move: +/-X.X%
- Beat-and-sell frequency: X/Y beat quarters (XX%) — stock fell despite beating estimates
- Miss-and-recover frequency: X/Y miss quarters (XX%) — stock recovered within 5 days
- Guidance impact: In X/8 quarters where guidance was raised, stock averaged +X.X%; when lowered, -X.X%
- Key insight: [e.g., "Stock reacts more to guidance than to the beat/miss — 3 of 4 selloffs on beats coincided with guidance maintains when Street expected a raise"]
Step 7: Identify the pattern and apply to current quarter
- Does management typically guide conservatively (frequent beats by >3%)?
- Are beats getting larger or smaller over time? (Trend matters — decelerating beats = negative signal)
- Does the stock consistently sell off on beats? (Buy-the-rumor-sell-the-news pattern)
- Any quarters with unusual misses? What caused them?
- Current quarter pattern read: Based on the 8-quarter pattern, the expected playbook is [description]. If [TICKER] beats by [typical magnitude], expect [typical stock reaction]. The variant risk is [what would cause a deviation from pattern].
- Street positioning vs. pattern: With estimates [rising/falling] into the print, the bar is [higher/lower] than the 8-quarter pattern suggests — adjust beat probability accordingly.
Phase 4: Key Metrics to Watch
Step 8: Identify the 5-7 metrics that will move the stock
web_search("[TICKER] key metrics investors watching Q[X] [YEAR]")
web_search("[TICKER] what matters most this earnings KPIs")
web_search("[TICKER] analyst questions concerns heading into earnings")
For EACH key metric:
| Metric | Why It Matters | Consensus/Expected | Bull Case | Bear Case | Our View |
|---|---|---|---|---|---|
| [KPI 1] | [explanation] | [X] | [X] | [X] | [X] |
| [KPI 2] | [explanation] | [X] | [X] | [X] | [X] |
Common company-type KPIs:
- SaaS: ARR, NRR, RPO, billings, CAC payback, Rule of 40
- Consumer: Same-store sales, traffic, ticket size, inventory days
- Industrial: Book-to-bill, backlog, utilization, price/cost spread
- Financial: NIM, credit costs, provision, loan growth, CET1
- Healthcare: Scripts, patients, pricing, pipeline milestones
Step 9: Guidance expectations What will management guide for next quarter and full year?
- Current FY guidance range
- Street expects guidance to be: raised / maintained / lowered
- Key variables that drive the guidance (FX, commodity prices, volume assumptions)
Phase 5: Surprise Scenario Analysis
Step 10: Bull/Bear/Base scenario framework
web_search("[TICKER] upside risks Q[X] potential positive surprise")
web_search("[TICKER] downside risks Q[X] potential miss concerns")
web_search("[TICKER] channel checks supply chain demand signals")
Bull Case (probability: X%):
- What goes right: [specific drivers]
- Revenue: $[X] (X% above consensus)
- EPS: $[X] (X% above consensus)
- Stock reaction: +[X-Y]%
- Catalyst: [guidance raise, new product traction, margin upside]
Base Case (probability: X%):
- In-line results, guidance maintained
- Stock reaction: [flat to +/-X%]
- Post-earnings focus shifts to: [next catalyst]
Bear Case (probability: X%):
- What goes wrong: [specific risks]
- Revenue: $[X] (X% below consensus)
- EPS: $[X] (X% below consensus)
- Stock reaction: -[X-Y]%
- Damage: [guidance cut, multiple compression, narrative break]
Phase 6: Market Positioning & Technical Context
Step 11: Options Market Signal (Comprehensive)
The options market is the single best real-time indicator of how professional money is positioned going into the print. This section is mandatory and must contain quantitative data, not just qualitative commentary.
web_search("[TICKER] options implied move earnings straddle ATM")
web_search("[TICKER] options activity unusual volume open interest earnings")
web_search("[TICKER] put call ratio skew earnings [DATE]")
web_search("[TICKER] market chameleon expected earnings move historical")
web_search("[TICKER] options max pain expiration [EARNINGS_WEEK_EXPIRY]")
A. Implied Move from Straddle Pricing:
| Component | Value |
|---|---|
| ATM Strike | $[X] |
| ATM Call Price | $[X.XX] |
| ATM Put Price | $[X.XX] |
| Straddle Cost | $[X.XX] |
| Implied Move (%) | +/-[X.X]% |
| Implied Move ($) | +/-$[X.XX] |
| Break-Even (upside) | $[X.XX] |
| Break-Even (downside) | $[X.XX] |
B. Implied vs. Historical Move Comparison:
| Metric | Value | Assessment |
|---|---|---|
| Current implied move | +/-[X.X]% | |
| Average actual move (last 8 qtrs) | +/-[X.X]% | |
| Median actual move (last 8 qtrs) | +/-[X.X]% | |
| Largest actual move (last 8 qtrs) | +/-[X.X]% (Q[X] FY[XX]) | |
| Implied/Historical Ratio | [X.X]x | Options are [cheap (<0.9x) / fair (0.9-1.1x) / expensive (>1.1x)] |
- If implied > 1.2x historical → options are pricing a larger move than typical → sellers favored (sell premium)
- If implied < 0.8x historical → options are underpricing risk → buyers favored (buy straddle/strangle)
- If implied ≈ historical → fairly priced, no edge in premium selling or buying
C. Put/Call Skew Analysis:
| Metric | Value | Signal |
|---|---|---|
| 25-delta put IV | [X]% | |
| 25-delta call IV | [X]% | |
| Skew (put IV - call IV) | [X]% | [Neutral / Bearish (put premium) / Bullish (call premium)] |
| Put/call volume ratio (5-day avg) | [X.X] | [Normal range: 0.5-1.0; >1.5 = elevated put buying] |
| Put/call OI ratio | [X.X] | [Elevated puts = hedging or bearish bets] |
Skew interpretation:
- Skew > +5%: Market pricing downside protection → hedging or bearish positioning
- Skew -2% to +5%: Normal range → no directional signal
- Skew < -2%: Call premium elevated → unusual bullish positioning
D. Unusual Options Activity:
web_search("[TICKER] unusual options activity large trades dark pool")
web_search("[TICKER] options sweep block trades earnings week")
| Date | Type | Strike | Expiry | Volume | Open Interest | Premium | Signal |
|---|---|---|---|---|---|---|---|
| [Date] | [Call/Put sweep] | $[X] | [Date] | [X] | [X] | $[X]M | [Bullish/Bearish/Hedging] |
Notable flows: [Describe 2-3 most significant options trades — e.g., "Large May $350 call buyer, $4.2M premium, 10x avg volume — bullish positioning for post-earnings move above consensus implied range"]
E. Options Market Summary:
- The options market is pricing a +/-[X.X]% move vs historical +/-[X.X]% → options are [cheap/fair/expensive]
- Skew indicates [neutral / bearish hedging / bullish positioning]
- Unusual activity suggests [smart money is positioned for X]
- Recommendation: [e.g., "Options are expensive — if we have a view, express it directionally (calls or puts) rather than buying the straddle. If neutral, consider selling an iron condor at the 1-sigma wings."]
Step 12: Technical setup and positioning
web_search("[TICKER] stock chart technical analysis pre-earnings")
web_search("[TICKER] short interest days to cover borrow rate")
web_search("[TICKER] institutional ownership changes 13F")
- Price vs. key moving averages (50-day, 200-day)
- Support/resistance levels near current price
- Short interest: [X]% of float, [X] days to cover
- Recent institutional activity: net buying or selling in latest 13F
- RSI and momentum indicators
Phase 7: Earnings Call Listening Guide
Step 13: What to listen for on the call Prepare 10 specific questions/topics to track during the call:
- [Topic] — What management says about [X] will signal [implication]
- [Topic] — Watch for tone change on [X] vs. last quarter
- [Metric] — If management provides specific guidance on [X], it means [Y]
- [Risk] — Will analysts press on [X]? Management's response matters because [Y]
- [Forward indicator] — Commentary on [pipeline/bookings/orders] signals [Q+1 trajectory]
Output Format
📊 EARNINGS PREVIEW — [Company Name] ([TICKER])
Reports: [Date, Time BMO/AMC] | Quarter: [Q#] FY[YYYY] | Period: [Start-End Date]
Current Price: $[X] | Mkt Cap: $[X]B | Implied Move: +/-[X]%
Prepared: [Date]
━━━ EXECUTIVE SUMMARY ━━━
[3-5 bullet summary: what consensus expects, where surprise risk lies, our positioning recommendation]
BOTTOM LINE: [One sentence — "We expect [TICKER] to [beat/meet/miss] on [revenue/EPS] driven by [reason], with the key swing factor being [X]. The stock is priced for [perfection/modest expectations/disaster]."]
━━━ CONSENSUS EXPECTATIONS ━━━
[Consensus table with estimates, revisions, analyst count]
Source: [FactSet/Bloomberg/Visible Alpha — NAMED]
Guidance vs. Consensus: Street is [above/at/below] guidance midpoint by [X]%
Revision Trend: Estimates have [risen/fallen/held flat] by [X]% over 90 days
━━━ SEGMENT EXPECTATIONS ━━━
[Segment table with estimates and key drivers]
━━━ BEAT/MISS HISTORY (Last 8 Quarters) ━━━
[Historical table with actuals vs estimates and stock reaction]
Revenue Beat Rate: [X]% | Avg Beat: [X]% | EPS Beat Rate: [X]% | Avg Beat: [X]%
Pattern: [Description — "consistent modest beater" / "volatile, big swings" / "beats then sells off"]
━━━ KEY METRICS TO WATCH ━━━
[Metric table with bull/bear cases and our view]
The single most important number this quarter: [METRIC] because [REASON]
━━━ SURPRISE SCENARIOS ━━━
🟢 Bull ([X]% probability): [Revenue $X, EPS $X → stock +X%]
⚪ Base ([X]% probability): [Revenue $X, EPS $X → stock flat]
🔴 Bear ([X]% probability): [Revenue $X, EPS $X → stock -X%]
━━━ POSITIONING & MARKET SETUP ━━━
Options: Implied +/-[X]% vs historical avg +/-[X]% → options are [cheap/fair/expensive]
Technicals: Trading [above/below] [50/200]-day MA | Short interest: [X]% ([X] days to cover)
Institutional: Net [buying/selling] in latest 13F period
━━━ EARNINGS CALL LISTENING GUIDE ━━━
[Numbered list of 10 specific items to listen for, with signal interpretation]
━━━ POSITIONING RECOMMENDATION ━━━
[For a long position / short position / no position / considering entry:]
• Pre-earnings: [Hold / trim / add / hedge / stay flat]
• Rationale: [Why — specific to setup, not generic]
• Risk management: [Stop loss level / position sizing / options hedge structure]
━━━ TRIPLE-THREAT LENS ━━━
🏦 **Banker:** [Any M&A commentary expected? Strategic review? Activist pressure influencing capital allocation decisions? Deal pipeline commentary? This quarter's results affect [pending transaction / defense posture / LBO math] because [specific reason].]
📊 **Accountant:** [Revenue recognition risks this quarter (ASC 606 timing, deferred revenue trends), any one-time items to adjust for, inventory/receivables quality signals, change in accounting estimates, auditor/internal control flags from recent 10-Q, tax rate volatility]
💰 **Wealth Manager:** [Portfolio impact — how does this earnings report affect client positions? Dividend safety (payout ratio trend), buyback pace, tax-loss harvesting opportunity if stock drops. For clients asking "should I sell before earnings?" — our answer and reasoning. Risk-adjusted position sizing given implied move.]
Quality Gates
- Consensus estimates sourced from named provider (FactSet, Bloomberg, Visible Alpha, LSEG)
- Historical beat/miss table covers at least 8 quarters with actual figures from EDGAR
- Revision trends quantified (30-day and 90-day direction and magnitude)
- Key metrics are company-specific KPIs, not just revenue and EPS
- Surprise scenarios have specific revenue/EPS numbers and probability weights
- Options-implied move computed from straddle pricing, compared to historical average
- Earnings call listening guide has 10 specific, actionable items (not generic "listen for guidance")
- Prior quarter guidance recalled and compared to current consensus
- Short interest and institutional positioning data included
- Positioning recommendation is specific and risk-managed (not just "buy the dip")
- YoY and QoQ growth rates shown alongside absolute numbers
- Segment-level estimates provided (not just top-line)
Professional Standards
A-grade: Beat/miss analysis reveals a pattern (e.g., "beats by 2-3% then sells off 80% of the time — stock is pricing in the beat"). Surprise scenarios are probabilistically weighted with specific numbers. Key metrics are the 2-3 that actually move the stock post-earnings (not 15 generic KPIs). Listening guide tells you exactly what management's tone on X means for the stock. Positioning recommendation factors in options pricing (don't buy the straddle if implied vol is 2x historical).
B-grade: Consensus table exists but no revision analysis. Beat/miss history is listed but not analyzed for patterns. Key metrics are every financial line item (analyst doesn't know what matters). Surprise scenarios are "could be good or bad." Positioning recommendation is "own quality names."
Common pitfalls:
- Ignoring the earnings call — the stock often reacts to guidance and tone, not the reported numbers
- Not adjusting for one-time items in beat/miss analysis (a "beat" driven by a tax benefit isn't a real beat)
- Using trailing consensus instead of pre-report consensus (estimates get pulled toward actual right before)
- Ignoring options pricing — if implied move is 8% and your thesis implies 3%, options are expensive
- Treating all beats equally — a 10% EPS beat on a 5% revenue miss is very different from a clean beat
See Also
company-brief— background on the companycomps-builder— how the stock's valuation compares to peers going inresearch-note-publisher— publish post-earnings updateclient-meeting-prep— include earnings preview in client materials