Skip to content
Data
Skill

/valuation-sanity-check

Sanity-check an internal analyst valuation thesis against the live peer set. Input the target price, assumed revenue growth, assumed EBITDA margin, and horizon; the skill pulls the current name, builds the peer cohort, computes target-implied multiples vs the peer 25-75 band,

From plugin
quant-garage
761 skills

Claude Code

$ npx -y skills add rgourley/quant-garage --skill valuation-sanity-check --agent claude-code

SKILL.md

valuation-sanity-check.SKILL.md
name: valuation-sanity-check
description: Sanity-check an internal analyst valuation thesis against the live peer set. Input the target price, assumed revenue growth, assumed EBITDA margin, and horizon; the skill pulls the current name, builds the peer cohort, computes target-implied multiples vs the peer 25-75 band, compares the growth and margin assumptions to the peer distribution, runs a simplified reverse-DCF, and emits either a single-point fair-value estimate or a full fair-value distribution (--mc flag) as a one-page sell-side flash note answering "is this target defensible or has the model drifted from reality." Use when a banker, PM, or analyst is stress-testing a price target or pitch-deck valuation. Requires Stocks Starter.

valuation-sanity-check

You hand over a subject ticker and the thesis: `target_price`, `assumed_growth`, `assumed_margin`, `horizon_years`. The skill pulls the current price, market cap, balance sheet, and TTM financials, builds the peer set using the same waterfall as `pitch-comps` (curated override → correlation → SIC fallback), pulls peer multiples and growth/margin metrics, and emits a one-page flash note covering four sanity checks.

This is the "is the model defensible or has it drifted" workflow. The take at the top says whether the target survives the peer-distribution sanity check; the four supporting sections show where the air is.

When to invoke

  • A banker is stress-testing an MD's pitch-deck target price
  • A PM is reading a sell-side note that says "$250 target" and wants

to know what's already baked into the current price

  • A junior analyst handed off a model and you need to figure out

whether the assumptions are defensible vs the peer set

  • The user says "sanity-check $TICKER target $X", "is $X realistic

for $TICKER", "what growth does the current price assume"

What you need

  • A subject ticker (NVDA, CRM, etc.)
  • The analyst's thesis: `target_price` (USD/share), `assumed_growth`

(decimal, e.g. 0.28 for 28%), `assumed_margin` (decimal, e.g. 0.60 for 60%), `horizon_years` (integer, default 5)

  • `MASSIVE_API_KEY` exported in the environment
  • Stocks Starter plan minimum. The full peer fanout is the same

~9 ticker-details + ~9 financials calls as `pitch-comps`; under 30 seconds on Starter, ~5 min on free Basic.

What you get back

Two output layers from one analysis.

**Layer 1: canonical JSON** matching [`output-schema.json`](./output-schema.json). Subject metadata, analyst inputs, three sanity-check blocks (`multiple_sanity[]`, `growth_sanity`, `margin_sanity`), the `reverse_dcf` block, peer list with each peer's contributing data, the bold take, the closing read, and per-call source endpoints with fetched-at timestamps.

**Layer 2: rendered note** in sell-side flash-note style, modeled on `earnings-drilldown` note mode. See [`references/rendering.md`](./references/rendering.md). Bold take at the top, three sanity sections, reverse-DCF block, closing read.

How it works

1. **Pull the subject's live state.** Snapshot for current price (via the standard `lastTrade → day.c → prevDay.c → fmv` waterfall), ticker details for shares outstanding and market cap, financials for TTM revenue, operating income, D&A, balance sheet (long-term debt). Same data layer as `pitch-comps`. 2. **Compute target-implied financials.** `target_mcap = target_price × shares_outstanding`. `target_EV = target_mcap + long_term_debt` (cash not subtracted; documented in [`references/multiple-sanity.md`](./references/multiple-sanity.md)). `target_revenue_horizon = subject_revenue_ttm × (1 + assumed_growth)^horizon`. `target_ebitda_horizon = target_revenue_horizon × assumed_margin`. `target_eps_horizon` derived from the operating-margin-implied net income. 3. **Build the peer set** per [`references/peer-selection.md`](./references/peer-selection.md). Reuses the pitch-comps three-layer waterfall and the shared override map. 4. **Pull peer multiples and metrics.** Same per-peer fanout as `pitch-comps`: current price, market cap, TTM financials. Compute each peer's EV/Sales, EV/EBITDA, P/E, revenue growth TTM, EBITDA margin. 5. **Multiple sanity** per [`references/multiple-sanity.md`](./references/multiple-sanity.md). For each multiple (EV/Sales, EV/EBITDA, P/E), compute the target-implied value at the horizon and compare to the peer 25-75 percentile band. Status: `in_line` (inside band), `above` (above p75), `below` (below p25). 6. **Growth and margin sanity** per [`references/growth-margin-sanity.md`](./references/growth-margin-sanity.md). Compare the analyst's `assumed_growth` and `assumed_margin` to the peer 25-75 bands on revenue growth and EBITDA margin. Same status labels. Records the `delta_pp` (assumed minus peer median, in percentage points) so the reader can quote the gap. 7. **Reverse-DCF** per [`references/reverse-dcf.md`](./references/reverse-dcf.md). At the current stock price, given the assumed margin and the peer-median EV/EBITDA exit multiple, what 5-year revenue CAGR is implied? Compare to peer-median 5y CAGR (proxied from TTM growth when 5y history is missing). Surfaces "air in the current price": the gap between the implied CAGR and the peer-median CAGR. 8. **Generate the take and the read** per [`references/take-generator.md`](./references/take-generator.md). Bold take at the top in one paragraph: the CAGR/margin the target requires and how far it sits from peer median. Closing read at the bottom: if you trim assumptions to peer median, where does the target land. Banker-tone, no hedge words.

Foundations used

  • [`massive-api-patterns`](../massive-api-patterns) for REST auth, rate

limiting, the snapshot fallback chain, and the financials-endpoint null-handling.

Output mode: note

Same note mode as `earnings-drilldown`. Bold take at top, grouped supporting sections, closing read, one-page max. The format follows the s

Read more
@rgourley
Ships withquant-garage

Trade like a pro. Without the terminal. View the full landing page → Quant and equity research tools that run inside Claude, or behind your own UI.

Stars on GitHub

Momentum

stars in total
7
Star history of rgourley/quant-garage on GitHub, a chart by star-history.com

Other skills on quant-garage.

8-k-scanner

8-k-scanner

Scan SEC 8-K disclosures across a single ticker or a watchlist using Massive's pre-parsed disclosure taxonomy. Groups the…

analyst-tracker

analyst-tracker

Track sell-side analyst positioning on a name via Benzinga Analyst Ratings. Pulls every rating event over the lookback window,…

backtest-data-prep

backtest-data-prep

Build a clean, point-in-time, ready-to-backtest OHLCV dataset for a US equity universe across an arbitrary date window. Emits…

commodity-cycle

commodity-cycle

Single-commodity macro read. Answers "is this commodity in a winning or losing macro setup right now" and names the macro driver…

More skills from other plugins.

context-loader
Auto-invoked

context-loader

Search memories from earlier Pi sessions in this repository. Use it when earlier work may already explain the code, error,…

mem05d69k
@mem0ai@mem0aiInstall Skill
analyzing-ai-citations

analyzing-ai-citations

Answer AI citation and answer engine optimization (AEO) questions in PostHog: whether AI answer engines (ChatGPT, Claude, and an…

posthog12d41k
@posthog@posthogInstall Skill

Questions about valuation-sanity-check.

Which coding agents can use valuation-sanity-check?
valuation-sanity-check installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.