---
title: "Where the numbers come from: filings, point in time"
description: "Every figure here starts in a filing. What EDGAR gives, what the fallback fills in, why each row stores when it became public, and what breaks a table."
date: 2026-09-21
updated: 2026-09-21
tags: [filings, methodology, basics]
author: "Allen Yan"
image: https://sweetvaluelab.com/blog/img/c4746e1a6238aa32.png
lang: en
canonical: https://sweetvaluelab.com/blog/where-the-numbers-come-from
---

A valuation model is the easy half. Twelve of them run on 518 companies every night here, and the arithmetic has never been the thing that goes wrong. What goes wrong is a share count from before a split sitting next to today's price, or the same fiscal year appearing twice in a table because two sources named it differently, or a number that was published in February being shown as though it had been knowable in January.

This post is about that half: where every figure on the site comes from, what is done to it on the way to your screen, and which parts are best-effort. It is the companion to [how the twelve models work](https://sweetvaluelab.com/blog/how-we-value-a-stock), and the examples in it are all real tickers with real dates, because every one of them was a bug first.

## Two sources, in a fixed order

Financial statements are read from the company's own XBRL filings on SEC EDGAR. That is the primary source: the 10-K and 10-Q as the company tagged them, with the same numbers a human reader would find in the document. For filers EDGAR does not cover, and for some older years, the gap is filled from Financial Modeling Prep.

Those two sources do not hand back the same thing, and one difference matters enough to have its own function. EDGAR gives you the figures **as filed**. FMP gives you figures already restated for every split since. NVIDIA's FY2019 row from FMP reads $0.17 of earnings on 25 billion shares; what the company actually filed in 2019 was $6.63 on 625 million. Both describe the same year. Restating the FMP row again for splits, as the code does to the EDGAR rows, would divide by four a second time and produce numbers that exist nowhere. So rows are told apart by fields the EDGAR mapper never emits, and only the as-filed ones are adjusted.

## Every row knows when it became public

Each stored row carries a `known_at`: the acceptance timestamp of the filing it came from. Never the moment we fetched it.

This is one line of code and it decides whether a historical view means anything. A quarter ends on June 30. The 10-Q is accepted on August 5. For those five weeks the figures do not exist outside the company, and a page that shows them against a July price is describing a world nobody could trade in.

![A quarter ending, the filing accepted five weeks later, and a 13F arriving 45 days after the quarter it describes](https://sweetvaluelab.com/blog/img/4436b38508a6f209.svg "Schematic. A quarterly report is accepted weeks after the period it covers; a 13F holdings report is due 45 days after quarter end, so the newest positions on an investor page can describe a portfolio as it stood six weeks ago. The stored row carries the acceptance timestamp, so a view of any past date shows only what had been filed by then.")

The extreme case is the 13F. A manager's holdings report is due 45 days after the quarter it describes, which means the freshest holdings anyone has for Berkshire or Bridgewater can be six weeks stale on the day they appear. That is a fact about the disclosure regime. It is worth knowing before you read a change in a position as news.

## Splits are applied on the way out

Apple filed FY2019 earnings of $11.89 a share. Its FY2020 filing says $3.28. Nothing bad happened in between: there was a four-for-one split in August 2020, and the two rows are denominated in different shares.

Stored rows stay exactly as filed, so the restatement happens on read. Per-share figures are divided by the product of every split effective after that row's fiscal date, and share counts are multiplied by it. A row that was touched carries a marker saying by how much, so a page can tell you it happened.

Two things get fixed by this. An eight-year EPS chart no longer has a cliff at the split that never happened. And a model fed a filed share count next to today's price is no longer off by the split ratio, which for Booking Holdings' 25-for-1 meant every model on the page printed 25 times the price.

## Eight years in a table should be eight years

This is the one I did not see coming. The statement caches are keyed by symbol, period and fiscal date, and the same fiscal year reaches them under more than one date.

A 52/53-week filer's year ends on a Saturday near month-end. Costco's FY2019 ended on September 1, and FMP labels that year 2019-08-31 while EDGAR labels it 2019-09-01. Ciena's FY2019 arrives as 2019-10-31 from one source and as 2019-11-02 from a later 10-K's comparative column. Agilent adopted an accounting change and tagged an opening balance the day after its year-end, so 2018-10-31 and 2018-11-01 both exist. Nobody is wrong. A reader asking for the last eight years just gets ten rows, two of them duplicates, and a growth rate computed across a duplicate is garbage.

![Three rows with dates one and two days apart collapsing into one fiscal year, keeping the row with the most fields](https://sweetvaluelab.com/blog/img/63b1e68806d5b90b.svg "Rows whose fiscal dates fall within 14 days of each other are one period. Costco FY2019 arrives as 2019-08-31 and 2019-09-01; the survivor is the row with the most numeric fields, because the EDGAR copy of an old year can be a handful of tags — Costco's 2019 cash flow has six — and an engine fed the thin row loses free cash flow and capex entirely. On a tie, the row filed first wins.")

So on read, rows whose dates fall within 14 days of each other are treated as one period. A quarter is about 90 days, so the window cannot merge two real neighbours. The survivor is the row carrying the most numeric fields, and on a tie the one filed first, which is the original point-in-time filing ahead of a later comparative.

## The four SEC filings behind the investor pages

The [investor pages](https://sweetvaluelab.com/investors) and the insider tab on every stock are built from four filings, read from EDGAR directly. Each has its own conventions, and its own thing it cannot tell you.

**13F holdings.** Read from each manager's 13F-HR and kept as immutable quarterly snapshots. Quarter-over-quarter changes (new, added, trimmed, exited) are computed here by comparing two consecutive snapshots. A 13F covers long US equity positions only: no shorts, no bonds, no foreign listings, no cash. The report identifies securities by CUSIP, and mapping CUSIPs to tickers is a table maintained by hand here; an unmapped one shows under the issuer name from the filing.

**13D and 13G.** Beneficial-ownership filings, read per subject company. A 13D means an activist stake with intent; a 13G means a passive one. The ownership percentage is taken from the cover page where the filing states it, which makes it best-effort by nature.

**8-K.** Material events. The item codes are taken from the EDGAR submissions index instead of parsed out of the document, which is duller and far more reliable — item 5.02 means a director or officer changed, whoever wrote the prose.

**Form 4.** Insider transactions, parsed from the ownership document itself. That is more work than reading a summary feed, and it keeps two fields most free sources drop: the SEC transaction code, so an open-market purchase is distinguishable from an option exercise or a tax withholding, and the 10b5-1 flag, which says the trade ran under a plan adopted in advance. A sale under a plan adopted eight months ago is a different event from a sale decided last Tuesday.

## Money is stored raw

Amounts go into the database as the numbers they are, and formatting happens at the last possible moment in the browser. Nothing is rounded before it is computed on. A snapshot of a valuation, a sector board or a sentiment reading is immutable and stamped with the version of the code that produced it, so any figure the site showed on a past date can be reproduced.

That is the whole contract. Primary filings, timestamped when they became public, adjusted only where the adjustment is stated, and stored so the arithmetic can be run again. The [twelve models](https://sweetvaluelab.com/blog/how-we-value-a-stock) sit on top of it, and they are only ever as good as this part.
