"""按财年和新鲜度定位预测分歧;原因仅由另供合成摘录确认。""" import json from datetime import date from decimal import Decimal as D from statistics import median cutoff = date(2026, 10, 26) reports = [("A", 2027, "2026-10-01", "0.90"), ("A", 2027, "2026-10-20", "1.00"), ("B", 2027, "2026-10-21", "1.10"), ("C", 2027, "2026-10-22", "1.20"), ("D", 2027, "2026-10-23", "2.00"), ("E", 2027, "2026-07-01", "3.00"), ("F", 2028, "2026-10-24", "4.00")] def select_latest(records): latest, same_day_values = {}, {} for broker, year, published, eps in records: day = date.fromisoformat(published) if year != 2027 or day > cutoff: continue parsed = D(eps) if not parsed.is_finite(): raise ValueError("nonfinite_forecast_eps") identity = (broker, year, day) if identity in same_day_values and same_day_values[identity] != parsed: raise ValueError("same_date_forecast_conflict") same_day_values[identity] = parsed if broker not in latest or day > latest[broker][0]: latest[broker] = (day, parsed) return latest latest = select_latest(reports) fresh = {b: value for b, (day, value) in latest.items() if (cutoff-day).days <= 60} stale = {b: value for b, (day, value) in latest.items() if (cutoff-day).days > 60} center = median(fresh.values()) flagged = sorted(b for b, value in fresh.items() if abs(value-center)/abs(center) >= D("0.50")) cause_before = {b: "unknown_requires_original_report" for b in flagged} supplied_excerpt = {"A": {"profit_millions": D("100"), "diluted_shares_millions": D("100"), "source": "synthetic-excerpt-A"}, "D": {"profit_millions": D("100"), "diluted_shares_millions": D("50"), "source": "synthetic-excerpt-D"}} for broker, fields in supplied_excerpt.items(): assert fields["profit_millions"]/fields["diluted_shares_millions"] == fresh[broker] assert center == D("1.15") and flagged == ["D"] and set(stale) == {"E"} assert set(fresh) == {"A", "B", "C", "D"} fresh_mean = sum(fresh.values())/len(fresh) assert fresh_mean == D("1.325") assert cause_before == {"D": "unknown_requires_original_report"} assert select_latest(list(reversed(reports))) == latest for candidates in [reports + [("B", 2027, "2026-10-21", "9.00")], list(reversed(reports + [("B", 2027, "2026-10-21", "9.00")]))]: try: select_latest(candidates) except ValueError as exc: assert str(exc) == "same_date_forecast_conflict" else: raise AssertionError("同日不同预测不能按行序挑选") assert select_latest(reports + [("B", 2027, "2026-10-21", "1.10")]) == latest for token in ["NaN", "Infinity", "-Infinity"]: try: select_latest([("B", 2027, "2026-10-21", token)]) except ValueError as exc: assert str(exc) == "nonfinite_forecast_eps" else: raise AssertionError("非有限预测不能进入分歧计算") print(json.dumps({"fresh": {b: str(v) for b, v in fresh.items()}, "stale": {b: str(v) for b, v in stale.items()}, "median": str(center), "fresh_mean": str(fresh_mean), "flagged": flagged, "cause_before_excerpt": cause_before, "confirmed_pair_A_D": "same supplied profit 100; diluted share assumptions 100 versus 50", "outlier_deleted": False}, sort_keys=True))