Skip to content

Learn

Company Research and Valuation

Align A-share broker EPS forecasts by fiscal year

An A-share earnings comparison needs forecasts for the same company, fiscal year and per-share basis. A list of recent research reports is not automatically a consensus dataset. Select a cutoff, retain the latest eligible forecast from each broker for the target year, and calculate an explicitly labeled sample summary. Compare a vendor consensus in a separate column with its own date and coverage definition.

The worked example uses invented broker records and a fictional stock. It implements selection, deduplication and averaging; it does not retrieve paid reports or establish historical consensus coverage. Vibe’s inspected report tool is an A-share reference, not a global research library or proof of a working CoTrading forecast page. The data acquisition step still requires an appropriate authorized source.

Specify what forecast you are comparing

The request should identify the stock, cutoff timestamp, forecast fiscal year, currency, EPS basis and report window. Calendar publication year and forecast year are separate fields. A report published in 2026 may contain forecasts for 2026, 2027 and 2028. Select the column labeled with the desired fiscal year, not simply the second number in an extracted table.

Preserve the broker’s name, report identifier, publication date, source location and original EPS string. Record whether the forecast is basic, diluted or a broker-defined adjusted measure, and what share-count assumption it uses. The IFRS Foundation’s IAS 33 overview illustrates why EPS numerator and denominator definitions matter. It is an accounting reference, not the rulebook for an A-share consensus provider or a promise that every broker uses identical forecast conventions.

For A-share work, confirm the relevant issuer reporting basis and broker forecast definition from the actual materials. A stock split, issuance or changed forecast share count can make two per-share figures incomparable even when their forecast year matches. Keep such rows pending until their basis is reconciled; do not average them merely because they are numeric.

Build a broker-by-year source table

Our cutoff is 2026-10-26 and the target year is 2027. The fixture has five report records. A’s later eligible report supersedes its earlier one. C’s 2028 estimate is a different period. B’s 27 October report is after the cutoff and must not enter the 26 October snapshot.

BrokerPublication dateForecast yearEPSTreatment
A2026-10-0120271.00superseded
A2026-10-2020271.20selected
B2026-10-1920271.40selected
C2026-10-2020282.00different year
B2026-10-2720271.60after cutoff

Apply date and year filters before selecting each broker’s latest record. Otherwise an ineligible future report could replace B’s valid older report and then be removed, leaving B missing altogether. Preserve excluded records with explicit reasons so the count of raw reports can be reconciled with the number of contributing brokers.

If two reports from the same broker have the same publication date, use a documented source sequence or report timestamp. Do not let input row order decide which forecast survives. The short fixture has no same-date conflict; extending it requires that additional policy and a corresponding conflict test.

Execute the selection and summary

latest = {}
for broker, published, fiscal_year, eps in reports:
    if published > cutoff or fiscal_year != year:
        continue
    if broker not in latest or published > latest[broker][0]:
        latest[broker] = (published, D(eps))
sample_mean = sum(value[1] for value in latest.values()) / D(len(latest))

The complete standard-library file is docs/growth/research/round-5/examples/R539.py. Its actual output selects brokers A and B, computes a 2027 sample mean of 1.30, retains the synthetic vendor mean of 1.35 and reports their difference as −0.05. It also calculates an intentionally bad mixed mean of 1.40 from the first four raw reports. Assertions verify the selected brokers, A’s latest value and the unequal summaries.

Download the complete example. Use Python 3.12+ with the standard library only; all inputs are synthetic. After downloading, run python R539.py.

Python’s sorting guide supports deterministic ordering when presenting the selected rows, and the decimal reference supports the explicit numeric representation. The arithmetic does not validate the source extraction. A reviewer should still open the original table and check the fiscal-year header and EPS basis for every contributing record in this small example.

Explain the vendor comparison without relabeling the sample

The two-broker mean is a summary of our selected records. The vendor’s 1.35 is a separate synthetic observation with its own coverage and timestamp. A difference can arise from more brokers, a longer freshness window, different exclusion rules or different updates. Do not force one number to match the other by rounding, deleting an inconvenient broker or treating the vendor figure as another contributing report.

Retain the vendor’s broker count, cutoff and EPS definition when available. If these are unavailable, say the comparison cannot be fully reconciled. A current vendor value cannot be assumed to describe the report cutoff used in an older snapshot. Calling it historical consensus would require a historical dataset and a verified availability date.

With no eligible broker records, return “sample unavailable” rather than divide by zero or manufacture EPS 0. With one broker, the mean is simply that broker’s forecast and should be labeled accordingly. A narrow sample may still support a broker-specific valuation calculation; it does not establish the market’s collective expectation.

Test different failure mechanisms

The mixed-year counterexample includes C’s 2028 EPS of 2.00 and double-counts A’s old 2027 report. The resulting 1.40 is arithmetically reproducible but answers no clean broker-by-2027 question. Correcting the selection changes the summary to 1.30. This is a data alignment failure, not a rounding discrepancy.

The after-cutoff report is a separate availability failure. B’s 1.60 may be a valid later forecast, but it is not evidence available in the defined 26 October snapshot. Keep it for a subsequent run, where the comparison should show the actual new-report event. Do not overwrite the earlier snapshot with later knowledge.

Deliver a research table that can be updated

The handoff includes raw records, exclusions, the selected broker-by-year table, sample count and mean, and the separate vendor comparison. Record the retrieval window and any response cap. A source returning only a limited number of reports can omit older but still eligible brokers, so the table must describe observed coverage rather than claim completeness.

On a new report, update only the relevant broker-year cell, recalculate the summary and preserve the old selected value. On a source correction, label the input revision separately from a genuine new forecast. Reopen comparisons after share-count changes or EPS definition changes. This produces a usable numerical research artifact while keeping a small returned-report sample distinct from provider consensus and from realized earnings.

Reconcile contribution counts before using the mean

Keep separate counts for retrieved reports, eligible report rows and contributing brokers. In the fixture five retrieved records become three eligible 2027 rows at the cutoff, then two contributing brokers after A’s superseded record is removed. Those counts explain why a long-looking report list can contain little independent coverage.

Have a reviewer read the selected A and B cells against their original report locations, then recompute (1.20 + 1.40) / 2. Also inspect one excluded future record and one excluded fiscal year. Checking exclusions is necessary because an incorrect extra contributor can change the mean even when every selected EPS was copied correctly.

Before using 1.30 in a valuation, attach the sample identifier and forecast year to the denominator. A later update to the broker table should invalidate only results that reference the affected sample version, while preserving the earlier calculation for review.

Keep the contributing distribution visible beside the mean: A forecasts 1.20 and B forecasts 1.40. Their average hides that disagreement, and two brokers do not establish a stable market distribution. A changed report title or rating also does not necessarily change EPS. Compare the same broker-year value and basis before recalculating valuations; retain report identity separately from forecast content so duplicate reports do not create false earnings revisions.

FAQ

Is the average of returned reports market consensus?

Only if an appropriate methodology and coverage support that label. Here it is explicitly a two-broker sample mean.

Can 2028 forecasts fill missing 2027 values?

No. They describe a different fiscal period and need a separate column and calculation.