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
Install
$ npx -y skills add rgourley/quant-garage --skill valuation-sanity-check --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/valuation-sanity-check

Context preview

The summary Claude sees to decide when to auto-load this skill.

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,

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
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.

Get the whole plugin
Stats
7
Stars
0
Forks
Active
Maintenance
Python
Language
4d ago
Last commit
2mo ago
Created

Repo: rgourley/quant-garage

Other skills on quant-garage.