Atlas / Skills / himself65 / Earnings Recap

Earnings RecapSAFE

skills/himself65/earnings-recap

A collection of skills for AI financial analysis.

Verdict
SAFE
Grade
B
Trust score
89 /100
Version
—
Hosts
1 documented
License
MIT
Stars
3,383
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Generate a post-earnings analysis for any stock using Yahoo Finance data.

What it does

  • Shows the EPS beat/miss result with surprise percentage
  • Presents quarterly financial trends (revenue, margins, EPS) over the last 4 quarters
  • Calculates the stock price reaction on earnings day
  • Compares the reaction to the stock's average earnings-day move
  • Provides context on margin trends and revenue growth trajectory

Triggers

AAPL earnings recap, how did TSLA earnings go, MSFT earnings results, did NVDA beat earnings, post-earnings analysis, earnings surprise, what happened with GOOGL earnings, earnings reaction, stock moved after earnings, earnings report summary, EPS beat or miss, quarterly results, AMZN reported last night

Prerequisites

  • Python 3.8+
  • yfinance (auto-installed if missing)

Platform

All platforms (Claude Code, Claude.ai, other agents)

Setup

No setup required — yfinance pulls data from Yahoo Finance without authentication.

Reference Files

  • references/api_reference.md — yfinance API reference for earnings history and financial statement methods
Read from source at commit 317cbce031f1OBSERVED · 2026-10-08
02

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
03

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: earnings-recap
description: >
  Analyze a company's most recent (or a specified past) earnings report from Yahoo
  Finance data (yfinance): actual vs estimated EPS, surprise size, revenue and margin
  trends, and the stock's price reaction. Use this skill whenever the user asks how
  earnings went — beat or miss, earnings surprise, quarterly results, the
  post-earnings move, or an earnings call recap — including casual references to a
  past report such as "AMZN reported last night" or "how did they do". For an
  upcoming report, use earnings-preview.
---

# Earnings Recap Skill

Generates a post-earnings analysis using Yahoo Finance data via [yfinance](https://github.com/ranaroussi/yfinance). Covers the actual vs estimated numbers, surprise magnitude, stock price reaction, and financial context — a complete picture of what happened.

**Important**: Data is for research and educational purposes only. Not financial advice. yfinance is not affiliated with Yahoo, Inc.

---

## Step 1: Ensure yfinance Is Available

**Current environment status:**

```
!`python3 -c "exec('try:\n import yfinance\n print(\'yfinance \' + yfinance.__version__ + \' installed\')\nexcept Exception:\n print(\'YFINANCE_NOT_INSTALLED\')')"`
```

If `YFINANCE_NOT_INSTALLED`, install it:

```python
import subprocess, sys
subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", "yfinance"])
```

If already installed, skip to the next step.

---

## Step 2: Identify the Ticker and Gather Data

Extract the ticker from the user's request. Fetch all relevant post-earnings data in one script.

```python
import yfinance as yf
import pandas as pd

ticker = yf.Ticker("AAPL")  # replace with actual ticker

# --- Earnings results ---
earnings_dates = ticker.get_earnings_dates(limit=12)  # report timestamps, newest first
earnings_hist = ticker.earnings_history               # last 4 quarters, indexed by fiscal quarter-end, oldest first

# --- Financial statements (about five quarters, newest first) ---
quarterly_income = ticker.quarterly_income_stmt
quarterly_cashflow = ticker.quarterly_cashflow
quarterly_balance = ticker.quarterly_balance_sheet

# --- Context ---
info = ticker.info
news = ticker.news
recommendations = ticker.recommendations
```

### What to extract

| Data Source | Key Fields | Purpose |
|---|---|---|
| `get_earnings_dates()` | Earnings Date, EPS Estimate, Reported EPS, Surprise(%) | Which report, when, and the beat/miss |
| `earnings_history` | epsEstimate, epsActual, epsDifference, surprisePercent | Last four quarters' results by fiscal quarter |
| `quarterly_income_stmt` | TotalRevenue, GrossProfit, OperatingIncome, NetIncome, BasicEPS | Actual financials |
| `history()` | Daily closes around each report | Stock price reaction |
| `info` | currentPrice, marketCap, forwardPE | Current context |
| `news` | Recent headlines | Earnings-related news |

---

## Step 3: Find the Report and Measure the Reaction

`earnings_history` is indexed by fiscal quarter-end, not by announcement date, so take report timing from `get_earnings_dates()`: the most recent report is the newest row with a `Reported EPS`. Its timestamp (US Eastern) sets the reaction window: at or after 16:00 means the company reported after the close; anything earlier means before the open or, occasionally, during the session. If the user asked about a specific quarter, use that row instead.

```python
def earnings_reaction(ticker, report_ts):
    """% move from the last close before the report to the first close after it."""
    daily = ticker.history(start=(report_ts - pd.Timedelta(days=10)).date(),
                           end=(report_ts + pd.Timedelta(days=10)).date())
    closes = daily["Close"]
    days = closes.index.date
    d = report_ts.date()
    if report_ts.hour >= 16:  # reported after the close: report-day close -> next close
        pre, post = closes[days <= d], closes[days > d]
    else:                     # before the open or intraday: prior close -> report-day close
        pre, post = closes[days < d], closes[days >= d]
    if pre.empty or post.empty:
        return None           # the reaction session hasn't closed yet
    return (post.iloc[0] / pre.iloc[-1] - 1) * 100

reported = earnings_dates[earnings_dates["Reported EPS"].notna()]
latest_ts = reported.index[0]
reaction_pct = earnings_reaction(ticker, latest_ts)

# Typical earnings-day move over the prior four reports
prior_moves = [earnings_reaction(ticker, ts) for ts in reported.index[1:5]]
avg_abs_move = pd.Series([abs(m) for m in prior_moves if m is not None]).mean()
```

If `reaction_pct` is `None`, the report came after the most recent close; say the regular-session reaction is still pending (an intraday `history(..., prepost=True)` call shows the after-hours move if the user wants it).

---

## Step 4: Build the Earnings Recap

Cover these areas, leading with the result:

1. **Headline result** — EPS actual vs estimate with the surprise %, revenue with year-over-year growth, and the stock's reaction.
2. **Estimates vs actuals** — EPS estimate, actual, and surprise ($ and %) for the quarter in question.
3. **Quarterly trends** — revenue, gross margin, operating margin, and EPS for the recent quarters, with margins computed from the statements (gross profit / revenue, operating income / revenue). yfinance usually returns about five quarters, so year-over-year growth is available for the latest quarter only (column 0 vs column 4); show sequential change for the others rather than inventing a comparison.
4. **Price reaction** — the move in the reaction session, how it compares with the stock's average absolute earnings move over the prior four reports, and whether the stock has since held, given back, or extended the move.
5. **What changed** — margin direction vs the prior quarter, any shift in the revenue growth trajectory, how this surprise compares with the company's usual pattern, and current analyst sentiment if available.

---

## Step 5: Respon
04

Trust audit

SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeNA
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
none-observed
Shell
none-observed
Dependencies
pinned
Secrets in source
none-found

Findings (0)

No findings outside the package's declared scope.

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 317cbce031f1full audit observations/trust-audit/skill/himself65__earnings-recap.json · Report an issue / request a re-scan
05

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-08317cbce031f1SAFEB89first audit
06

Questions

What does the Earnings Recap skill do?

A collection of skills for AI financial analysis.

Is Earnings Recap safe to install?

The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.

What can Earnings Recap access on my machine?

The audit observed no filesystem, network or shell use at all in its source.

Which assistants does Earnings Recap work with?

Its documentation mentions claude-code. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (317cbce031f1), read on 2026-10-08. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement