The Aggregator Is a Quarter Behind, and It Doesn’t Say So
The question that started this was mundane: why don’t we have last year’s figures for a company we cover?
The answer turned out to be a structural blind spot in how we sourced financial data, affecting a specific and identifiable population, for a period long enough that in short-side research it is the whole game.
The obvious explanation was wrong
Regulators publish an aggregated financial-data API — every company, every period, uniform shape. It is the sensible thing to build on, and we did.
When the gap appeared, the first hypothesis was that the company had not filed. Wrong: the filing was there, months old, complete. The second hypothesis was foreign private issuers being handled differently. That one felt right and survived a while, which is what made it expensive.
The actual dividing line, once we looked at the whole affected set, is accounting standard. Among companies missing recent periods, roughly 49% report under IFRS. In the control group, 2.7%. That is not a tendency; that is a different population.
The mechanism is unglamorous. An aggregator has to map filings into a normalised schema, and the standard it was built around ingests promptly. Filings under the other standard need mapping work that happens on a slower cycle. Nothing is broken — the pipeline is simply not the same pipeline, and one of them is twelve to sixteen months behind.
Three groups fell out of the gap analysis: a majority that eventually self-heal, on that year-plus delay; a smaller set that had never appeared and showed no sign of doing so; and the ones we had already noticed. The self-healing group is the dangerous one, because the problem eventually disappears on its own — and if you only ever look at old periods, you will never see it.
Why a year of lag is not “slightly stale”
For most analytical purposes, a year-old figure is usable. For this one it is close to worthless.
The value of forensic work concentrates in the window between a company disclosing something and the market absorbing it. A contradiction visible in a filing published today is actionable. The same contradiction, surfaced sixteen months later, is history — either it resolved, or someone else found it, or the position that would have expressed it is long gone.
So a systematic lag against one accounting standard is not a data-quality issue. It is a blind spot with a membership list. We were structurally unable to see recent problems at IFRS reporters, which is a large share of the Hong Kong universe and a meaningful part of the US-listed foreign issuer population.
What we built instead
Filings carry their own structured data. The instance document is attached to the filing, available the day it is published, with no aggregator in the path. Parsing it directly removes the lag entirely.
We did this in stages, and refused to skip any.
Feasibility, with a golden check. Parse a company and period the aggregator also has, and require the numbers to match field by field. Not “close” — identical. That check caught a real rounding bug in our first parser on the first run: we had picked the wrong precision attribute and produced values off by a rounding step. Without the golden check we would have shipped a parser that was subtly wrong on every value and looked fine.
Small-batch reconciliation, with a source stamp. Every financial record now carries which path produced it. This is the part that makes the rest auditable: a number without a provenance mark is a number you cannot investigate later.
Production switchover, as a separate decision. Not a rollout of stage two — a distinct go/no-go with its own evidence, requiring that engine verdicts before and after be reconciled.
The switch, and the number that mattered
Live now: 95 IFRS reporters drawing from filing-level parsing with aggregate as fallback, and 16 non-IFRS companies running the reverse — filing-level as the fallback where the aggregate has nothing. The direction depends on the standard, because that is where the lag lives. Everything else stays on the aggregate, which for that population is prompt and fine.
The number we cared about was the regression: across 286 companies comparable under both sources, zero verdict flips. Two showed numerical differences that did not change the verdict — which is the result we wanted, because it proves the comparison was actually running. A regression that reports zero differences of any kind usually means it is comparing something to itself.
FY2025 coverage went from 93.3% to 95.3%. Ninety-four companies remain quarantined rather than force-filled: where the parse does not pass the golden check, they stay out. A gap we can see beats a number we invented.
The pattern underneath
While fixing the parser we found two defects with the same shape. One took the first standard-namespace match it found and stopped, freezing companies that file under both. The other took the first currency it encountered, hiding a large issuer’s figures for years behind the wrong unit.
Different code, different symptoms, one bug: first match wins. A lookup that stops at the first plausible answer, in a domain where the plausible answer is often not the right one. We have now found that shape in five places, and the lesson we keep having to relearn is that fixing one instance does not fix the class — you have to go looking for the others, because none of them announce themselves.
All figures are system-level results current as of publication date; methodology parameters are intentionally omitted.