If you build features for Numerai Signals from fundamentals, the single most common way to silently overstate your live performance is joining on the wrong date. A table keyed by fiscal period end, or by a single "report date" that is overwritten on every revision, cannot tell you when a number was actually knowable. Our rows are keyed by first_filed — the date the value first appeared on EDGAR — with the first-reported value stored separately from the current one. Numerai's tournament resolves against real future returns, so any leakage in your feature construction shows up as a validation metric that decays the moment you go live. (This is not investment advice, and nothing here is a performance promise.)
This article covers three things: why lookahead leaks into fundamentals-based signals even when you think you've handled it, how a first_filed-keyed join fixes the mechanics, and where a small, honest, US-annual-only dataset like ours fits — and where it doesn't.
Why fundamentals leak into signals more than price data does
Price and volume are point-in-time by construction — the close on Tuesday was known Tuesday night. Fundamentals are not. A 10-K covering fiscal year 2022 might be filed in March 2023, restated in an amendment in August 2023, and then sit in a vendor's database keyed only by "period end 2022-12-31." If your pipeline joins on period end and pulls whatever value is in the database today, you're feeding your model information that didn't exist yet, and sometimes a corrected number that didn't exist until months later.
This is a bigger problem for fundamentals than most people expect, because:
- Filing lag varies a lot by company size and quality. Some filers report a few weeks after period end (rare), most take one to three months, and small caps can lag further.
- Restatements are common and not always flagged. If a value changes across amendments and you don't know which version was live on a given day, backtests can pick up the revised number, which can correlate with future returns simply because it was derived with hindsight.
- Numerai's eras compound the problem. Signals are scored weekly across thousands of tickers; a systematic few-week lookahead bias across the whole universe doesn't average out — it can inflate validation metrics uniformly, which is worth checking for if a validation curve looks unusually strong.
We wrote a longer, more technical breakdown of this mechanism in Lookahead Bias in Fundamental Backtests if you want the failure modes in more detail.
The correct join: first_filed, not period end
The fix is mechanical once you have the right column. Every fundamentals row needs a first_filed timestamp — the date the value became public via SEC EDGAR — separate from the fiscal period it describes. For a given Numerai submission date as_of, the query is:
SELECT * FROM fundamentals
WHERE ticker = ?
AND first_filed <= as_of -- same-day inclusive
ORDER BY first_filed DESC
LIMIT 1
That is the filing-date half of the leakage fix: the filter is first_filed <= as_of, applied per row, instead of a uniform "lag by 90 days" heuristic across every filer (which both under- and over-corrects depending on the company). You also want two values per row, not one:
-
original_value— the first-reported figure, safe for point-in-time backtests. -
latest_value— the current, revision-including figure, useful only if you're deliberately studying restatement effects.
We key our dataset this way: first_filed, original_value, latest_value, a restated flag (set when a same-tag revision exceeds 0.5%, including amendments), and qa_status. Across our current build, 18,723 rows carry that restated flag out of 312,751 total — restatements are common enough that ignoring them isn't a rounding error.
What our dataset is (and explicitly is not)
Tradevo Data (tradevodata.com) is a point-in-time US equity fundamentals dataset sourced entirely from SEC EDGAR (public domain data, not redistributed from a paid vendor). Currently: 5,189 US companies, 312,751 point-in-time rows, 7 core concepts (Revenue, NetIncome, Assets, StockholdersEquity, OperatingCashFlow, EPSDiluted, DilutedShares), up to 12 fiscal years of history, annual only — 10-K and 10-K/A filings. Quarterly is on the roadmap, not shipped. If your Numerai signal design needs quarterly fundamentals or non-US tickers, this dataset will not cover you today — say so up front rather than let you find out after checkout.
Access is one JSON endpoint, /v1/fundamentals?ticker&as_of[&concept], server-side first_filed <= as_of filtering built in, plus the full dataset via /v1/download and whole-universe cross-sections via /v1/snapshot?as_of — all included in the $29/mo plan, 5,000 requests/day and 2,500 distinct tickers/day (use /v1/snapshot or /v1/download for cross-sections). No quarterly, no non-US, no Parquet yet (CSV/gzip only; Parquet is roadmap).
On lag: on the reliable-filing rows of our 40-company free sample, the gap between fiscal period end and first_filed was mean 43.4 days / max 61 days. That figure is scoped to the sample. Across the full 5,189-company universe the reliable-row gap is wider — mean 66 days, median 60, p90 90 — because large caps are the fastest filers, so don't extrapolate the sample figure to the whole universe.
Fair comparison
| Tradevo Data | Sharadar (Nasdaq Data Link) | Tiingo | QuantConnect | Build it yourself from EDGAR | |
|---|---|---|---|---|---|
| Point-in-time fields | Yes (first_filed, original + latest) |
Yes, per their docs | Fundamentals PIT coverage varies, check their docs | Yes, via their data infra | Yes, if you build it correctly |
| Frequency | Annual only | Annual + quarterly, per their docs | Varies by plan | Varies by plan | Whatever you extract |
| Coverage | US only | US, check their docs for depth/history | US-focused | Multi-asset via platform | Whatever you scope |
| Price | $29/mo flat | See their pricing page | See their pricing page | See their pricing page | Your engineering time |
| Restatement flags | Yes, explicit | Check their docs | Check their docs | Check their docs | You build the logic |
We don't know competitors' current prices and won't guess — check their pricing pages directly, they change.
When another option is genuinely better
If you need quarterly fundamentals for Numerai Signals features (which many quality/growth factors want), Sharadar or a comparable vendor with quarterly PIT coverage is the right call today — we don't have it. If you need international equities, none of what's here helps; we're US-only. If you're already inside QuantConnect's ecosystem and want fundamentals integrated with their backtester and live trading, their bundled data may save you more integration time than a standalone API, even before comparing price.
When to build it yourself
EDGAR's data is public and free. If you only need a handful of concepts for a handful of tickers, and you're comfortable parsing XBRL and handling amendment logic yourself, you can build a first_filed-keyed table in a weekend. The tradeoffs: you own restatement detection, filer-level edge cases (fiscal year changes, non-calendar year ends, multiple amendments to the same period), and ongoing maintenance as EDGAR's XBRL taxonomy shifts. For a few tickers, doable. For thousands of tickers across multiple years, it becomes a real data-engineering project — which is the gap we built this to fill.
Try before you subscribe
The free sample — 40 companies, 3,280 rows, full methodology, no signup — is on GitHub. Run your own join logic against it before paying for anything. If it fits your Signals pipeline, the full dataset is $29/mo, instant key after Stripe checkout, cancel anytime. More on the mechanics of PIT fundamentals generally: Point-in-Time Fundamentals Data, Explained.
Not investment advice; verify any competitor pricing yourself on their current pricing pages.
Top comments (0)