"""发布前冻结EPS与正式实际值配对;晚取预测和不可比口径阻断。""" import json from datetime import datetime from decimal import Decimal as D actual = {"symbol": "AAA", "period": "FY2025", "basis": "diluted", "measure": "GAAP", "period_start": "2025-01-01", "period_end": "2025-12-31", "source": "synthetic-official-release", "currency": "CNY", "eps": "1.20", "released": "2026-01-20T16:00:00+08:00"} estimate = {"symbol": "AAA", "period": "FY2025", "basis": "diluted", "measure": "GAAP", "period_start": "2025-01-01", "period_end": "2025-12-31", "source": "synthetic-frozen-estimate", "currency": "CNY", "eps": "1.00", "saved": "2026-01-19T09:00:00+08:00", "data_as_of": "2026-01-18T18:00:00+08:00"} def compare(expected, observed): saved, release, data_as_of = [datetime.fromisoformat(v) for v in [expected["saved"], observed["released"], expected["data_as_of"]]] if any(stamp.tzinfo is None for stamp in [saved, release, data_as_of]): return {"status": "blocked_timezone"} if not data_as_of <= saved < release: return {"status": "blocked_post_release_or_invalid_snapshot"} mismatched = [field for field in ["symbol", "period", "period_start", "period_end", "basis", "measure", "currency"] 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} difference = current-prior relative = difference/prior if prior > D("0.05") else None return {"status": "comparable", "expected": str(prior), "actual": str(current), "difference": str(difference), "relative": str(relative) if relative is not None else None, "relative_status": "valid" if relative is not None else "negative_or_near_zero_base"} good = compare(estimate, actual) late = compare({**estimate, "saved": "2026-01-21T09:00:00+08:00"}, actual) wrong_period = compare({**estimate, "period": "Q42025", "period_start": "2025-10-01"}, actual) wrong_basis = compare({**estimate, "basis": "basic"}, actual) wrong_measure = compare({**estimate, "measure": "adjusted"}, actual) wrong_currency = compare({**estimate, "currency": "HKD"}, actual) negative = compare({**estimate, "eps": "-0.10"}, {**actual, "eps": "0.10"}) near_zero = compare({**estimate, "eps": "0.01"}, {**actual, "eps": "0.03"}) assert good["difference"] == "0.20" and good["relative"] == "0.2" assert late["status"] == "blocked_post_release_or_invalid_snapshot" assert wrong_period["fields"] == ["period", "period_start"] and wrong_basis["fields"] == ["basis"] assert wrong_measure["fields"] == ["measure"] assert wrong_currency["fields"] == ["currency"] assert negative["difference"] == "0.20" and negative["relative"] is None assert near_zero["difference"] == "0.02" and near_zero["relative"] is None assert compare({**estimate, "saved": actual["released"]}, actual)["status"] == "blocked_post_release_or_invalid_snapshot" for token in ["NaN", "Infinity", "-Infinity"]: for side in ["estimate", "actual"]: expected_probe = {**estimate, "eps": token} if side == "estimate" else estimate actual_probe = {**actual, "eps": token} if side == "actual" else actual assert compare(expected_probe, actual_probe) == {"status": "blocked_nonfinite_eps", "fields": [side+"_eps"]} assert compare({**estimate, "eps": "NaN"}, {**actual, "eps": "Infinity"}) == { "status": "blocked_nonfinite_eps", "fields": ["estimate_eps", "actual_eps"]} print(json.dumps({"comparable": good, "late_snapshot": late, "wrong_period": wrong_period, "wrong_basis": wrong_basis, "wrong_measure": wrong_measure, "wrong_currency": wrong_currency, "negative_base": negative, "near_zero_base": near_zero}, sort_keys=True))