Skip to content

Learn

Company Research and Valuation

Measure earnings surprise against a pre-release snapshot

An earnings surprise comparison needs an estimate that was saved before the release and an actual result measuring the same thing. Check snapshot timing, fiscal interval, basic or diluted basis, accounting adjustments and currency before subtracting EPS. A result exceeding an estimate updated after the announcement cannot establish what the company delivered relative to expectations beforehand.

This guide performs the comparison on synthetic annual EPS records and blocks several incompatible cases. Historical estimates and actual release evidence are external inputs. It does not reconstruct an old forecast from today’s consensus, demonstrate a CoTrading surprise page or prove that reference A-share report tools supply reliable pre-release snapshots or quarterly forecasts.

Freeze an identifiable estimate before publication

Retain the original forecast file or response, its source, a data-as-of timestamp and the time it was saved. Keep the stock, forecast period and definition beside the number. For a broker sample, also retain contributing reports and the aggregation method. A labeled consensus without its time and coverage cannot establish the historical comparison this task requires.

The fixture requires data_as_of <= saved < released. The first condition rejects an internally inconsistent snapshot that claims to contain later information than its saving time. The second requires strictly earlier preservation than the official release. A snapshot saved at the same timestamp fails under this policy.

These fields are not proof merely because somebody typed them. A real archive needs credible timestamp and provenance evidence. If only a current value is available, mark the historical surprise calculation unresolved instead of changing the date label. A genuine earlier published forecast found later also requires a clear archival acceptance policy; this fixture uses the conservative saved-before-release contract.

Align the EPS definition and fiscal interval

IAS 33’s overview explains basic and diluted EPS and their numerator and denominator context. Check which measure each source uses, including continuing operations and any forecast share-count assumption. A similar-looking per-share number can represent a different earnings concept.

SEC staff interpretations on non-GAAP measures illustrate why labeling and consistent adjustments matter. This is source context for measurement comparability, not a compliance judgment or a claim that US disclosure rules govern every market. Do not compare adjusted forecast EPS with reported actual EPS without a supported reconciliation.

Record the original period start and end, not only a label such as FY2025. A quarter ending in December and a full year ending in December have the same end date but different durations. A per-share calculation that ignores that distinction can produce a dramatic and meaningless beat.

Construct the accepted synthetic pair

Fictional AAA’s full-year period runs from 1 January to 31 December 2025. The estimate is diluted EPS 1.00 CNY on the fixture’s reported basis, tagged GAAP. It has data-as-of 18 January 2026 at 18:00 and was saved on the 19th at 09:00, all UTC+08:00. The official synthetic release occurs on 20 January at 16:00 and reports comparable EPS 1.20.

The tag is a declared synthetic measurement identifier, not evidence that a real A-share issuer reports under a particular foreign standard. In actual use, map the source’s applicable accounting and adjustment definitions explicitly. Both records need the same accepted meaning before the equality check is useful.

if not data_as_of <= saved < release:
    return {"status": "blocked_post_release_or_invalid_snapshot"}
mismatched = [field for field in required_definition_fields
              if expected[field] != observed[field]]
if mismatched:
    return {"status": "blocked_comparability", "fields": mismatched}
prior, current = D(expected["eps"]), D(observed["eps"])
nonfinite = [field for field, value in [("estimate_eps", prior),
                                       ("actual_eps", current)]
             if not value.is_finite()]
if nonfinite:
    return {"status": "blocked_nonfinite_eps", "fields": nonfinite}

Python’s datetime reference supports timezone-aware comparisons. The code rejects naive timestamps rather than silently assuming a timezone. Real release times and archive clocks still need validation outside this arithmetic fixture.

Calculate differences only after acceptance

The signed difference is actual minus estimate: 1.20 minus 1.00 equals 0.20 CNY per share. For an adequately positive denominator, relative difference is that amount divided by the estimate, giving 0.20 or 20%. This is an unstandardized relative difference, not a standardized unexpected-earnings statistic and not a probability of a stock-price reaction.

Download the complete example. Use Python 3.12+, the standard library and synthetic inputs; run python R541.py. The source is docs/growth/research/round-5/examples/R541.py.

Actual output marks the main pair comparable and returns difference 0.20 and relative 0.2. The script also checks a saved-after-release estimate, a quarter-versus-year pair, basic-versus-diluted EPS and adjusted-versus-reported measures. The late snapshot is blocked by timing; the others are blocked with the mismatching definition fields.

The quarter counterexample changes both the period label and its start date. That tests the underlying interval rather than relying only on naming. The successful arithmetic is never executed for those incompatible pairs, so a plausible result cannot hide the rejected comparison.

Handle negative and near-zero estimates explicitly

The fixture reports a signed difference for a forecast −0.10 and actual 0.10: improvement 0.20 per share. It withholds the ordinary percentage because a negative baseline creates a misleading sign convention for this presentation. A loss-to-profit transition should be described with both values rather than reduced to a casual growth percentage.

For estimate 0.01 and actual 0.03, the difference is 0.02, but the relative field is also null. The operational display policy requires estimate EPS above 0.05. This threshold is a declared example choice, not a universal rule for financial materiality. Preserve it in the method record and do not change it after seeing a large-looking percentage.

These cases are still comparable measurements; only percentage presentation is restricted. Distinguish them from a blocked fiscal period or a late forecast, where even the intended historical difference lacks accepted inputs. Null values need specific reasons rather than one undifferentiated unavailable label.

Reject the post-release counterexample

A forecast of the right year, currency and dilution saved on 21 January fails even if its number seems close to the earlier expectation. It may contain information from the released result. Do not replace the frozen 1.00 with a convenient new mean and then claim a smaller pre-release surprise.

Similarly, actual reported EPS cannot simply replace a missing expected figure. Keeping the pair incomplete is more faithful than manufacturing a zero surprise. A provider’s date-only update record may also be insufficient to establish whether the forecast preceded a same-day announcement; retain that timing uncertainty.

Deliver a paired evidence table

The handoff includes frozen estimate source, data-as-of and saved times, actual release source and time, original intervals, EPS definitions, accepted differences and blocked-pair reasons. Have a reviewer trace the successful pair, the late snapshot and the quarter mismatch directly from the inputs.

Keep later revisions to actual EPS separately. A restated result can support a new current comparison, while the first release remains necessary for an announcement-time question. Likewise, a later forecast belongs in a new expectations snapshot and must not overwrite the earlier benchmark.

This task compares external expectations with an observed release. It does not score management’s original guidance, predict market returns or establish that a reported beat reflects sustainable operating improvement. By preserving pre-release timing and measurement compatibility, it produces a reproducible numerical surprise calculation with visible limits.

Make the frozen benchmark reviewable

Store the benchmark’s definition and source before the release event, including whether it is one broker, a selected sample or a provider aggregate. These are different expectation objects. A calculation against one broker’s annual EPS should not be described as a market-consensus surprise unless the accepted source and coverage actually support that label.

Review a pair with the same displayed number but different definitions as carefully as an obvious numeric mismatch. Equal EPS values do not establish equal accounting bases or periods. The script blocks definition mismatches before subtraction, so a coincidental zero difference cannot disguise an invalid comparison.

When exporting results, retain absolute-unit differences, relative eligibility reasons and the timing acceptance outcome as separate fields. A dashboard can display a clean short summary while preserving that detail for inspection. If the frozen source is later found unreliable, mark the calculation unresolved and reopen dependent commentary rather than substituting a convenient newer benchmark. Correcting evidence should revise the comparison openly; it should not rewrite what the earlier expectation supposedly was.

Reject nonfinite EPS before arithmetic

Parsing as Decimal is not financial-data validation: the Decimal reference documents that is_finite() rejects NaN and either infinity. The checker applies it to both estimate and actual before subtraction, denominator comparison or division. It returns blocked_nonfinite_eps with the offending input fields, including both fields when both are invalid. These inputs never receive comparable or a valid relative result.

The downloadable script asserts NaN, positive infinity and negative infinity on each side, plus a pair with both sides nonfinite. Finite negative and near-zero EPS retain their existing absolute-difference and restricted-percentage policy. A nonfinite value instead requires source-data repair; it is neither a loss forecast nor merely a difficult percentage denominator.

FAQ

Can today’s consensus be used for a past earnings release?

Not as a pre-release benchmark without reliable historical snapshot evidence.

Does a positive EPS difference predict a rising stock price?

No. This calculation describes one accepted expectation gap, not market reaction or investment merit.