JARVIS COMMAND CENTER

Overview Breadth Research Lab Backtests Volatility Bayesian Cross-Series Portfolio Growth/Value VIX Rates Options Trading Intraday Intraday A/D One Pager Berg Signals Entropy Forensic Valuation Earnings ETF Rotation Factor Lab Leveraged Pairs LP Options Macro SMA Filter Books

Price Series

Lookback:
| Custom: to

Current Signals

Lookback:
| Custom: to View Regime Signals Research Bloomberg Queue

Latest Day — Advancers vs Decliners

Cumulative A/D Line

% Members Above SMA & Trend

Short-term: % Above SMA(10) & SMA(20)
Long-term: % Above SMA(50) & SMA(200)
Trend: SMA(10)>SMA(20) & SMA(50)>SMA(200)

Distance-from-SMA — Cross-Section (magnitude, not sign)

Center: Bands:
SMA(50) — % distance from 50-day SMA (zero baseline; green above, red below)
SMA(200) — % distance from 200-day SMA
Bollinger Squeeze — Band Width (20-period BB on mean-dist; dashed = 1-yr 25th-pct threshold; badge fires when SMA(50) BBW below threshold)

MACD (19, 39, 1) — A/D Line & Overlay (signal=1 ⇒ EMA(1) of MACD is MACD, so no signal line or histogram)

EMA(19) − EMA(39) of the Cumulative A/D Line (left axis) and of the selected Overlay (right axis) — each axis zero-centered so the zero line is shared

McClellan Oscillator & Summation Index (RAMO — methodology-dependent)

Oscillator: EMA(19) − EMA(39) of ratio-adjusted A−D
Summation Index: cumulative sum of oscillator

Constituents — Drill-Down

Loading…
Autoresearch — Experiment Log
Loading experiments...
MA Sweep Results

SMA Crossover Heatmap

EMA Crossover Heatmap

Single MA Comparison
Loading...
Knowledge Base — Indicator Research
📊 Adaptive Kalman Filter
Theory, variants (Sage-Husa, IMM, Robust), financial applications (trend, pairs, beta, breadth smoothing), comparison vs SMA/EMA/HP. Implementation: finance/indicators/kalman_adaptive.py. Testing plan: plans/akf-testing-plan.md.
Added 2026-08-06 · Status: Implementation planned
📈 SMA 10/20 Market Filter
Dual SMA trend filter as market regime gate. Backtest results SPY 1993–2026. Connors/Alvarez methodology. Use as gate not standalone.
Added 2026-07-26 · Status: Live (see SMA Filter tab)
Finance Research Lab — Studies
Loading studies...
Out-of-Sample Validation
Loading...
MA Crossover Walk-Forward
Model Comparison
Volatility Regime Analysis

Realized Volatility (21d EMA)

Lookback:
| Custom: to
Vol Ratio Threshold Sweep
Loading...
Vol Regime Continuation Rates
Loading...
Bayesian Signal Analysis — P(positive return | signal)
Loading...
MA Spread Predictive Value
Loading...
Cross-Series Leaderboard — 49 Series (7 Tickers + 42 Ratios)
Full Leaderboard
Loading cross-series data...
File Paths
Growth vs Value Rotation
Loading growth/value data...
Lookback:
| Custom: to

VONG/VONV (Russell 1000)

VUG/VTV (Vanguard)

Rotation Backtest — Always 100% Long
Loading rotation data...
GV Signals on GLD/AGG
Loading...
Standalone Ratio Backtests
Loading...

Signal Tearsheet

Loading...
Loading...
Loading...

Cumulative Returns

Drawdown (%)

Signal Tearsheet — Page 2

Monthly Returns (%)

Yearly Returns (%)

Time Range:
Custom:
VIX Futures Term Structure
Compare dates:
Dot color = contract expiry (tracks across dates) · Hover Spot History below to preview curves
Contango Mode:
VIX Spot History
Contango / Backwardation History
Related Volatility Indices
Volatility Compression Watch — Vixologist Squeeze Template 📄 docs
TTM Squeeze Status
Computing...
BBand Width %
vs 20d rolling mean
StdDev(10) Compression
current vs 20d MA
SPX Trend (3d)
Setup requires uptrend
6-Month Realized Volatility (StdDev 10-Day) — Compression Zones Highlighted
Light red zones = StdDev below 25th percentile (compression state). Thrasher framework: compression under buy pressure → explosive release. Cross-ref: Thrasher 2017 paper + Lakha correlation divergence
Docs: Vixologist Template (what & why) · Thrasher 2017 Paper (full methodology) · Compare both
Memory: reference_vixologist_thrasher_squeeze.md · reference_options_insight_imran_lakha.md · Sentinel: svix-squeeze-check (4:00 PM ET)
VIX Dispersion (Thrasher 2017) — Paper-Faithful Signal 📄 docs
VIX Signal
StdDev(20) vs 15th pct
VIX 20-Day StdDev
threshold: —
StdDev Percentile
vs full history
VVIX Signal (secondary)
15th pct of VVIX StdDev(20)
VIX 20-Day Standard Deviation vs Threshold (1Y) — Signal Days Marked
Blue line = VIX 20d StdDev. Dashed = 15th-percentile threshold (adaptive to full history). Red markers = signal-fired days (StdDev ≤ threshold with 10-day dedup).
Docs: Thrasher 2017 Paper (full methodology) · Vixologist Template (comparison) · Compare both
Memory: reference_thrasher_paper_methodology.md · Source PDF: /var/lib/jarvis/personal/research/papers/thrasher-2017-forecasting-volatility-tsunami.pdf · Sentinel: vix-dispersion-check (4:05 PM ET)
Active Strategy Signals
Loading strategy signals…
Library: finance/strategies/vix_library.json · Evaluator: finance/scripts/eval_strategies.py · Pipeline stage: strategy_eval (daily, depends on rv_compute + skew_capture + bubble_bounds) · API: /api/finance/strategies
VIX Spikes (Last 5 Years)
Loading...
Short-End Term Structure & Contract Roll
Today: Spot & Near-Dated Futures
Spot + M1 + M2, including first contract past 60 DTE. Dot color = contract identity (shared with spread charts below).
M1 − Spot Spread (Front Month vs VIX)
M2 − Spot Spread (2nd Month vs VIX)
M1 − M2 Spread (Short-End Contango, Raw Points)
Raw vol points (M2 settle − M1 settle). M1/M2 identity rolls on the Wednesday exactly 14 calendar days before the front contract's expiry — earlier than the actual-expiry roll used in the M1/M2 vs Spot charts above.
Line color flips at each contract roll — segments are colored by which contract was the M1/M2 on that date, matching dot colors on the short-end curve above and the full term structure chart at top.
KEY RATES
BREAKEVEN INFLATION
MACRO CONTEXT
EQUITY REPO
Source: Capital Flows STIR Replication Playbook · Live data — Yahoo chart API (SR3 + ZQ futures) + NY Fed EFFR/SOFR CSV + FRED (DGS2/5/10/30, T5YIE/T10YIE, PSAVERT). Refresh: weekdays 16:30 ET.
Synthetic ATM Straddle — Bloomberg Methodology
Options Chain Snapshot
Underlying:
Loading options data...
Put/Call Ratio & Volume
IV Overview
Open Interest by Strike
Data Sources
Active: Polygon.io (via Massive MCP) — chains, historical OHLC, contract reference
Available: Theta Data ($80/mo — tick-level + Greeks), ORATS ($99/mo — backtester), DeltaNeutral ($575/yr — 20yr EOD)
Libraries: py_vollib (pricing/Greeks), Optopsy (backtesting), polygon-api-client
Full reference: /var/lib/jarvis/personal/finance/research/options/OPTIONS_DATA_SOURCES.md
Paper Trading Account
Open Positions
Loading positions...
Submit Order
Recent Orders
Loading orders...
Equity Curve
Kalman Pairs Signal — TLT/IEI
Status
Loading…
Rolling Sharpe vs OOS Benchmark (0.670)
Paper Equity Curve
Paper equity from Alpaca account (strategy + cash). Phase 3 tracking started 2026-06-26. Graduation gate: 8-week rolling Sharpe > 0.50.
Intraday 1-Min Bars
Stored Data Summary
Loading ticker summary...
Intraday Breadth — 9 Indices, 2 Methodologies
A = probe vs yesterday's adj close · B = vs prior 5-min bar · Auto-refresh 60s  ·  raw JSON
Live Signal Monitor
Loading portfolio data...
Pareto Frontier — Non-Dominated Solutions
Loading...
Full Rankings (Top 20)
Loading...
Signal Changes
No changes detected
Improvement History
Loading...
Risk Monitor — Correlation & Volatility
Loading risk data...
Post-2010 calibration only. Gate G2: 8/16 = 50% on full 1957-2026 precedent set. The 4 live combos (C2/C4/C6/C10) have demonstrated efficacy in recent regime. Use with care — blocked combos (C1/C3/C5/C7/C8/C9/C11) excluded from production.
Methodology & Sources
Internal docs
Plan: berg-atomic-indicators.md Indicator catalog (30k+ → 11 combos) Combos source (berg_combos.py) Atoms source (berg_atoms.py) Gate G2 harness
External (Berg's own material)
Shapiro/Berg interview (YouTube) @bergmilton (Twitter/X) miltonbergedge.com (retail $10/mo) miltonberg.com (institutional)
Today's Signal Status
Loading...
Combo Charts (click to view price + fire markers)
Historical Fires
Loading...
Suggested Stop (live signals)
Calculated from signal close minus (historical max_dd + 0.5% buffer). Only shown for signals where max_dd_60d is available.
Loading...
Forensic Accounting Screener
⚠ Threshold Breaches (literature thresholds — dashboard-only)
Loading...
Four deterministic forensic scores per 10-K (annual): Beneish M (earnings manipulation likelihood), Altman Z (bankruptcy proximity), Sloan accruals (earnings quality), Piotroski F (financial strength). Source: SEC EDGAR via edgartools; computed nightly. Literature thresholds — Beneish M>-1.78 = aggressive; Altman Z<1.81 = distress; Sloan >+0.10 = high accruals; Piotroski ≤2 = weak. Plan: forensic-scores-nightly.md.
Latest 10-K Scores
Ticker Period Beneish M Altman Z Sloan Piotroski F Quality
Enter a ticker to see all scored filings.
Plan & Lessons
Recent Screener Runs
Loading...
Earnings Tracker
This Week’s Earnings
Loading…
Historical Reaction Profile
Enter a ticker above to see historical earnings reaction data.
Hypothesis Matrix — All Tickers
Loading…
Phase Tracker
Status Phase Scope Completed
✓ DONEPhase 0Placeholder tab + open questions captured for Rob2026-07-23
✓ DONESpec7/7 design questions locked (JDEC-20260803-010 through -018); vintage-data principle + dedup falsification2026-08-03
✓ DONEPhase 1Data pipeline: schema (migration 047), EDGAR 8-K fetcher, reaction computer (1D/5D/20D), RSS real-time poller + daily sweep cron (A+C hybrid, JDEC-20260803-016)2026-08-03
✓ DONEPhase 2Calendar UI: this-week earnings table (ticker, timing BMO/AMC, EPS actual, 1D/5D/20D reactions); live from earnings_actuals + earnings_calendar via API2026-08-03
✓ DONEPhase 3Reaction profile: per-ticker historical EPS prints + 1D/5D/20D returns; quintile bucket engine (≥5 prints); ticker lookup UI2026-08-03
✓ DONEPhase 4Hypothesis matrix: 5-bucket EPS-surprise × 3-horizon aggregate table; per-bucket ticker list; auto-refines as pipeline populates data2026-08-03
Open Questions — answer to unblock the build
Click any question to expand it. Supporting context inside each one is drawn from our existing data sources, conventions, and trade-offs — everything you need to make the call. Resume on Telegram when ready; we'll walk these one at a time.
1. Companies scope ✓ ANSWERED — FULL UNIVERSE
✓ Rob, 2026-08-03 — FULL UNIVERSE. Verbatim: “track every ticker that has earnings… all tickers, all symbols and all earnings tracked and recorded.” Equities not currently in a portfolio or watchlist need to be built out — universe expansion is in scope, not a side effect. None of the four options below apply; they are kept for provenance. Decision JDEC-20260803-010.

⚠ Gap: research.db holds only 3,295 distinct tickers vs ~11k US listed; factor_universe is 0 rows. Open loop #766.
Which set of companies should this page track? A specific hand-picked watchlist, or auto-derive from an existing dashboard/portfolio universe?
Why it matters: Every other design decision (data volume, refresh cost, display density) scales with this number. A 20-name focused watchlist is very different from "all names in the Factor Lab universe."
Options
Hand-pickedYou maintain a curated list (e.g. 20–50 names you actively follow). Simplest; lowest data cost; nothing slips in accidentally.
Portfolio-derivedAuto-pull from whatever is currently in the Alpaca portfolio + watchlist. Always in sync; zero manual maintenance.
HybridHand-picked core + auto-supplement from portfolio. Recommended if the watchlist and live positions overlap but aren't identical.
Index-basedAll NDX-100 or S&P 500 names — broadest coverage; highest data volume; less focused.
What we have today: Full R3K universe (2,929 tickers) in research.db. Alpaca portfolio positions live via API. NDX-100 and SPX constituent lists available. A hand-picked watchlist would need a new small config file (e.g. data/earnings-watchlist.json).
2. Earnings data source ✓ ANSWERED — EDGAR-FIRST
✓ Rob, 2026-08-03 — EDGAR-first + multi-source corroboration. Verbatim: “start with EDGAR first for earnings… also look for other public announcements. Find the most up-to-date sources including news or places such as Bloomberg.com or Google Finance, Yahoo Finance, etc. Capture the data as soon as possible and also make sure that it’s verified and correct.” Two requirements beyond source choice: (a) latency — capture ASAP; (b) verification — cross-source confirmation. Consensus estimates DEFERRED (paid at full-universe scale). Decision JDEC-20260803-011.

Build to the standing data principles, not a bespoke scheme: sources independent (own fetcher + raw archive each, reconcile on backend, missing is missing); provenance on every row (source + fetched_at + raw_path, corrections supersede never overwrite); batched into shared windows. Reuse the wired EDGAR client finance/forensics/edgar_fetcher.py — do not build a second one.
⚠ The “Recommended path” below is FALSIFIED. Probed live 2026-08-03 — it was written from vendor docs, never tested against our key: /benzinga/v1/earnings 403, /tmx/v1/corporate-events 403, /stocks/financials/v1/income-statements 403. Only /v3/reference/tickers works, and the tier 429s after ~5 rapid calls (~5 req/min). Full-universe scope kills any per-ticker source. Kept below for provenance. Lesson: lesson_spec_recommended_source_is_untested_hypothesis.
Where do the consensus EPS estimate, estimate range (low/high), and the report date/time come from? How current does it need to be — real-time, daily refresh, or manual?
Why it matters: The data source determines what's free vs paid, how fresh the estimates are, and how much maintenance it takes to keep them live. Stale estimates make the calendar misleading.
Options
yfinanceFree, automated. ticker.calendar returns next earnings date + EPS estimates. ticker.earnings_dates gives historical prints. Works today with no new keys. Risk: Yahoo changes its internal API without notice (broken several times in the past 3 years).
Polygon/MassiveAlready wired. /vX/reference/financials provides historical EPS actuals but not forward consensus estimates on our free/starter tier. Good for backtesting past surprises; can't source next-quarter estimates.
Bloomberg CSVInbox at /var/lib/jarvis/inbox/bloomberg/ — Rob drops a CSV, Jarvis ingests it. Highest quality; fully manual; no automation possible without a paid Bloomberg API.
Manual entryRob types the key numbers into a config file or dashboard UI before each earnings week. Lowest dependency; highest friction.
Recommended path: yfinance for schedule + estimates (daily cron), Polygon for historical actual EPS (to backtest surprises). yfinance covers the estimate-range question out of the box (earningsLow, earningsHigh, earningsAverage, analyst count). Manual Bloomberg drop as an override path if yfinance data looks wrong.
3. Price-reaction hypothesis basis ✓ ANSWERED — DATA-DRIVEN
✓ Rob, 2026-08-03 — DATA-DRIVEN with iterative refinement. Verbatim: “It needs to be primarily data driven. We will need to research and build models for expectations, basically reaction functions in which we expect the price to do a specific thing tied to what the earnings number is. Then we can test the hypothesis against reality to improve over time.” Method: for each ticker, backtest historical EPS actuals (EDGAR) against next-day/next-week price returns, compute empirical reaction per earnings tier, surface the baseline to Rob for annotation and refinement. Iterative: patterns confirm or refute as new prints land. Decision JDEC-20260803-012.
What we have today: Full daily price history in research.db. EDGAR 8-K filings already wired via edgar_fetcher.py — historical EPS actuals parseable from Item 2.02 exhibits. The backtest engine is ~200 lines of Python given existing infrastructure. Polygon /vX/reference/financials available as a cross-check for large-caps.
4. Earnings surprise buckets ✓ ANSWERED — FIVE-LEVEL
✓ Rob, 2026-08-03 — FIVE-LEVEL bucketing. Verbatim: “We also need ways to quantify things such as possibly a five-level system much worse than expected, slightly worse than expected in line with expectations, slightly better than expected, much better than expected.” Buckets (mapped to YoY EPS growth): 1. Much worse (<−15% YoY), 2. Slightly worse (−15% to −5%), 3. In-line (−5% to +5%), 4. Slightly better (+5% to +15%), 5. Much better (>+15% YoY). These become the rows of the hypothesis matrix; price reaction is computed per bucket per horizon (Q5). Decision JDEC-20260803-013.
Data available: EDGAR actuals going back 10+ years for most issuers via edgar_fetcher.py. YoY computation is a single join on (ticker, fiscal_quarter). research.db has 3,295 tickers with daily price history for backtest correlation. Threshold refinement via iteration as more prints land.
5. Time horizons ✓ ANSWERED — 1D + 5D + 20D
✓ Rob, 2026-08-03 — 1D + 5D + 20D. Immediate reaction (1D), short-term follow-through (5D), and one-month reversion check (20D). These become the columns of the hypothesis matrix; rows are the five earnings buckets from Q4. No new data fetch required — daily closes in research.db cover all three horizons. Decision JDEC-20260803-014.
6. Pre-market / after-close timing
Does the reaction measurement account for when a company reports? "Before open" (BMO) vs "after close" (AMC) changes what "1-day reaction" even means.
Why it matters: If NVDA reports after close on Tuesday, the first chance the regular-hours market can react is Wednesday's open. Measuring from Tuesday's close to Wednesday's close is 1D. But if AAPL reports before open on Wednesday, the market reacts at Wednesday's 9:30 open and you measure Wednesday's close vs Tuesday's close — same calendar-day but different "event day 0" logic.
Options
Event-day alignedRecommended. Define "event day 0" as the first trading session where the market can react: for AMC reports that's the next calendar day; for BMO that's the report day itself. All returns measured from that session's open (or prior close). Consistent across the universe.
Calendar-day naiveAlways measure from the date the report is filed, regardless of time. Simple but mixes AMC/BMO effects — an AMC report's "1D" return would capture only 1 actual trading session of reaction, not 1 full day of reaction.
Display only, no backtestShow the report time on the calendar as context, but don't incorporate timing into the hypothesis math — use calendar-day naive for the backtest and note the caveat. Faster to build; less rigorous.
Data available: Report time (BMO/AMC/unconfirmed) is typically included in earnings-calendar feeds (yfinance ticker.calendar, Polygon earnings events). We can capture and store it alongside the date. Aligning the event-day baseline adds ~10 lines to the backtest logic.
7. Data maintenance cadence
Who keeps the earnings schedule + consensus estimates fresh, and how often? This decides whether the page is a living dashboard or a manual one.
Why it matters: Earnings dates shift (companies reschedule), estimates move as analysts update throughout the quarter, and whisper numbers diverge from consensus in the days before the print. A stale calendar is actively misleading.
Options
Automated dailySentinel cron (e.g. nightly at 11 PM ET) re-fetches schedule + estimates for the next 2 weeks via yfinance. Zero manual work after setup. Handles date changes and estimate revisions automatically. Risk: yfinance reliability (see Q2).
Weekly on SundayPull the upcoming week's calendar every Sunday morning. Less overhead than daily; fine if estimates don't move much intra-week for the names you follow. One missed Sunday = stale week.
On-demand (manual trigger)Rob sends a command or clicks a refresh button before each earnings week. Highest reliability (you decide when to pull); most friction.
Manual CSVRob drops a CSV into the inbox before each earnings week. Same pattern as Bloomberg ingestion. Simple, offline-capable; entirely manual.
Our automation patterns: We already run ~40 sentinel crons. Adding an earnings-calendar-refresh cron is a 1-hour build. The nightly universe refresh and breadth pipelines show this pattern works reliably. Recommended: automated daily at 11 PM ET, with a manual override button on the dashboard to force an immediate refresh.
Damodaran Valuation Integration
Valuation Surface — Live
Decision surface: cross-section ScreenerPer-Ticker Valuation → Industry / Country browsers → EV-Premium tracker. Nightly RUA run (02:30 ET): WACC 2,929/2,929, DCF ~88 (Financials/REITs excluded correctly since Approach A; was 121 pre-guards), multiples 171 (gated by XBRL backfill). ✓ DCF input guards + XBRL unit-writer fix shipped 2026-07-13 (sector-aware growth cap, WACC floor, FCF scale guard, Financials/REIT exclusion; XBRL unit column corrected). Screener shows clean / suspect / flagged tiers. Remaining: XBRL value-scale errors on systematic wrong-scale filers (AEP, CALM — unit now correct, value still wrong for this subset).
Aswath Damodaran's intrinsic-valuation toolkit applied across the full equity universe: DCF (four value drivers: growth, margins, reinvestment, discount rate), WACC bottom-up from industry betas, implied ERP, relative multiples with peer z-scores, country risk premium. Source: NYU Stern annual dataset release.

Domain boundary: the existing Forensic tab answers "can I trust the numbers?" — this tab will answer "given the numbers, what is it worth?". Forensics is a quality gate; valuation is a decision input. Orthogonal domains sharing the EDGAR source data.
Phase Tracker
Status Phase Scope Completed
✓ DONEPhase 0Memory reference + plan + placeholder tab2026-06-04
✓ DONEPhase 1Static datasets ingest — 4 tables in research.db (industry metrics 94, country risk 178, ERP history 66, asset returns 98); sentinel cron damodaran-datasets-annual Jan 15 09:00 ET2026-06-04
✓ DONEPhase 1.5Historical archive ingest + verification harness — 17 vintages (2008-2024) backfilled (1,439 industry rows, 2,271 country rows). Ticker-industry map from indname.xls (48k rows). NDX-100 reconciliation runs end-to-end — 49 rows, 37% within ±0.15 (method gap, no data corruption). Gate partially passed — proceed cautiously to Phase 2 with diff disclosures.2026-06-05
✓ DONEPhase 2aDCF + WACC engine (NDX-100 baseline) — finance/damodaran/dcf.py; migration 023 valuation_snapshots/valuation_runs; reusable writer finance/common/snapshot_log.py. NDX-100 first run: WACC 93/97, DCF 2/97 — DCF gap = xbrl_concepts coverage (only 14/97 NDX tickers cached). Backfill blocker for Phase 2a′.2026-06-05
✓ DONEPhase 2a′R3K expansion — WACC 2900/2900 (100%); DCF 84/2900 (2.9%) gated by edgartools XBRL backfill (no_xbrl=2347/83.3%). 2816 gaps in valuation_gaps classified by root cause: no_xbrl/no_ocf/no_shares/financial_sector/reit/holdco/tracking_stock.2026-06-06
✓ DONEPhase 2bRelative multiples + peer z-scores — migration 032 damodaran_industry_multiples (94 industries × 24 cols: P/E + EV + Sales + Book/IC); finance/damodaran/multiples.py (model multiples_v1) computes trailing_pe, ev_ebitda, p_s, p_b, ev_ic per ticker + winsorized peer Z-scores across same-industry run peers (min 5). EV metrics suppressed for Banks/Insurance/REITs (Damodaran convention). Gaps logged uniform with DCF.2026-06-06
✓ DONEPhase 3Sensitivity tables + ERP overlay — 5×5 WACC×growth grid per ticker; ERP regime panel (66-year history, percentile, sparkline); backfilled 62 existing DCF rows; API: /api/finance/damodaran/erp + /api/finance/valuation/sensitivity-grid2026-06-06
✓ DONEPhase 4Real Valuation UI — per-ticker DCF card + industry/country browsers (2026-06-06); cross-section Screener added 2026-07-06 with plausibility quarantine2026-06-06
✓ DONEPhase 7EV Premium / Discount Tracker — market-vs-Damodaran premium per ticker, rolled to sector + index; nightly cron @ 03:30 ET2026-06-07
✓ MVPPhase 5Damodaran VEP — Blogspot RSS wired into expert-content-watcher; YouTube/backfill deferred (P3)2026-06-06
✓ DONE 2026-07-13DCF integrity (Approach A)Sector-aware growth cap (Utilities=5%, Financials=8%, default=10%), WACC floor rf+50bps, WACC−g ≥ 150bps guard, shares magnitude-continuity check, FCF scale guard. Screener now tracks clean / suspect / flagged tiers (G1, live counts above). Financials/REITs (banks — FCF-DCF inapplicable) now gap explicitly instead of ranking garbage (ASB was the #1 result). T1 synthetic tests 15/15. Pending (Approach B): XBRL unit fix for systematic wrong-scale filings (AEP, CALM). Commits ab1b0d0b·05f1d3cc2026-07-13
☐ PLANPhase 6Narrative-to-numbers tool (P3) — thesis → cash-flow projection → implied price
Valuation Screener — cross-section /api/finance/valuation/screen
regime …
Directional only — not a buy list. Input guards shipped 2026-07-13 (sector-aware growth caps, WACC floor, shares continuity check, FCF scale guard). Three tiers: clean (computed without adjustments) · suspect (passed plausibility but a growth cap or spread floor was applied — treat as directional) · flagged (gross outliers, hidden by default). Remaining: XBRL value-scale errors on systematic wrong-scale filers (e.g. AEP, CALM) — unit column corrected 2026-07-13 (Approach B, 4f0ea571); value itself still wrong for this subset and will appear as suspect/flagged in the screener.
loading…
Ranks the latest nightly RUA valuation run by DCF margin-of-safety = (intrinsic − price)/price. Click any row to open it in the Per-Ticker card below. Coverage: live counts shown above; ~88 names have DCF intrinsic as of 2026-07-14 (Financials/REITs gap correctly since Approach A; was 121 pre-exclusion). WACC covers 2,929/2,929 names.
DIAGNOSTICS & PROVENANCE — beta reconciliation, per-run DCF/WACC dumps, ERP history. Foundation checks, not stock-picking tools.
Reconciliation — damodaran_reconciliation
Our median trailing-2y daily-return beta vs Damodaran's published cross-section. Universe: NDX-100 (N≥3 constituents per industry). Tolerance ±0.15.
loading…
Industry N Vintage Ours β Theirs β Δ ±0.15
Loading reconciliation data…
Method: finance/damodaran/reconcile_report_2026-06-04.md · Code: finance/damodaran/verify.py · Triage: 31 misses are method gaps (simple-median vs Damodaran's cap-weighted bottom-up), 0 are data corruption. Tighten by widening universe to R3K and switching to cap-weighted aggregation (Phase 1.5b, deferred).
DCF & WACC — valuation_snapshots (Phase 2a)
5y explicit + Gordon terminal. WACC from industry weights + ticker-level beta vs SPY. Δβ = ours − Damodaran industry β. Universe: NDX-100, latest run.
loading…
Ticker Industry WACC β Δβ Value/share TV %
Loading DCF data…
Code: finance/damodaran/dcf.py · Writer: finance/common/snapshot_log.py · DCF cells empty = xbrl_concepts coverage gap (FCF inputs not cached for that ticker; Phase 2a′ backfill blocker). Run a fresh baseline: finance/venv/bin/python -m finance.damodaran.dcf --universe NDX-100 --as-of YYYY-MM-DD.
ERP Overlay — Equity Risk Premium
Damodaran implied ERP (DCF on S&P 500 cash flows) · 1960–present · Regime: percentile vs history
loading…
Current ERP
Riskfree (T-Bond)
Expected Return
Percentile (1960–)
Historical Median
Year ERP (FCFE) T-Bond Rate Exp. Return S&P 500 Regime
Loading ERP history…
Source: damodaran_erp_history (Damodaran NYU Stern annual release) · Method: DCF/IRR on S&P 500 dividends + buybacks. Regime bands: <P25 = LOW (expensive), P25–P75 = NORMAL, >P75 = HIGH (cheap). ERP used as discount-rate input for all DCF valuations via finance/damodaran/dcf.pycost_of_equity = rf + β × ERP.
Sensitivity Grid — 5×5 WACC × Growth
Per-ticker DCF value/share across (−200 → +200 bps) WACC × growth offsets. Base case highlighted. Color = relative value (green = higher, red = lower).
Enter a ticker and click Load Grid.
Grid cells = value/share ($). Rows = WACC offset (top = WACC −200 bps, bottom = +200 bps). Cols = growth offset (left = growth −200 bps, right = +200 bps). Base case (WACC offset=0, growth offset=0) is center cell, outlined in blue. Heatmap: color scaled within the 25-row grid; cells >P75 green, <P25 red, mid yellow. API: GET /api/finance/valuation/sensitivity-grid?ticker=AAPL
Per-Ticker Valuation — /api/finance/valuation/ticker
Composes DCF + WACC + multiples + ERP regime + forensic status. Click any row to drill in; intrinsic value is DCF-derived (5y explicit + Gordon TV), MoS is (intrinsic - market) / market.
Industry Snapshot — damodaran_industry_metrics × damodaran_industry_multiples
Default sort: cost_of_capital DESC (highest discount-rate industries first). Click headers to sort. Vintage shown is the latest Damodaran release.
Country Risk — damodaran_country_risk
Default sort: total_erp DESC (highest country-risk first). Country risk premium = base ERP + default-spread × risk multiplier. Apply when valuing non-US ops.
Plan & Memory
  • plans/damodaran-valuation-integration.md — locked 6-phase plan, §7 decisions, §8 execution order
  • memory/reference_damodaran_valuation_framework.md — canonical reference (DCF, ERP, country risk, narrative+numbers, lifecycle, sources)
  • memory/reference_damodaran_erp_2026.md — start-of-2026 ERP data point (4.23% at riskfree 4.18%; expected stock return 8.41%)
  • memory/MEMORY_finance_index.md — satellite index pointer
NYU Stern Datasets
EV Premium / Discount Tracker — Market vs Damodaran intrinsic
Daily Market Cap and Market EV vs Damodaran-implied intrinsic EV/equity, rolled up to GICS sector and index (SPX/NDX/RUI/RUT/RUA). Positive = market trades at premium; negative = discount. Bridge: market_ev = market_cap + total_debt + preferred + minority + leases - cash. APIs: /api/finance/valuation/ev-premium/{aggregate,snapshot,ticker}. Coverage % surfaces the XBRL backfill gap as a first-class signal — rises as ticker coverage expands.
Index: Window: Loading…
Sector Heatmap — latest
Sector N Cov $T MC EV vs Damo MC vs Damo EV vs Peer
Loading…
Per-Ticker Premium — /api/finance/valuation/ev-premium/ticker
 
Phase 7 shipped 2026-06-07 — EV premium tracker live. Daily Market-vs-Damodaran premium %s per ticker, rolled up to sector and index. Nightly cron valuation-ev-premium-daily @ 03:30 ET (4-stage: bridge → market_ev → ev_premium → aggregate). APIs: /api/finance/valuation/ev-premium/{aggregate,snapshot,ticker}. Coverage today: SPX 88/503 with market_ev, 2/503 with Damodaran intrinsic; expands with XBRL backfill. Phase 4 shipped 2026-06-06valuation-snapshots-nightly wired (DCF + WACC + multiples across R3K @ 02:30 ET). Next: Phase 5 (Damodaran VEP — blog/Substack/YouTube ingest).
ETF Trend Rotation
Momentum + trend-strength rotation across 12 ETFs (GLD, AGG, SPY, QQQ, TLT, UUP, VXX, SHY, VONV, VONG, VTV, VUG). Signal: 12-1 risk-adjusted momentum (skip last month) × trend filter (SMA-200). Top 4 = BUY. VXX excluded. Runner: python -m finance.scripts.run_etf_rotation
▲ BUY Signals
Loading…
↻ Last Rebalance
Loading…
Full Rankings —
Rank Ticker Signal Composite Momentum 12-1 Trend Vol 21d Ret 1m Ret 3m Ret 6m Ret 12m Price vs SMA200
BUY-Set Change History (last 30 days)
Loading…
Regime Call Accuracy SPY fwd return · risk-on→+ret correct · risk-off→−ret correct
Loading…
Date Flip SPY 5d ret 5d ✓ 10d ret 10d ✓ 20d ret 20d ✓ Src
Permutation Entropy (Bandt-Pompe)
Per-ticker complexity classifier — window=63 trading bars on adjusted close. Low PE → structured / trend-friendly. High PE → near-random / mean-reversion regime. Source: finance/indicators/entropy.py · gemchanger (@gemchange_ltd) ~2026-06-02 · Bandt & Pompe (2002).
Most structured (low PE·dim3)
Loading...
Most random (high PE·dim3)
Loading...
Factor Lab — Layer 4 Walk-Forward Leaderboard
Walk-forward cross-sectional IC + Sharpe for all Layer 3 factors (monthly eval dates, 12-month forward return). Regime split (mig 039): risk-on = n_buy ≥ 3 AND equity ETF in BUY, recomputed from prices_daily full history. NULL = bucket < 6 eval dates or < 4 months. Δ IC = risk-on minus risk-off (positive = factor stronger in risk-on). Regime columns fill as risk-off eval dates accumulate — risk-off periods are sparse so columns show — until ≥6 risk-off dates exist per metric. Runner: python -m finance.factor_lab.validate
View:
Metric Dir Gate IC Mean IC t Sharpe N IC risk-on IC risk-off Δ IC Sh risk-on Sh risk-off N on N off
ETF Factor Exposures — Holdings-Weighted
Holdings-weighted average factor score per ETF, built from SEC NPORT-P filings (fund_holdings) joined to metric_values on resolved ticker. Exposure = Σ(weight × score) / Σ(weight) over covered holdings. Cov% = fraction of ETF weight with a metric value. Top-3 dominant factors shown per ETF (by |exposure|). Large-cap blends with extreme factor tilt = crowding risk.
Leveraged-Pair Options — IV / Strategy Tracker
Daily EOD log of implied vol, realized vol and the IV−RV spread (the real edge) for the top leveraged pair (SOXL/SOXS), plus paper-tracked option structures marked-to-market so the data picks the winner. The edge is the variance risk premium (IV > RV) + IV mean-reversion, NOT the mechanical decay (~2.8% net CAGR — gross 9·σ² is a fantasy ceiling). Source: yfinance EOD chains (Massive options feed is not entitled on our key). Observational + paper-track only — no alerts, no orders (below the Factor-Lab L3 gate); defined-risk only (Rob's Rollover IRA). IV Rank accrues from 2026-06-22 (yfinance gives only current IV; RV-rank shown as a labelled day-one proxy).
Loading…
Current snapshot
LegSpot %ChgATM IV (front) ATM IV (next)RV 20d IV−RVIVR RV-rank*Exp. move
Loading…
IV / RV history
Paper-tracked structures — marked-to-market
Structure DTECredit/Debit Max lossP&L P&L / risk
Loading…
Leveraged 3× Pairs — Decay-Harvest Tracker
Strategy: short both legs of each 3× bull/bear pair, dollar-neutral, held with periodic rebalance — harvests daily-rebalance volatility decay (regime-agnostic; not mean-reversion). GROSS decay is a theoretical ceiling; NET CAGR is post-borrow and after rebalance + trend drawdowns — the gap is large and real. Thin legs ( below the $20M liquidity floor) are likely hard-to-borrow, so realized net is worse still. Re-ranked daily from prices_daily (Bloomberg history + yfinance daily). Observational only — no alerts, no trading.
Loading…
Bubble Composite Monitor
Five-signal qualitative+quantitative composite anchored around the same bubble cluster: Michael Green passive-flow thesis · Scott Goodwin / Diameter Capital BDC credit risk · Ed Zitron AI no-business-model · BAB spread high-beta crowding proxy (flow) · BAB z-score crowding level (SPLV/SPHB ratio vs 1Y) · Thrasher VIX compression. Traffic light: 0–1 active = 🟢 LOW · 2 = 🟡 ELEVATED · 3 = 🟠 HIGH · ≥4 = 🔴 EXTREME.
Loading…
BAB Spread SPLV − SPHB
Loading…
VIX Dispersion Thrasher 2017
Loading…
BDC Credit Stress ARCC vs SPY
Loading…
AI No-Biz-Model Thesis Zitron / Goodwin
Loading…
BAB Z-Score SPLV/SPHB ratio vs 252d — crowding level
Loading…
Howell G3 Liquidity × Bubble Confluence cross-system trigger
Loading…
Integration hooks · BAB spread (flow) feeds ETF Rotation regime gate (risk-on = SPHB > SPLV) · BAB z-score (level) corroborates SpaceX/NDX QQQ entry thesis — high crowding = late cycle · BDC stress threshold (−5%) wires to Goodwin thesis trigger · Zitron flag is manual — edit /var/lib/jarvis/data/macro/zitron-flag.json to suppress · VIX dispersion: sentinel vix-dispersion-daily refreshes at 4:15 PM ET · Howell confluence: sentinel bubble-howell-confluence-daily at 6:30 PM ET weekdays (after rates-complex + global_liquidity)

📚 The Shelf

Each page: Overview · Core Theories · Formulas & Metrics · Key Ideas · Application to Jarvis · Known Issues · Sources
Where the real math is — prospect theory (λ ≈ 2.25) → Thinking, Fast and Slow · Brier score + Murphy decomposition → Superforecasting · power-law tail estimation (Clauset–Shalizi–Newman) → Ubiquity · allometric scaling (Kleiber ¾, urban β ≈ 0.85 / 1.15) → Scale · fat-tail moment conditions → Fooled by Randomness · valuation mechanics → Margin of Safety · capital-cycle factors → Capital Returns
Loading the shelf…
Corpus: knowledge/finance/books/ · seeded from Mauboussin's recommended reading · open master index · schema
Loading…
Close vs SMA(short) vs SMA(long)
10/20 SMA Market Filter — Research basis
Filter is ON when Close > SMA(10) and Close > SMA(20). Otherwise OFF (hold cash/bonds). Popularized by Connors/Alvarez; validated by QuantifiedStrategies.com 20-year RSI study. Applied to SPY: ~65–70% time in market; max drawdown cut ~40–50% vs buy-and-hold with modest CAGR sacrifice (~1–3%). Most effective as a gate for other signals (RSI, momentum) rather than standalone. Crossover variant: SMA(10) > SMA(20) — same concept but smoother (fewer whipsaws, more lag). Risk-off asset when filter is OFF: cash, SHY (1-3y T-bill), or TLT (duration hedge). Source: QuantifiedStrategies.com — 20-Year RSI Study ↗

Price + SMA Filter — SPY

Shaded = filter ON (long); unshaded = filter OFF (cash)
Backtest — Full History (since 1993)
Signal Log — Last 50 Filter Flips
Date State Close Direction
Loading…