Company Research and Valuation
Locate disagreement in broker earnings forecasts
Investigate broker forecast disagreement by identifying which fiscal year, report vintage and broker create the spread. Keep the underlying distribution, separate stale forecasts and produce a targeted report-review list. A broad average can conceal a materially different assumption; deleting the most distant number can conceal the very research question that needs attention.
This guide actually groups and checks synthetic A-share-style forecasts, then uses separately supplied synthetic report excerpts to verify one denominator difference. It does not read real broker report full text or prove that CoTrading’s forecast-dispersion interface exists. Reference structured report tools do not establish full-text access or complete market coverage.
Accept one comparable forecast object
Fix the stock, target fiscal year, currency, EPS basis, cutoff and freshness policy. The fixture studies 2027 diluted EPS in CNY as of 26 October 2026. Its operational freshness window is at most 60 calendar days since publication. That window is a declared review choice, not a universal definition of an economically valid forecast.
Obtain report identifiers, publication dates, fiscal headers and EPS definitions from the actual sources. Resolve broker aliases and select the latest eligible report for each broker-year. Retain superseded reports for change analysis, but do not give a broker multiple weights because its reports appeared more often in the query response.
The script starts from synthetic accepted numeric records. A real workflow must verify source timing and definitions before this stage. If only a limited report window is available, label the observed sample and its gaps. A few returned forecasts cannot be promoted to market consensus simply because their numbers can be averaged.
Separate fiscal years and stale observations
The fixture includes an older A forecast of 0.90 and a newer A forecast of 1.00, both for 2027. It selects the latter. F’s 4.00 forecasts 2028 and remains outside the 2027 calculation. E’s 2027 estimate of 3.00 is from 1 July and is stale under the chosen cutoff policy.
| Broker | Selected 2027 EPS | Publication date | Freshness group |
|---|---|---|---|
| A | 1.00 | 20 October | fresh |
| B | 1.10 | 21 October | fresh |
| C | 1.20 | 22 October | fresh |
| D | 2.00 | 23 October | fresh |
| E | 3.00 | 1 July | stale |
Do not erase E. Present it separately with age and source so the reader can distinguish old assumptions from current disagreement. A stale value can still be a legitimate historical forecast. It simply does not contribute to this declared fresh-sample comparison.
The raw collection contains seven reports, but the fresh target-year sample has four contributing brokers. Keep those denominators visible. Counting every retrieved record as independent coverage would double-count A, mix F’s year and conceal E’s age.
Calculate a review flag, not a statistical verdict
The fresh EPS values are 1.00, 1.10, 1.20 and 2.00. Their median is 1.15 and mean 1.325. The Python statistics reference documents median calculation, including averaging the middle two observations. The mean and median summarize this particular sample; neither is a universal best estimate of the company’s future result.
For a transparent review rule, flag a forecast whose absolute distance from the positive median is at least 50% of that median. D’s difference is 0.85, approximately 73.91% of 1.15, so D enters the review queue. This is a diagnostic threshold, not a significance test or proof that D is wrong.
center = median(fresh.values())
flagged = sorted(broker for broker, value in fresh.items()
if abs(value-center)/abs(center) >= D("0.50"))
The fixture has a positive median. If a real sample has a zero or economically tiny center, design an absolute-unit or other suitable diagnostic before dividing; do not reuse this relative threshold blindly. For a very small sample, even a clean flag only narrows the reading task and cannot establish a reliable market distribution.
Execute the distribution and review queue
Download the complete example. Use Python 3.12+, the standard library and synthetic records; run python R542.py. The source is docs/growth/research/round-5/examples/R542.py.
Actual output keeps A through D fresh, E stale, computes median 1.15 and fresh mean 1.325, and flags D alone. Before excerpts are supplied, D’s cause is unknown_requires_original_report. Assertions verify each grouping and the numerical summaries. D remains in the fresh distribution: the outlier-deleted flag is false.
The review list should identify the exact D report, its target year, observed deviation and the question to inspect. A useful question is which profit, tax, adjustment or share-count assumption supports the higher EPS. Do not phrase the request as finding evidence that the broker is mistaken; the discrepancy may be valid and informative.
Verify a cause from separately supplied material
The second phase receives synthetic excerpts for A and D. Both use forecast profit of 100 million, but A assumes 100 million diluted shares and D assumes 50 million. Recomputing profit divided by forecast shares reproduces EPS 1.00 and 2.00. This supports a denominator-assumption difference for that pair under the supplied excerpts.
IAS 33’s overview explains why per-share numerators and denominators require attention. It does not validate the brokers’ forecasts or establish which share assumption will occur. The example’s excerpt data are invented inputs, not quotations from actual private research.
The script checks both formulas before reporting the confirmed pair difference. It does not conclude that revenue doubled, margins improved or D used a stronger product outlook. Those operating explanations are absent from the structured EPS records and from the supplied evidence. A rating or target-price label would not supply them either.
Test the stale-extreme counterexample
E’s 3.00 is farther from the fresh center than D’s 2.00, but it belongs to the stale group. Mixing it into the fresh sample changes the summary and can make the current disagreement look broader than the accepted snapshot supports. The proper response is separate presentation and source review, not quiet deletion or calling E a current bullish outlier.
F’s 2028 number is a different period, not another extreme 2027 estimate. A report containing several future columns needs explicit year selection before any dispersion calculation. The highest number on a page is not necessarily the relevant forecast.
These distinctions preserve the research task: locate a specific comparable disagreement, then inspect its source. Generic outlier removal would change the distribution without establishing why the value differs. It can be useful in a separate modeling policy, but it does not complete this company-research investigation.
Deliver confirmed and unresolved explanations separately
The handoff includes raw reports, latest broker-year selection, fresh and stale tables, summary definitions, flagged report references and a cause log. Mark a cause confirmed only where an original report or supplied excerpt supports it. Keep unanswered operating questions open instead of converting plausible explanations into facts.
Have a reviewer reconstruct the median, D’s deviation and the A/D share-denominator calculation. Also inspect E’s stale status and F’s year exclusion. That checks both the numerical queue and its evidence boundaries.
Reopen the panel when a broker updates its forecast, a share assumption changes or a fuller source becomes available. Preserve previous flags and causes with their old snapshots. This produces a practical forecast-disagreement investigation, not a promise of full report reading, consensus completeness or predictive power.
Turn the flag into a bounded reading task
For each flagged report, save the accepted EPS, year, publication date, distance rule and exact question awaiting source review. Ask for the relevant forecast table and assumption passage, not an unrestricted search for a persuasive story. The review can end with a confirmed explanation, a comparability issue or an unresolved cause; all three are legitimate results.
Keep numerical extraction and explanation evidence linked but distinct. A report table can establish that D forecasts EPS 2.00 without establishing why. The separate supplied excerpts add a checkable profit-and-share calculation for A and D. That does not authorize explaining B or C through the same assumption, nor does it establish which forecast will prove accurate.
When updating the distribution, compare both fresh values and coverage. A report aging outside the window can change the center without any broker revising its estimate. Label that as a freshness-composition change. Preserve the old snapshot and flags so the next researcher can determine whether disagreement moved because of new forecasts, different inclusion or better source evidence.
Resolve same-day conflicts before selecting latest forecasts
The selector checks (broker, fiscal_year, publication_date) before latest-report selection. Numerically equal duplicates are reused once; different EPS values for the same key raise same_date_forecast_conflict. A date-only record supplies no intraday ordering evidence, so neither forward nor reversed source order may choose a winner. Obtain reliable report sequence evidence or resolve the source conflict before continuing.
The downloadable self-check adds B’s 9.00 beside its 1.10 on 21 October and asserts rejection in both orders; an equal 1.10 duplicate leaves the result unchanged. The selector also uses Decimal’s finite-value check to reject NaN and either infinity before grouping. Those are invalid forecast inputs, not extreme estimates to retain in the dispersion distribution.
FAQ
Does the flagged forecast have to be removed?
No. The flag creates a review task. Keep the distribution until a separate, justified policy changes it.
Can an EPS difference reveal the business assumption automatically?
No. Obtain and inspect supporting report material; otherwise the cause remains unknown.