The whole thing, on one page.

every publisher, its own markfour families into one interfacetwo dates on every row that leaves
Eighteen free financial data sources: SEC EDGAR, Form 13F, FRED, ECB,
          US Treasury, BLS, BEA, CFTC, CBOE, FINRA, Coinbase, Ken French and more,
          federated behind one interface, every row carrying both the date it
          describes and the date it became public

One grammar to name a field, one shape for every row.

four wire formats in, one row outtwo dates on every row, alwaysno honest date, no invented one
24 PREFIXES, FOUR FAMILIES AND ONE ROW SHAPE UNDER ALL OF THEM PRICES & MARKETS 5 price:, index:, crypto:, fx: +1 more OHLCV, adjusted close one grammar, any source FILINGS 11 us-gaap:, dei:, ifrs-full:, srt: +7 more any tagged concept one grammar, any source MACRO & RATES 5 fred:, bls:, bea:, ust: +1 more 800k series, vintages one grammar, any source RESEARCH & CROWD 4 french:, openap:, short:, ape: Fama-French factors one grammar, any source THE ROW EVERY SOURCE NORMALIZES TO nine fields, the same nine every time entity one key, resolved from ticker, CIK or name field prefix:name, the same grammar for all 19 observed_at the date the value describes known_at the date it first became public value the number itself unit USD, percent, index level, ratio source which publisher it came from source_url the exact endpoint it was read from vintage as-filed, or UNKNOWN_VINTAGE entity CIK0000320193 field us-gaap:Assets observed_at 2019-09-28 known_at 2019-10-31 value 338516000000 unit USD Two dates, always A row without an honest known_at is flagged UNKNOWN_VINTAGE, never given a plausible date. One key, so joins work Nine publishers, one entity key, so a join across them is just a join. One grammar, so tools don't grow A new source is a new prefix, not a new tool your agent has to learn. One real row, fetched on 2026-08-06: Apple's balance sheet closed 28 Sep 2019 and nobody could see it until 31 Oct.

A century of history, and six verbs that reach all of it.

July 1926 to this morninga source is a parametermore sources, same six verbs
A CENTURY OF COVERAGE each span measured from the source, never estimated 100 years, Jul 1926 on 23 primary sources 27 field prefixes 331 published claims 800k+ macro series 01 Ken French Library ACADEMIC 100 yr Jul 1926 → today 02 Open Source AP ACADEMIC 100 yr 1926 → 2023 03 FRED PRIMARY 79 yr 1947 → today 04 Yahoo Finance THIRD PARTY 64 yr 1962 → today 05 US Treasury PRIMARY 36 yr 1990 → today 06 CBOE volatility PRIMARY 36 yr 1990 → today 07 SEC filings stream PRIMARY 33 yr 1993 → today 08 ALFRED vintages PRIMARY 30 yr 1996 → today 09 ECB reference rates PRIMARY 27 yr 1999 → today 10 SEC Form 25 PRIMARY 23 yr 2003 → today 11 SEC EDGAR XBRL PRIMARY 17 yr 2009 → today 12 FINRA short volume PRIMARY 17 yr 2009 → today 13 Coinbase Exchange THIRD PARTY 11 yr 2015 → today 14 CFTC positioning PRIMARY 10 yr 2016 → today 15 House STOCK Act PRIMARY 18 yr 2008 → today 16 Senate EFD PRIMARY 14 yr 2012 → today 17 SEC Form 4 insiders PRIMARY 23 yr 2003 → today 18 BLS PRIMARY 2 yr 2024 → today, keyless 19 SEC Form 13F PRIMARY by quarter, filed 45 days late 20 SEC XBRL frames PRIMARY any quarter, all filers at once 21 BEA PRIMARY the current estimate only 22 ApeWisdom THIRD PARTY live only, no history Primary means the institution that receives or computes the number, not a reseller of it. Six verbs reach all of it · source is a parameter, never a new tool · twenty more sources adds zero verbs

Point-in-time, and the six ways data moves underneath you.

you never get tomorrow's papera correction is a new edition, not an editno print date, no silent guess
THE NEWSSTAND today not printed yet 31 OCT 2019 Assets $338.5B the annual report, as filed not printed yet 29 JAN 2020 Q1 comes in the quarter, as filed not printed yet 30 OCT 2020 Correction: $323.9B last year restated, a year later printed, dated, and never edited afterwards the day you are pretending it is WHAT YOUR BACKTEST IS ALLOWED TO READ assets $338.5B readable from 31 Oct 2019 Q1 2020 filed readable from 29 Jan 2020 assets $323.9B a second row. The first one still says $338.5B
Lagtrue in December, published in February Restatementthe company changes last year's number Revisionthe government keeps fixing old figures Survivorshipdead companies quietly disappear Membershiptoday's S&P 500 is not 2005's list Adjustmentsplits rewrite every price before them

And a backtester that argues with you.

it counts how many times you askedthe Sharpe is deflated for that countpublished methods, cited on the page
ONE RESEARCH SESSION 41 ideas tried, every one counted TRIAL LEDGER n = 41 kept per session, automatically DEFLATED SHARPE · BAILEY & LÓPEZ DE PRADO (2014) 2.14 what your backtest reported 2.29 what pure luck would have produced 0.09 what is left once the 41 tries are priced in
turnover costdeflated SRtrial ledgermultiple testingpurged k-foldPBO via CSCVNewey-West tsqrt impactmin length
in the code, cited
Point-in-time panel indexed on known_atstructural, no flag disables it
Costs charged on turnoverthere is no zero-cost mode
Deflated Sharpe RatioBailey & López de Prado, 2014
Session trial ledgerevery spec you tried, priced into the result
Probability of Backtest OverfittingBailey, Borwein, López de Prado & Zhu, 2017
Purged k-fold with embargoAdvances in Financial Machine Learning, ch. 7
Combinatorial purged CVAdvances in Financial Machine Learning, ch. 12
Minimum Backtest LengthBailey, Borwein, López de Prado & Zhu, 2014
Newey-West t-statisticNewey & West, 1987
Square-root market impactAlmgren, Thum, Hauptmann & Li, 2005

Nothing to install past the one line on the left, and the engine runs on the same six verbs.

Does Jegadeesh-Titman momentum still work?

one prompt, claim to verdictevery spec counted this sessionevery number on this screen reproducible
claude, vintage
$claude mcp add vintage -s user -- uvx vintage-mcp
connected · sec · fred · dartmouth · openap · coinbase · finra
take Jegadeesh-Titman (1993) and replicate it end to end
the claim
openap:Mom12m · Returns to Buying Winners and Selling Losers
paper claimed1.31%/mot-stat3.74sample1964-1989
the implementation
rank on 12-1 total return · hold one month · long the top fifth
resolve → 30 tickers · fetch → 4,113 sessions · panel indexed on known_at
WBA excluded, no price history. it delisted. that is survivorship, in miniature.
the backtest · dow 30 since 2010
annual return12.1%volatility19.4%max drawdown−29.5%
sharpe0.688
is it decaying?
first half0.883second half0.566
is it just market beta?
correlation with Mkt-RF0.74beta0.810.56
alpha2.31%/yr
mostly Mkt-RF, with something else on top.
the honesty report
specs tried this session1
one spec, so nothing to deflate yet. ask twelve more and watch it fall.
claim → spec → implementation → backtest → honesty. one prompt, no downloads.

What the forums are saying, right now.

fetched while this page was builtstamped with the minute we read itno history upstream, so we keep one
tickernamementions24h changeupvotes
1HTZHertz2,672+2,14810,144
2SPCXSpaceX354-692,600
3SPYSPDR S&P 500 ETF Trust330-1741,435
4MUMicron Technology233-97536
5SNDKSandisk141-754445
6MSFTMicrosoft100-2299
7TTDThe Trade Desk95+86239
8NVDANVIDIA93-75181

read from ApeWisdom at 2026-08-07 19:57 UTC · known_at is that moment, not the moment the posts were written

Installed in four steps, none of them a signup.

one command, nothing to cloneno account, no key, no cardsame server behind every client
  1. Get uvOne installer, no Python setup. pip install uv works too.
  2. Add the serverThe line below. Nothing to clone, nothing to build, no repository to keep current.
  3. Restart the clientMCP servers load once at startup, so a running client will not see it until then.
  4. Ask a question“What were Apple's total assets as of January 2020, and has it been restated since?”

One command. Nothing to clone.

claude mcp add vintage -s user -- uvx vintage-mcp

Add to claude_desktop_config.json, then restart the app.

{
  "mcpServers": {
    "vintage": {
      "command": "uvx",
      "args": ["vintage-mcp"]
    }
  }
}

Add to ~/.cursor/mcp.json.

{
  "mcpServers": {
    "vintage": {
      "command": "uvx",
      "args": ["vintage-mcp"]
    }
  }
}

Settings → Connectors → Developer mode. Needs a hosted URL, run vintage behind HTTPS and point the connector at it.

uvx vintage-mcp --transport streamable-http --port 8000