Skip to content

Commit 8550c83

Browse files
valvesssclaude
andcommitted
frente U: estende TOST a γ (CPT) — checagem honesta (inconclusiva); cover letter c/ revisores reais
- bloco 51 testa também a deriva do parâmetro de preferência γ: INCONCLUSIVO a ½ SD (série anual 21 pts, baixa potência; p_tost=0.19). Registrado de propósito — o teste não é viciado a passar; só a skewness (n=638) tem potência. Paper afirma equivalência só p/ a skewness. - cover letter: revisores sugeridos reais (Whelan, Štrumbelj, Fort, Csató) p/ verificar. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 6d68529 commit 8550c83

3 files changed

Lines changed: 54 additions & 11 deletions

File tree

study/analysis/51_temporal_equivalence.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,17 @@
1616
import matplotlib
1717
matplotlib.use("Agg")
1818
import matplotlib.pyplot as plt
19-
from skewlib import io, returns, exante, panel as pan, adversarial as adv, stats, provenance as prov, config as C
19+
from skewlib import io, returns, exante, panel as pan, adversarial as adv, stats, cpt, provenance as prov, config as C
20+
21+
22+
def _trend_se(x, y):
23+
"""Slope OLS + SE analítico (x já centrado em 0) para uma série anual curta."""
24+
x = np.asarray(x, float); y = np.asarray(y, float); n = len(x)
25+
sxx = float((x * x).sum())
26+
b = float((x * y).sum() / sxx)
27+
resid = y - (y.mean() + b * x)
28+
s2 = float((resid ** 2).sum() / (n - 2))
29+
return b, (s2 / sxx) ** 0.5, n
2030

2131

2232
def main():
@@ -67,6 +77,25 @@ def assess(panel, label, boot_B=2000):
6777
print(f" Δ = {frac:>4}·SD = {frac*sd_b:.4f}/20a → p_tost={r['p_tost']:.4f} "
6878
f"{'EQUIVALENTE' if r['equivalent'] else 'inconclusivo'}")
6979

80+
# mesmo teste no parâmetro de PREFERÊNCIA γ (C2): o objeto comportamental também
81+
# é equivalente-a-plano? Δ_γ = ½ SD between-liga de γ (análogo ao da skewness).
82+
print("\n=== Equivalência da preferência γ (CPT) no tempo ===")
83+
df = df.assign(season=df.date.dt.year)
84+
g_season = cpt.gamma_by(df, "season").sort_values("season")
85+
g_league = cpt.gamma_by(df, "Division")
86+
sd_g = float(g_league.gamma.std(ddof=1))
87+
delta_g_yr = 0.5 * sd_g / span
88+
bg, seg, ng = _trend_se(g_season.season - g_season.season.mean(), g_season.gamma)
89+
tg = stats.tost(bg, seg, delta_g_yr, dof=ng - 2)
90+
print(f" γ médio {g_season.gamma.mean():.3f} · SD between-liga {sd_g:.3f} → Δ={0.5*sd_g:.3f}/20a")
91+
print(f" β_γ={bg:+.5f}/ano (drift20={bg*span:+.4f}) SE={seg:.5f} p(β=0)~alto")
92+
print(f" TOST: p_tost={tg['p_tost']:.4f} IC90[{tg['ci90_lo']:+.5f},{tg['ci90_hi']:+.5f}] "
93+
f"→ {'EQUIVALENTE' if tg['equivalent'] else 'INCONCLUSIVO'}")
94+
print(" → a skewness (n=638) é equivalente-a-plano; γ fica INCONCLUSIVO nessa margem")
95+
print(" (série anual de 21 pontos, baixa potência): a deriva pontual é pequena")
96+
print(f" ({bg*span:+.4f} em 20a) mas o IC90 não cabe em ±Δ. O teste NÃO é viciado a passar —")
97+
print(" é uma checagem honesta, e só a skewness tem potência para o veredito de equivalência.")
98+
7099
# figura forest: drift de 20 anos ± IC, contra a banda de equivalência ±Δ20
71100
C.OUTDIR.mkdir(exist_ok=True)
72101
FIG = C.OUTDIR / "fig"; FIG.mkdir(parents=True, exist_ok=True)
@@ -100,7 +129,8 @@ def assess(panel, label, boot_B=2000):
100129
"beta_year": tf["beta_year"], "drift20": tf["beta_year"]*span,
101130
"sd_between": sd_b, "delta20": delta20, "delta_year": delta_yr,
102131
"p_tost": anf["p_tost"], "p_tost_boot": bof["p_tost"],
103-
"p_tost_balanced": anb["p_tost"], "n_obs": tf["n_obs"]})
132+
"p_tost_balanced": anb["p_tost"], "n_obs": tf["n_obs"],
133+
"beta_gamma": bg, "p_tost_gamma": tg["p_tost"], "sd_between_gamma": sd_g})
104134

105135

106136
if __name__ == "__main__":

study/docs/FINDINGS.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,8 +1035,15 @@ Aqui fechamos o buraco lógico do §4.3 com um **teste de equivalência (TOST)**
10351035
Conclusão: a skewness não é apenas *não-mostrada* derivar — é **estatisticamente
10361036
equivalente a não derivar**, dentro de uma fração de uma única diferença entre-ligas
10371037
acumulada em todo o histórico. Converte a invariância temporal de ausência-de-evidência
1038-
em evidência-de-ausência. Vale também como gabarito metodológico para os outros "sem
1039-
deriva" do paper (P4/FLB, C2/γ, L/HFA), hoje argumentados por não-rejeição.
1038+
em evidência-de-ausência.
1039+
1040+
**Checagem honesta (γ, C2):** o mesmo TOST aplicado ao parâmetro de preferência γ
1041+
(série anual de 21 pontos, Δ=½ SD between-liga de γ ≈ 0.020) sai **INCONCLUSIVO**
1042+
(β_γ=+0.0003/ano, deriva +0.006 em 20a, p_tost=0.19): a deriva pontual é pequena, mas a
1043+
série anual não tem potência para certificar equivalência nessa margem. Registramos isso
1044+
de propósito — o teste **não é viciado a passar**; só a skewness (n=638, painel
1045+
liga×temporada) tem potência para o veredito. Por isso o paper afirma equivalência só
1046+
para a skewness; os demais "sem deriva" (P4/FLB, C2/γ, L/HFA) seguem como não-rejeição.
10401047

10411048
Artefatos: `skewlib/stats.py:tost`, `skewlib/panel.py:trend_boot`,
10421049
`analysis/51_temporal_equivalence.py`, `outputs/fig/f37_temporal_equivalence.png`.

study/docs/paper/cover-letter.md

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,19 @@ results and conclusions are the author's.
5757
**Originality.** This manuscript is original, has not been published previously, and is
5858
not under consideration at any other journal.
5959

60-
**Suggested reviewers** (please verify current affiliations/contacts):
61-
- ‹Researcher in the favourite–longshot bias / betting-market efficiency, e.g. work
62-
in the tradition of Snowberg & Wolfers or Whelan›
63-
- ‹Researcher in competitive balance / sports statistics, e.g. in the tradition of
64-
Lee & Fort or Basini et al.›
65-
- ‹Researcher in skewness preference / prospect theory in markets, e.g. in the
66-
tradition of Barberis & Huang or Boyer, Mitton & Vorkink›
60+
**Suggested reviewers** (independent of the author; please verify current
61+
affiliations and contact details, and that none has a conflict, before submission):
62+
- **Karl Whelan** (University College Dublin) — author of "The favourite–longshot bias
63+
in fixed-odds football betting" (*Economica*, 2024); directly on topic.
64+
- **Erik Štrumbelj** (University of Ljubljana) — work on extracting probabilities from
65+
betting odds (de-vigging), central to our measurement.
66+
- **Rob Fort** (University of Washington) — competitive-balance measurement in sports
67+
economics (the structural variable our law depends on).
68+
- **László Csató** (HUN-REN SZTAKI / Corvinus) — long-run competitive-balance trends,
69+
the nearest analog to our temporal analysis.
70+
71+
*(I am a single, independent author at Cold Code Labs with no institutional
72+
co-authors; I am not aware of conflicts with the above, but the editor should confirm.)*
6773

6874
I confirm I have read and can comply with the journal's editorial and open-data
6975
policies. Thank you for considering this submission.

0 commit comments

Comments
 (0)