Earnings Prep — Pre-Earnings Decision Framework
🔍 Pre-flight checklist — run BEFORE building scenarios or making recommendations
Earnings reactions are ±8-20%. That's not where to skip the discipline layers.
- Macro regime — trigger
macro-warning skill first. In 🔴 RED regime, even a 20% beat can sell off (AMD 2/3/2026 beat 23%, dropped -17.31%). RED regime → recommend trim/hedge only, no adds regardless of expected reaction.
- Insider 60d window —
$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/insider_ratio.py 2>/dev/null | head -1) TICKER --window 60 (60d catches pre-earnings ad-hoc activity that 90d dilutes). Pre-earnings C-suite distribution = they know something. Never trust yfinance "% Net Shares" headline (RSU pollutes it). Form 4 code "P" only counts as buy.
- Position context first — if user already holds, lead with their position size + cost basis + holding period. Generic "buy/sell" without position context is useless.
- 3-tier entry if recommending add — Don't say "buy after earnings". Map T1 = post-earnings reaction level, T2 = 50DMA support, T3 = 200DMA / pre-earnings level. NEVER "buy at market" on earnings hype.
- Tax for trims — If trimming a position held < 12 months, run
tax-optimize for STCG vs LTCG impact. STCG ~25-37% federal vs LTCG 15-20%. Often changes the recommendation (hold 30 more days → save 10%).
- Sizing — ≤ 10% single name; if recommending add post-earnings, current allocation must allow it.
"Look carefully" rule: the most common pre-earnings mistake is treating "beat consensus" as automatic upside. Always answer "what's already priced in" (Step 4 below) — if Forward P/E expanded 30% in 3 months, the beat is already discounted.
See README's Hard Rules for the full anti-pattern list.
Goal
Answer 3 questions:
- What's the market expecting? (consensus + implied move)
- What's the historical pattern? (last 8 quarters reactions)
- What should I do with my position? (hold / trim / hedge / add)
The 5-Step Workflow
Step 1 — Pull consensus + guidance
Tools:
WebSearch: "[ticker] Q[X] FY[YEAR] earnings consensus revenue EPS"
mcp__yfmcp__yfinance_get_ticker_info for current price + earnings date
Capture:
| Item |
Value |
| Earnings date |
YYYY-MM-DD (BMO/AMC) |
| Revenue consensus |
$X.XB (+Y% YoY) |
| EPS consensus |
$X.XX (+Y% YoY) |
| Company self-guide |
$X.XB ± $Y |
| Last quarter beat/miss |
Beat by X% / Missed |
| Days away |
N |
Step 2 — Calculate implied move
Method 1 (preferred): ATM straddle
- Pull option chain for first expiry after earnings
- Find ATM call + ATM put
- Implied move % = (call mid + put mid) / current price × 100
- Convert to $ range: current ± implied move
Method 2: WebSearch fallback
WebSearch: "[ticker] earnings expected move implied volatility"
Output:
Current: $XXX
Implied move: ±X.X%
Expected range: $YYY - $ZZZ
Step 3 — Historical 8-quarter reactions
Pull last 8 quarter reactions. Use optionsai.com, optionslam.com, or WebSearch.
Output table:
| Date |
Result |
One-day reaction |
Notes |
| 8 quarters back |
Beat/Miss |
+X% / -X% |
Why |
| 7 |
... |
... |
... |
| ... |
... |
... |
... |
| Last quarter |
Beat 23% |
-17.31% |
Despite beat (AMD pattern) |
Key statistics:
- Average absolute move: X.X%
- Win rate: Y/8 (Z%)
- Largest up: +X% / Largest down: -X%
- Recent trend: Last 3-4 quarters skew (often more important than 8q average)
Step 4 — Predictability assessment (NEW)
Before scenario building, assess earnings predictability based on growth model:
| Growth Model |
Earnings Predictability |
Implication |
| Capacity-bottlenecked (Optical, OSAT) |
🔴 Low |
High variance, "shipments < demand" common |
| Demand-elastic (GPU, ASIC) |
🟡 Medium |
Can beat but expectations also high |
| Independent capex (Memory, Storage) |
🟢 High |
Capacity locked, contracts visible |
| Long-cycle infra (Power, Materials) |
🟢🟢 Highest |
Backlog-driven, low surprise |
| Recurring SaaS/ARR |
🟢🟢 Highest |
Quarterly steady |
For each model, watch for these red flags pre-earnings:
- Capacity-bottlenecked: "缺料" / component shortage rumors → likely miss on operational metrics even if EPS beats (FN pattern 5/4/2026)
- Demand-elastic: "guide in-line" without raise → "beat but priced in" (AMD pattern)
- Cyclical: Inventory buildup at customers → next-quarter weak guide
- Recurring: Customer churn news → revenue miss
Step 5 — What's priced in vs not?
Critical analysis — this is what separates pros from amateurs.
Question 1: What's already in the price?
- Current Forward P/E vs historical avg
- Distance from 50DMA / 200DMA
- 1Y price change
- If +50% in 3 months → expectations极高
Question 2: What's NOT in the price?
- Specific business optionalities
- Geographic recovery (e.g., NVDA China = $0 priced in)
- New product cycles
- M&A rumors
Examples:
- NVDA 5/2026: China = $0 priced in → any China good news = pure upside
- ORCL 6/2026: Capex concerns priced in → any FCF improvement = upside
- AMD 5/2026: MI400 + OpenAI已 priced in → 需要"上修指引"才能涨
Step 5 — Build 4 scenarios with weighting
| Scenario |
Probability |
Conditions |
Reaction |
Target Price |
| 🚀 Mega-bull |
X% |
Big beat + raise + new catalyst |
+12 to +20% |
$YYY |
| 🟢 Bull |
X% |
Solid beat + in-line guide |
+3 to +8% |
$YYY |
| 🟡 Flat/-Sell |
X% |
Beat but priced-in |
-3 to -10% |
$YYY |
| 🔴 Bear |
X% |
Miss or guide cut |
-10 to -20% |
$YYY |
Weighted average price = Σ(probability × target)
If weighted < current → 期望值是负的,市场已 priced in 利好
Position-Specific Recommendations
Based on the 4 scenarios, give SPECIFIC action:
Already long the stock?
| Pre-earnings setup |
Action |
| Already +30%+ in last month |
Trim 25-50% before |
| At 1Y high + earnings ≤7d |
Trim 25-50% (Rule #5 from review-screenshot) |
| Healthy trend, not parabolic |
Hold + set 50DMA stop |
| Below 50DMA, beaten down |
Hold, low expectations = upside skew |
| Insider distributed pre-earnings |
Trim, they know something |
Want to make a directional bet?
| Setup |
Strategy |
| Bullish + IV reasonable |
Long call (1-2 weeks out) |
| Bullish + IV very high |
Call spread (cap upside, reduce cost) |
| Bullish + already long stock |
Buy upside call as add (don't sell stock) |
| Bearish + IV high |
Put spread (cheaper than naked put) |
| Uncertain but want to play vol |
Strangle or straddle (rare, expensive) |
Want to hedge existing long position?
| Setup |
Hedge |
| Want full protection |
Long put at ATM (expensive but full hedge) |
| Want protection at lower cost |
Put spread (gives up tail) |
| Have core, willing to sell at +X% |
Covered call (income, caps upside) |
| Want to stay in but reduce delta |
Sell some shares + use proceeds for puts |
Output format
# [TICKER] Earnings Prep — [Date]
**Earnings: [Date BMO/AMC] | Days away: N**
## TL;DR
[One paragraph: what to do with current position + size]
## Consensus
| Revenue | EPS | YoY |
## Implied Move
- ATM straddle: ±X.X%
- Range: $YYY - $ZZZ
## Historical Pattern (Last 8 Quarters)
[Table]
- Avg abs move: X.X%
- Win rate: Y/8
## What's Priced In
- ✅ Already in price: [list]
- ❌ NOT priced in: [list — these are upside catalysts]
## 4 Scenarios
| Scenario | Prob | Reaction | Target |
| Mega-bull | X% | +X% | $Y |
| Bull | X% | +X% | $Y |
| Flat | X% | -X% | $Y |
| Bear | X% | -X% | $Y |
**Weighted avg target: $X (vs current $Y) → +/-Z%**
## My Recommendation
- **If I'm long [N shares]**: [trim X / hold / add Y]
- **If I'm not in**: [skip / play call spread / wait]
- **Specific orders**: [exact ticker, qty, price, type]
## Watch list (next 24h)
- [Pre-market reaction signals]
- [Key levels: $X = breakout, $Y = breakdown]
Hard rules
- Pre-flight before recommending. Skip the checklist at top = incomplete call. Macro + insider 60d + position context are not optional.
- Never recommend "hold through earnings" without setting a stop. Implied move is real money.
- Compare last 3-4 quarters more heavily than 8q avg. Pattern recently changed = more relevant.
- Big beats sometimes lead to big drops. AMD 2/3/2026: EPS beat 23% → -17.31%. Always check "is this priced in".
- In 🔴 RED macro regime, no new longs regardless of earnings setup — trim/hedge only. Document the regime call in the output.
- IV crush is real. Buy options 5+ days out, sell into earnings hype.
- Never sell naked puts on stocks you wouldn't own. Sell put = "I want to buy at $X". If $X isn't a level you'd actually buy at, don't sell.
- Cite implied move source. Either ATM straddle calculation or WebSearch with link.
- When user is already long: lead with their position, not generic analysis.
- 3-tier entry for any add recommendation. "Buy at market post-earnings" = wrong answer. Always map T1/T2/T3.
- Tax-aware trims. If position held < 12 months, surface STCG impact in the recommendation, not as footnote.
Common pitfalls
| Pitfall |
Example |
Lesson |
| "Earnings will beat, stock will rise" |
AMD 2/3/26 (beat 23%, -17.31%) |
Beat alone is not enough |
| "Sell put before earnings = easy money" |
Multiple times |
Until it's not, then you lose 10x premium |
| Ignoring IV crush |
Bought ATM call before earnings |
Need stock to move > implied + IV crush |
| Not checking insider |
Dropping after CFO sold $5M pre-earnings |
Insider sold for a reason |
| Only checking 8q avg |
Recent trend was -10%, -8%, -17% |
Trend > average |
Tool cheat-sheet
| Need |
Tool |
| Current price + earnings date |
mcp__yfmcp__yfinance_get_ticker_info |
| Option chain for straddle |
mcp__yfmcp__yfinance_get_option_chain |
| Historical earnings reactions |
WebSearch: "optionslam [ticker] earnings history" |
| Implied move |
Calculate from straddle OR WebSearch: "[ticker] expected move" |
| Consensus |
WebSearch: "[ticker] Q[X] earnings consensus" |
| Insider pre-earnings |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/insider_ratio.py 2>/dev/null |
When to invoke
- User asks: "Should I hold X through earnings?"
- User asks: "X reports tomorrow, what do I do?"
- User asks: "Should I sell put before earnings?"
- Auto: 7 days before any earnings of a stock the user holds
- Auto: Day-of for any stock with options position expiring within 1 month of earnings
1---2name: earnings-prep3description: Earnings Prep — Pre-Earnings Decision Framework4---56# Earnings Prep — Pre-Earnings Decision Framework78## 🔍 Pre-flight checklist — run BEFORE building scenarios or making recommendations910Earnings reactions are ±8-20%. That's not where to skip the discipline layers.11121. **Macro regime** — trigger `macro-warning` skill first. In 🔴 RED regime, even a 20% beat can sell off (AMD 2/3/2026 beat 23%, dropped -17.31%). RED regime → recommend trim/hedge only, no adds regardless of expected reaction.132. **Insider 60d window** — `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/insider_ratio.py 2>/dev/null | head -1) TICKER --window 60` (60d catches pre-earnings ad-hoc activity that 90d dilutes). Pre-earnings C-suite distribution = they know something. Never trust yfinance "% Net Shares" headline (RSU pollutes it). Form 4 code "P" only counts as buy.143. **Position context first** — if user already holds, lead with their position size + cost basis + holding period. Generic "buy/sell" without position context is useless.154. **3-tier entry if recommending add** — Don't say "buy after earnings". Map T1 = post-earnings reaction level, T2 = 50DMA support, T3 = 200DMA / pre-earnings level. NEVER "buy at market" on earnings hype.165. **Tax for trims** — If trimming a position held < 12 months, run `tax-optimize` for STCG vs LTCG impact. STCG ~25-37% federal vs LTCG 15-20%. Often changes the recommendation (hold 30 more days → save 10%).176. **Sizing** — ≤ 10% single name; if recommending add post-earnings, current allocation must allow it.1819**"Look carefully" rule**: the most common pre-earnings mistake is treating "beat consensus" as automatic upside. Always answer "what's already priced in" (Step 4 below) — if Forward P/E expanded 30% in 3 months, the beat is already discounted.2021See [README's Hard Rules](../README.md#%EF%B8%8F-hard-rules-never-violate) for the full anti-pattern list.2223---2425## Goal2627Answer 3 questions:281. **What's the market expecting?** (consensus + implied move)292. **What's the historical pattern?** (last 8 quarters reactions)303. **What should I do with my position?** (hold / trim / hedge / add)3132## The 5-Step Workflow3334### Step 1 — Pull consensus + guidance3536**Tools:**37- `WebSearch`: "[ticker] Q[X] FY[YEAR] earnings consensus revenue EPS"38- `mcp__yfmcp__yfinance_get_ticker_info` for current price + earnings date3940**Capture:**41| Item | Value |42|---|---|43| Earnings date | YYYY-MM-DD (BMO/AMC) |44| Revenue consensus | $X.XB (+Y% YoY) |45| EPS consensus | $X.XX (+Y% YoY) |46| Company self-guide | $X.XB ± $Y |47| Last quarter beat/miss | Beat by X% / Missed |48| Days away | N |4950### Step 2 — Calculate implied move5152**Method 1 (preferred): ATM straddle**53- Pull option chain for **first expiry after earnings**54- Find ATM call + ATM put55- Implied move % = (call mid + put mid) / current price × 10056- Convert to $ range: current ± implied move5758**Method 2: WebSearch fallback**59- `WebSearch`: "[ticker] earnings expected move implied volatility"6061**Output:**62```63Current: $XXX64Implied move: ±X.X%65Expected range: $YYY - $ZZZ66```6768### Step 3 — Historical 8-quarter reactions6970Pull last 8 quarter reactions. Use `optionsai.com`, `optionslam.com`, or WebSearch.7172**Output table:**73| Date | Result | One-day reaction | Notes |74|---|---|---|---|75| 8 quarters back | Beat/Miss | +X% / -X% | Why |76| 7 | ... | ... | ... |77| ... | ... | ... | ... |78| Last quarter | Beat 23% | **-17.31%** | Despite beat (AMD pattern) |7980**Key statistics:**81- Average absolute move: X.X%82- Win rate: Y/8 (Z%)83- Largest up: +X% / Largest down: -X%84- **Recent trend**: Last 3-4 quarters skew (often more important than 8q average)8586### Step 4 — Predictability assessment (NEW)8788Before scenario building, assess **earnings predictability** based on growth model:8990| Growth Model | Earnings Predictability | Implication |91|---|---|---|92| **Capacity-bottlenecked** (Optical, OSAT) | 🔴 Low | High variance, "shipments < demand" common |93| **Demand-elastic** (GPU, ASIC) | 🟡 Medium | Can beat but expectations also high |94| **Independent capex** (Memory, Storage) | 🟢 High | Capacity locked, contracts visible |95| **Long-cycle infra** (Power, Materials) | 🟢🟢 Highest | Backlog-driven, low surprise |96| **Recurring SaaS/ARR** | 🟢🟢 Highest | Quarterly steady |9798**For each model, watch for these red flags pre-earnings**:99- **Capacity-bottlenecked**: "缺料" / component shortage rumors → likely miss on operational metrics even if EPS beats (FN pattern 5/4/2026)100- **Demand-elastic**: "guide in-line" without raise → "beat but priced in" (AMD pattern)101- **Cyclical**: Inventory buildup at customers → next-quarter weak guide102- **Recurring**: Customer churn news → revenue miss103104### Step 5 — What's priced in vs not?105106**Critical analysis** — this is what separates pros from amateurs.107108**Question 1**: What's already in the price?109- Current Forward P/E vs historical avg110- Distance from 50DMA / 200DMA111- 1Y price change112- If +50% in 3 months → expectations极高113114**Question 2**: What's NOT in the price?115- Specific business optionalities116- Geographic recovery (e.g., NVDA China = $0 priced in)117- New product cycles118- M&A rumors119120**Examples:**121- **NVDA 5/2026**: China = $0 priced in → any China good news = pure upside122- **ORCL 6/2026**: Capex concerns priced in → any FCF improvement = upside123- **AMD 5/2026**: MI400 + OpenAI已 priced in → 需要"上修指引"才能涨124125### Step 5 — Build 4 scenarios with weighting126127| Scenario | Probability | Conditions | Reaction | Target Price |128|---|---|---|---|---|129| 🚀 Mega-bull | X% | Big beat + raise + new catalyst | +12 to +20% | $YYY |130| 🟢 Bull | X% | Solid beat + in-line guide | +3 to +8% | $YYY |131| 🟡 Flat/-Sell | X% | Beat but priced-in | -3 to -10% | $YYY |132| 🔴 Bear | X% | Miss or guide cut | -10 to -20% | $YYY |133134**Weighted average price** = Σ(probability × target)135**If weighted < current** → 期望值是负的,市场已 priced in 利好136137## Position-Specific Recommendations138139Based on the 4 scenarios, give SPECIFIC action:140141### Already long the stock?142| Pre-earnings setup | Action |143|---|---|144| Already +30%+ in last month | Trim 25-50% before |145| At 1Y high + earnings ≤7d | Trim 25-50% (Rule #5 from review-screenshot) |146| Healthy trend, not parabolic | Hold + set 50DMA stop |147| Below 50DMA, beaten down | Hold, low expectations = upside skew |148| Insider distributed pre-earnings | Trim, they know something |149150### Want to make a directional bet?151| Setup | Strategy |152|---|---|153| Bullish + IV reasonable | Long call (1-2 weeks out) |154| Bullish + IV very high | Call spread (cap upside, reduce cost) |155| Bullish + already long stock | Buy upside call as add (don't sell stock) |156| Bearish + IV high | Put spread (cheaper than naked put) |157| Uncertain but want to play vol | Strangle or straddle (rare, expensive) |158159### Want to hedge existing long position?160| Setup | Hedge |161|---|---|162| Want full protection | Long put at ATM (expensive but full hedge) |163| Want protection at lower cost | Put spread (gives up tail) |164| Have core, willing to sell at +X% | Covered call (income, caps upside) |165| Want to stay in but reduce delta | Sell some shares + use proceeds for puts |166167## Output format168169```markdown170# [TICKER] Earnings Prep — [Date]171**Earnings: [Date BMO/AMC] | Days away: N**172173## TL;DR174[One paragraph: what to do with current position + size]175176## Consensus177| Revenue | EPS | YoY |178179## Implied Move180- ATM straddle: ±X.X%181- Range: $YYY - $ZZZ182183## Historical Pattern (Last 8 Quarters)184[Table]185- Avg abs move: X.X%186- Win rate: Y/8187188## What's Priced In189- ✅ Already in price: [list]190- ❌ NOT priced in: [list — these are upside catalysts]191192## 4 Scenarios193| Scenario | Prob | Reaction | Target |194| Mega-bull | X% | +X% | $Y |195| Bull | X% | +X% | $Y |196| Flat | X% | -X% | $Y |197| Bear | X% | -X% | $Y |198**Weighted avg target: $X (vs current $Y) → +/-Z%**199200## My Recommendation201- **If I'm long [N shares]**: [trim X / hold / add Y]202- **If I'm not in**: [skip / play call spread / wait]203- **Specific orders**: [exact ticker, qty, price, type]204205## Watch list (next 24h)206- [Pre-market reaction signals]207- [Key levels: $X = breakout, $Y = breakdown]208```209210## Hard rules2112121. **Pre-flight before recommending.** Skip the checklist at top = incomplete call. Macro + insider 60d + position context are not optional.2132. **Never recommend "hold through earnings" without setting a stop.** Implied move is real money.2143. **Compare last 3-4 quarters more heavily than 8q avg.** Pattern recently changed = more relevant.2154. **Big beats sometimes lead to big drops.** AMD 2/3/2026: EPS beat 23% → -17.31%. Always check "is this priced in".2165. **In 🔴 RED macro regime, no new longs** regardless of earnings setup — trim/hedge only. Document the regime call in the output.2176. **IV crush is real.** Buy options 5+ days out, sell into earnings hype.2187. **Never sell naked puts on stocks you wouldn't own.** Sell put = "I want to buy at $X". If $X isn't a level you'd actually buy at, don't sell.2198. **Cite implied move source.** Either ATM straddle calculation or WebSearch with link.2209. **When user is already long**: lead with their position, not generic analysis.22110. **3-tier entry for any add recommendation.** "Buy at market post-earnings" = wrong answer. Always map T1/T2/T3.22211. **Tax-aware trims.** If position held < 12 months, surface STCG impact in the recommendation, not as footnote.223224## Common pitfalls225226| Pitfall | Example | Lesson |227|---|---|---|228| "Earnings will beat, stock will rise" | AMD 2/3/26 (beat 23%, -17.31%) | Beat alone is not enough |229| "Sell put before earnings = easy money" | Multiple times | Until it's not, then you lose 10x premium |230| Ignoring IV crush | Bought ATM call before earnings | Need stock to move > implied + IV crush |231| Not checking insider | Dropping after CFO sold $5M pre-earnings | Insider sold for a reason |232| Only checking 8q avg | Recent trend was -10%, -8%, -17% | Trend > average |233234## Tool cheat-sheet235236| Need | Tool |237|---|---|238| Current price + earnings date | `mcp__yfmcp__yfinance_get_ticker_info` |239| Option chain for straddle | `mcp__yfmcp__yfinance_get_option_chain` |240| Historical earnings reactions | `WebSearch`: "optionslam [ticker] earnings history" |241| Implied move | Calculate from straddle OR `WebSearch`: "[ticker] expected move" |242| Consensus | `WebSearch`: "[ticker] Q[X] earnings consensus" |243| Insider pre-earnings | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/insider_ratio.py 2>/dev/null | head -1) "TICKER" --window 60` (60d window catches pre-earnings ad-hoc activity; default is 90d) |244245## When to invoke246247- **User asks**: "Should I hold X through earnings?"248- **User asks**: "X reports tomorrow, what do I do?"249- **User asks**: "Should I sell put before earnings?"250- **Auto**: 7 days before any earnings of a stock the user holds251- **Auto**: Day-of for any stock with options position expiring within 1 month of earnings