Backtests that can't see the future
Point-in-time, survivorship-free fundamentals across 30 years and every delisted name — so your Sharpe survives out-of-sample.
The problem
Two silent killers wreck fundamental backtests: look-ahead bias (using restated numbers the market didn't have yet) and survivorship bias (testing only the companies that survived). Most datasets bake in both — so the Sharpe looks great and dies live.
How Valuein does it
- 1
Reconstruct the real universe at every date
get_pit_universe returns the index constituents as they actually were on any historical date — including names later delisted, merged, or bankrupt.
- 2
Query the data the market had — and only that
Every fact carries its EDGAR accepted_at timestamp; the SDK's as_of() context filters each row to what was public at that moment. No restated surprises leak backward.
- 3
Crunch it out-of-core
The SDK streams R2 Parquet through DuckDB locally — 111M+ facts queried in milliseconds, no per-row API round-trips. Build factors with the AlphaEngine framework.
In practice
Query
with ValueinClient() as c:
with c.as_of("2015-06-30"):
df = c.run_template("pit_universe_announcement", index="SP500")Result
Returns the S&P 500 as it stood on 2015-06-30 — Enron-era casualties included for earlier dates — with only data filed on or before that date.
The outcome
Your backtest trains on the full universe with no peeking — so the edge you measure is the edge you'll actually trade.
Powered by
Frequently asked
How is look-ahead bias actually prevented?
Each fact stores its SEC acceptance timestamp and is immutable. The SDK's PIT enforcement filters the fact / filing / smart-money tables to as_of, so a query for a past date never sees a later restatement.
Are delisted companies really included?
Yes. Every entity that ever filed with the SEC — including bankrupt and merged names — is in the Pro and Institutional universe. That's what makes it survivorship-free.
Related use cases
Do this with your own data — free.
The free S&P 500 tier needs no credit card. One token works across MCP, the Python SDK, and the Workspace.