Generated banner for Estimate Analysis
Generated logo for Estimate Analysis

Estimate Analysis

Alex YangCommunityCreated by Alex Yang

  • Skill
  • Research and analysis
  • Data and AI
  • MIT
  • No issues found

From the author

Analyze sell-side analyst estimates and how they are changing, using Yahoo Finance data (yfinance): EPS and revenue consensus by period, estimate ranges and dispersion, revision trends over 7/30/60/90 days and up/down revision breadth, growth estimates vs industry, sector, and the S&P 500, and historical estimate accuracy. Use this skill when the user wants more than a single estimate lookup: estimate revisions or momentum, EPS trend, consensus changes, forward or next-quarter and annual estimates, the bull vs bear estimate spread, or growth projections across periods.
— the description by Alex Yang

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The Estimate Analysis skill provides a comprehensive view of market expectations for a company's financial performance. By leveraging Yahoo Finance data, it aggregates EPS and revenue consensus, tracks revision momentum over time, and compares growth projections against industry and market benchmarks. It helps users move beyond simple estimate lookups to understand the 'bull vs. bear' spread, revision breadth, and historical accuracy, offering a deeper look into how the street's sentiment is shifting.

What it does

  • Retrieves current EPS and revenue consensus estimates across multiple time periods.
  • Calculates revision momentum by comparing current estimates to those from 7, 30, 60, and 90 days ago.
  • Analyzes revision breadth to determine if analysts are predominantly raising or lowering their targets.
  • Compares company growth projections against industry, sector, and S&P 500 benchmarks.
  • Evaluates historical estimate accuracy by analyzing past earnings surprises and beat rates.
  • Identifies estimate dispersion to highlight potential market uncertainty.

When to use it

  • When you need to understand the direction of analyst sentiment before or after earnings reports.
  • When evaluating whether a company's growth outlook is accelerating or decelerating relative to its peers.
  • When you want to assess the 'bull vs. bear' spread to gauge market uncertainty.
  • When performing a deep-dive research report on a company's financial trajectory.

Advantages

  • Provides a multi-dimensional view of analyst sentiment rather than a single static number.
  • Highlights actionable trends like revision momentum and breadth.
  • Contextualizes company performance against broader market and sector benchmarks.
  • Includes historical accuracy checks to calibrate the reliability of current consensus.

Usage examples

“How have analyst estimates for AAPL changed over the last 90 days?”
The agent will retrieve the EPS trend data, calculate the percentage change for each period, and summarize whether analysts are generally revising their expectations upward or downward.
“Compare NVDA's growth estimates to the rest of the semiconductor industry.”
The agent will extract growth projections from the growth_estimates data and provide a comparative summary against the industry and sector averages.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/himself65/estimate-analysis/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip estimate-analysis.zip -d .agents/skills

Documentation by Alex Yang

Estimate Analysis Skill

If your host has not already executed the shell probes below (for example, in Codex), run the commands inside the ! wrappers with its shell tool before choosing a setup path. Use the actual output; if shell access is unavailable, report that limitation.

Deep-dives into analyst estimates and revision trends using Yahoo Finance data via yfinance. Covers EPS and revenue estimate distributions, revision momentum, growth projections, and multi-period comparisons — the full picture of where the street thinks a company is heading.

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:

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 Estimate Data

Extract the ticker from the user's request. Fetch all estimate-related data in one script.

import yfinance as yf
import pandas as pd

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

# --- Estimate data ---
earnings_est = ticker.earnings_estimate      # EPS estimates by period
revenue_est = ticker.revenue_estimate        # Revenue estimates by period
eps_trend = ticker.eps_trend                 # EPS estimate changes over time
eps_revisions = ticker.eps_revisions         # Up/down revision counts
growth_est = ticker.growth_estimates         # Growth rate estimates

# --- Historical context ---
earnings_hist = ticker.earnings_history      # Track record
info = ticker.info                           # Company basics
quarterly_income = ticker.quarterly_income_stmt  # Recent actuals
What each data source provides
Data SourceWhat It ShowsWhy It Matters
earnings_estimateCurrent EPS consensus by period (0q, +1q, 0y, +1y)The estimate levels — what analysts expect
revenue_estimateCurrent revenue consensus by periodTop-line expectations
eps_trendHow the EPS estimate has changed (7d, 30d, 60d, 90d ago)Revision direction — rising or falling expectations
eps_revisionsCount of upward vs downward revisions (7d, 30d)Revision breadth — are most analysts raising or cutting?
growth_estimatesGrowth rate estimates vs peers and sectorRelative positioning
earnings_historyActual vs estimated for last 4 quartersCalibration — how good are these estimates historically?

Step 3: Route Based on User Intent

Match the depth of the analysis to the question:

User RequestFocus AreaKey Sections
General estimate analysisFull analysisAll sections
"How have estimates changed"Revision trendsEPS Trend + Revisions
"What are analysts expecting"Current consensusEstimate overview
"Growth estimates"Growth projectionsGrowth Estimates
"Bull vs bear case"Estimate rangeHigh/low spread analysis
Compare estimates across periodsMulti-periodPeriod comparison table

A general request gets the full analysis; a narrow question gets the matching sections.


Step 4: Build the Estimate Analysis

Section 1: Estimate Overview

Present the current consensus for every available period (0q, +1q, 0y, +1y) from earnings_estimate and revenue_estimate: consensus, low, high, range width (as a % of consensus), analyst count, and YoY growth. Flag:

  • Range width — ranges wider than 15% of consensus signal high uncertainty

  • Analyst coverage — fewer than 5 analysts means thin coverage

  • Growth trajectory — whether growth accelerates or decelerates across periods

Often the most actionable section. From eps_trend, show each period's current estimate against its value 7, 30, 60, and 90 days ago, and summarize the direction and whether the recent moves are accelerating.

How to read it:

  • Rising estimates ahead of earnings = positive setup (the bar is rising)

  • Falling estimates = analysts cutting numbers, often a negative signal

  • Flat estimates = no new information being priced in

  • Recent acceleration or deceleration matters more than the total move

Section 3: Revision Breadth (EPS Revisions)

From eps_revisions, show up vs down revision counts over the last 7 and 30 days for each period, and the revision ratio Up / (Up + Down). Ratios above 0.7 are strongly bullish; below 0.3 are bearish.

Section 4: Growth Estimates

From growth_estimates, compare the company's expected growth for each period (and its past 5-year annual growth) with its industry, sector, and the S&P 500, and say whether it is expected to grow faster or slower than its peers.

Section 5: Historical Estimate Accuracy

From earnings_history, show estimate vs actual EPS and the surprise % for the last four quarters, then assess:

  • Beat rate — how many of the four quarters beat

  • Average surprise — magnitude and direction

  • Trend in surprise — are beats getting bigger or smaller? A shrinking surprise with rising estimates can mean the bar is catching up to reality.


Step 5: Synthesize and Respond

Lead with the key insight — the direction and breadth of revisions across periods — then show the tables for the sections the user cares about. Interpret rather than just tabulate: does the revision trend confirm or contradict the stock's recent price action, how does the growth outlook compare with what the current P/E prices in, and what does the estimate-accuracy history say about today's consensus?

Flag the nuances that apply: estimates cluster around consensus, so the real distribution of outcomes is wider than low/high suggests; revision momentum can reverse on a single guidance change or macro event; Yahoo Finance estimates can lag real-time consensus providers by hours or days; out-year (+1y) estimates are inherently less reliable. Close with the standing caveats: analyst estimates reflect a consensus view, not certainty; revisions are a signal, not a guarantee; this is not financial advice.


Reference Files

  • references/api_reference.md — Detailed yfinance API reference for all estimate-related methods

Read the reference file when you need exact return formats or edge case handling.

Files

references/api_reference.md

Estimate Analysis — yfinance API Reference

Detailed reference for the yfinance estimate and analysis methods.


Earnings Estimate

ticker.earnings_estimate

Returns a DataFrame indexed by period with columns:

  • numberOfAnalysts — analyst count

  • avg — consensus average EPS

  • low — lowest EPS estimate

  • high — highest EPS estimate

  • yearAgoEps — EPS from same period last year

  • growth — expected growth rate (decimal: 0.127 = 12.7%)

Periods:

  • 0q — current quarter

  • +1q — next quarter

  • 0y — current fiscal year

  • +1y — next fiscal year


Revenue Estimate

ticker.revenue_estimate

Same period structure as earnings_estimate. Columns:

  • numberOfAnalysts

  • avg — consensus revenue

  • low, high — range

  • yearAgoRevenue — revenue from same period last year

  • growth — expected growth rate (decimal)

Note: Revenue figures are in raw numbers. Format for display:

def format_revenue(val):
    if val >= 1e12: return f"${val/1e12:.1f}T"
    if val >= 1e9:  return f"${val/1e9:.1f}B"
    if val >= 1e6:  return f"${val/1e6:.1f}M"
    return f"${val:,.0f}"

EPS Trend

ticker.eps_trend

Shows how the EPS consensus has changed over time. Returns a DataFrame with:

Index: same periods (0q, +1q, 0y, +1y) Columns:

  • current — current estimate

  • 7daysAgo — estimate 7 days ago

  • 30daysAgo — estimate 30 days ago

  • 60daysAgo — estimate 60 days ago

  • 90daysAgo — estimate 90 days ago

Usage: Calculate the change over each window to identify revision momentum:

trend = ticker.eps_trend
for period in trend.index:
    row = trend.loc[period]
    change_90d = row['current'] - row['90daysAgo']
    change_30d = row['current'] - row['30daysAgo']
    pct_change_90d = change_90d / abs(row['90daysAgo']) * 100
    print(f"{period}: {change_90d:+.2f} ({pct_change_90d:+.1f}%) over 90 days")

EPS Revisions

ticker.eps_revisions

Shows the count of upward and downward estimate revisions. Returns a DataFrame with:

Index: periods (0q, +1q, 0y, +1y) Columns:

  • upLast7days — number of upward revisions in last 7 days

  • upLast30days — number of upward revisions in last 30 days

  • downLast7days — number of downward revisions in last 7 days

  • downLast30days — number of downward revisions in last 30 days

Revision ratio (useful metric):

revisions = ticker.eps_revisions
for period in revisions.index:
    row = revisions.loc[period]
    total_30d = row['upLast30days'] + row['downLast30days']
    if total_30d > 0:
        ratio = row['upLast30days'] / total_30d
        print(f"{period}: {ratio:.0%} bullish ({row['upLast30days']} up, {row['downLast30days']} down)")

Growth Estimates

ticker.growth_estimates

Returns a DataFrame comparing the company's growth rates to benchmarks.

Index (rows): growth periods

  • Current Qtr or 0q

  • Next Qtr or +1q

  • Current Year or 0y

  • Next Year or +1y

  • Past 5 Years (per annum) — historical annual growth

  • Next 5 Years (per annum) — projected annual growth (PEG ratio basis)

Columns: entity names

  • The ticker symbol (e.g., AAPL)

  • Industry — industry average

  • Sector — sector average

  • S&P 500 — market average (may appear as S&P 500 or index)

Values are in decimal form (0.127 = 12.7%). Some cells may be NaN if data is unavailable.


Earnings History

ticker.earnings_history

Returns a DataFrame with the last 4 quarters:

Columns:

  • epsEstimate — consensus at time of reporting

  • epsActual — reported EPS

  • epsDifference — actual minus estimate

  • surprisePercent — in decimal form (0.037 = 3.7%)

Index (quarter): fiscal quarter-end dates, oldest first — not announcement dates (use ticker.get_earnings_dates() for those)


Combining Estimate Data

For a comprehensive analysis, fetch all estimate data together:

import yfinance as yf
import pandas as pd

t = yf.Ticker("AAPL")

# All estimate data
data = {
    'earnings_estimate': t.earnings_estimate,
    'revenue_estimate': t.revenue_estimate,
    'eps_trend': t.eps_trend,
    'eps_revisions': t.eps_revisions,
    'growth_estimates': t.growth_estimates,
    'earnings_history': t.earnings_history,
}

# Check what's available
for name, df in data.items():
    if df is not None and not (hasattr(df, 'empty') and df.empty):
        print(f"{name}: {df.shape}")
    else:
        print(f"{name}: NO DATA")

Error Handling

try:
    est = ticker.earnings_estimate
    if est is None or (hasattr(est, 'empty') and est.empty):
        print("No earnings estimates — may lack analyst coverage")
except Exception as e:
    print(f"Error: {e}")

Common issues:

  • No estimates: Small-cap or foreign stocks may have no analyst coverage

  • Partial data: Some periods may have data while others are NaN

  • Stale data: Yahoo Finance may not reflect the most recent revision; note lag to user

  • Growth estimates missing benchmarks: Industry/sector/S&P columns may be NaN for some companies

  • EPS trend columns: Column names may vary slightly — check df.columns if expected names don't match

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Python

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Alex Yang
Publisher
Alex Yang (Community)
Source
himself65/finance-skills · plugins/market-analysis/skills/estimate-analysis · commit a085078
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Alex Yang or Alex Yang.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download estimate-analysis.zip