Research · 2026-10-17

How much look-ahead bias is in your fundamentals backtest?

We measured it across about 5,285 US companies a month, 2012–2023, using nothing but SEC filings. The short answer: dating fundamentals by quarter end puts 13%–24% of companies in the wrong quintile. Restated numbers add much less than people expect. And the usual fix, a fixed reporting lag, still leaks.

62%
of companies, on an average month-end, get a quarter that wasn't filed yet when data is dated by quarter end
70 days
median wait from fiscal year end to the 10-K. 17% take longer than 90 days
10%
of first-reported net income figures differ in a current database. 56% of companies have at least one changed revenue or net income figure
7.7%
of companies still get unreleased numbers with a 45-day lag; a 90-day lag cuts that to 3.7% but leaves 29% on stale numbers

Two different ways to see the future

A backtest that ranks stocks on fundamentals can use information before it existed in two ways:

We measured both, separately and together, on Varve Fundamentals, which keeps each number as first filed, the filing date, and every later revision.

1. Timing: the numbers arrive 6 to 10 weeks late

Days from quarter end to filing, 2012–2023

229,021 quarterly reports and 74,279 annual reports.

10-Q (quarterly)
0%10%20%30%0–5 days: 0.0% of 10-Qs5–10 days: 0.0% of 10-Qs10–15 days: 0.1% of 10-Qs15–20 days: 0.5% of 10-Qs20–25 days: 1.9% of 10-Qs25–30 days: 6.5% of 10-Qs30–35 days: 14.4% of 10-Qs35–40 days: 26.4% of 10-Qs40–45 days: 24.4% of 10-Qs45–50 days: 17.0% of 10-Qs50–55 days: 4.9% of 10-Qs55–60 days: 0.4% of 10-Qs60–65 days: 0.3% of 10-Qs65–70 days: 0.2% of 10-Qs70–75 days: 0.2% of 10-Qs75–80 days: 0.2% of 10-Qs80–85 days: 0.2% of 10-Qs85–90 days: 0.2% of 10-Qs90–95 days: 0.2% of 10-Qs95–100 days: 0.1% of 10-Qs100–105 days: 0.1% of 10-Qs105–110 days: 0.1% of 10-Qs110–115 days: 0.1% of 10-Qs115–120 days: 0.1% of 10-Qs120–125 days: 0.1% of 10-Qs125–130 days: 0.1% of 10-Qs130–135 days: 0.1% of 10-Qs135–140 days: 0.1% of 10-Qs140–145 days: 0.1% of 10-Qs145–150 days: 0.0% of 10-Qs150–155 days: 0.0% of 10-Qs155–160 days: 0.0% of 10-Qs160–165 days: 0.0% of 10-Qs165–170 days: 0.0% of 10-Qs170–175 days: 0.0% of 10-Qs175+ days: 0.9% of 10-Qs45 days90 days0306090120150180+days from quarter end to filing
10-K (annual)
0%10%20%30%0–5 days: 0.0% of 10-Ks5–10 days: 0.0% of 10-Ks10–15 days: 0.0% of 10-Ks15–20 days: 0.0% of 10-Ks20–25 days: 0.1% of 10-Ks25–30 days: 0.2% of 10-Ks30–35 days: 0.4% of 10-Ks35–40 days: 1.2% of 10-Ks40–45 days: 2.5% of 10-Ks45–50 days: 4.8% of 10-Ks50–55 days: 9.0% of 10-Ks55–60 days: 15.9% of 10-Ks60–65 days: 9.0% of 10-Ks65–70 days: 5.8% of 10-Ks70–75 days: 8.6% of 10-Ks75–80 days: 6.4% of 10-Ks80–85 days: 4.4% of 10-Ks85–90 days: 8.7% of 10-Ks90–95 days: 10.0% of 10-Ks95–100 days: 1.0% of 10-Ks100–105 days: 2.0% of 10-Ks105–110 days: 5.7% of 10-Ks110–115 days: 0.4% of 10-Ks115–120 days: 0.3% of 10-Ks120–125 days: 0.3% of 10-Ks125–130 days: 0.2% of 10-Ks130–135 days: 0.2% of 10-Ks135–140 days: 0.4% of 10-Ks140–145 days: 0.2% of 10-Ks145–150 days: 0.1% of 10-Ks150–155 days: 0.2% of 10-Ks155–160 days: 0.1% of 10-Ks160–165 days: 0.1% of 10-Ks165–170 days: 0.1% of 10-Ks170–175 days: 0.1% of 10-Ks175+ days: 1.7% of 10-Ks45 days90 days0306090120150180+days from quarter end to filing

The median 10-Q is filed 40 days after the quarter ends, and the median 10-K 70 days after the fiscal year ends. Large companies are faster and small companies slower, but almost nobody files in under a month. The tail matters too: 3.5% of 10-Qs and 16.7% of 10-Ks come in well after the deadlines, often because something went wrong.

Example: Kraft Heinz, fiscal 2018. The 10-K, with a $10.2 billion net loss after a $15.4 billion goodwill impairment, was filed on 7 June 2019, 158 days after year end, alongside restated figures for earlier years. A backtest with a 90-day lag uses those numbers from the start of April, two months before they were in any filing. (The impairment was announced in February, but in a preliminary earnings release.)

2. Restatements: about 1 in 10 numbers changes later

FieldChanged laterChanged by over 10%Median size of changeRevised downMedian days until changed
Revenue10.7%4.6%6.8%71%490
Net income10.1%4.7%7.5%54%482
Operating income12.4%5.9%8.7%52%376
Operating cash flow10.2%3.9%4.2%46%376
Shareholders' equity17.9%5.9%2.8%29%459
Total assets4.6%0.9%0.7%61%366
Diluted EPS8.5%6.0%55.6%67%380
Diluted shares8.6%6.3%91.7%59%367

Quarterly, annual and balance-sheet values for periods ending 2010–2022, as first filed vs. as in the latest filing that reports the same period. Rounding differences (4,843,000 vs 4,843,349) are not counted.

Roughly one in ten first-reported figures for revenue, net income or operating income differs from the number a current database shows for the same period, and over half of all companies have at least one. The changes are usually small (a median of 7.5% for net income) and arrive more than a year later.

Two patterns are worth knowing:

3. What it does to a strategy

To see the effect on a portfolio without needing prices, we ranked companies at every month end from January 2012 to December 2023 on four well-known signals built from SEC data alone: return on assets, gross profitability, accruals and asset growth, each from the latest four quarters. We built each ranking twice: once point-in-time (only filings public on that date, each number as known that day) and once with a common shortcut. Then we counted how many companies land in a different quintile.

Share of companies in a different quintile than point-in-time

Average of the four signals; the line shows the range across them.

0%10%20%30%Period-end dates + restated numberswhat a backtest on a current database does by default19%Period-end dates + restated numbers: 18.9% of companies in a different quintile on average (range across the four signals 13.5%–24.4%)Period-end dates onlynumbers as first reported, but dated by quarter end17%Period-end dates only: 17.4% of companies in a different quintile on average (range across the four signals 11.1%–24.2%)Restated numbers onlycorrect filing dates, but today's numbers4%Restated numbers only: 3.5% of companies in a different quintile on average (range across the four signals 0.9%–5.3%)45-day lag + restated numbersthe common fix, tuned to the 10-Q deadline7%45-day lag + restated numbers: 6.7% of companies in a different quintile on average (range across the four signals 5.2%–8.9%)90-day lag + restated numbersthe common fix, tuned to the 10-K deadline11%90-day lag + restated numbers: 11.3% of companies in a different quintile on average (range across the four signals 8.1%–14.8%)

Dating by quarter end does almost all the damage: on its own it moves 17% of companies on average, against 3.5% for restated numbers alone. Together they move 13%–24% of companies depending on the signal. Accruals and asset growth are hit hardest, with about a quarter of companies moving; return on assets and gross profitability least. Even then, one in ten of the top-quintile companies is a different company.

Compared with point-in-timeReturn on assetsGross profitabilityAccrualsAsset growth
Period-end dates + restated numbers13.5% · 89%13.6% · 92%24.1% · 78%24.4% · 82%
Period-end dates only12.3% · 90%11.1% · 93%22.2% · 80%24.2% · 82%
Restated numbers only2.9% · 98%5.3% · 98%5.1% · 95%0.9% · 99%
45-day lag + restated numbers5.2% · 96%7.1% · 96%8.9% · 91%5.8% · 96%
90-day lag + restated numbers8.1% · 93%9.2% · 95%14.8% · 87%13.1% · 91%

Each cell: share of companies in a different quintile · share of the top quintile that is the same companies. Monthly rebalancing, Jan 2012–Dec 2023, about 5,285 companies per month.

4. The usual fix still leaks

Many backtests apply a fixed lag instead: assume each quarter is known 45 or 90 days after it ends. That helps a lot, but it's wrong in both directions. It's too slow for the companies that file early, and too fast for the ones that file late, which are disproportionately companies with problems.

Dating ruleUses a quarter not yet filedUses an older quarter than was availableCompanies with nothing filed yet
Period-end dates + restated numbers61.6%0.0%11.0%
Period-end dates only61.6%0.0%10.9%
45-day lag + restated numbers7.7%3.4%9.7%
90-day lag + restated numbers3.7%28.9%8.9%

With a 45-day lag, 7.7% of companies still get a quarter that hadn't been filed, mostly 10-Ks, which usually take longer than 45 days. With a 90-day lag that falls to 3.7%, the late filers, but 29% of companies are now ranked on stale numbers. Either way, the companies whose data is late are the ones most likely to be in trouble, so the leak isn't random noise.

Doing it right

Use the date each number became public, not the period it describes. With Varve Fundamentals, every value carries its filing date (filed, plus the exact accepted timestamp), the value as first filed and every later version:

import pandas as pd

f = pd.read_parquet("varve_fundamentals_facts.parquet",
                    columns=["cik", "field", "duration", "period_end", "value", "filed"])
ni = f[(f["field"] == "net_income") & (f["duration"] == "Q")]

# one row per company per month-end: the latest quarter FILED on or before that date
dates = pd.date_range("2015-01-31", "2023-12-31", freq="ME")
grid = pd.MultiIndex.from_product([ni["cik"].unique(), dates],
                                  names=["cik", "date"]).to_frame(index=False)
pit = pd.merge_asof(grid.sort_values("date"), ni.sort_values("filed"),
                    left_on="date", right_on="filed", by="cik")

# `value` is the number as first filed. For "as known on that date" including
# restatements already public, use fact_versions: known_from <= date < known_to.

The same works with the free sample, which has the full history for 25 companies, including delisted ones.

Method and caveats

Point-in-time fundamentals for every SEC filer since 2009

Varve Fundamentals keeps every number as first filed, with its filing timestamp and every later revision. Survivorship-bias-free from 2012.

Get the free sampleSee pricing