research(gtaa): il gate (A) non misurava cio' che dichiarava — e TLT ha 13.5 anni in meno

Il test del gate sulla banda GTAA01 aveva smesso di passare senza che il codice fosse
cambiato (data/raw/ e' gitignored, IB rivede ADJUSTED_LAST all'indietro ogni notte).
Invece di allentare la soglia, misurata la risoluzione del criterio.

`rank_in <= rank_oos` lo passano 14/30 celle (47%) PER COSTRUZIONE: la somma dei ranghi
e' la stessa nelle due finestre. E sulla proposta si decideva su 0.00116 di Sharpe contro
uno spread di griglia di 0.3124. Il 27/07 quel criterio passava, e passava per caso.

Criterio sostituito con quello decidibile: la proposta e' una BANDA (la cadenza settimanale
e' gia' produzione), quindi a cadenza fissa la banda scelta sui soli dati pre-2015 e' 25%
= la proposta, margine +0.0151 (13x il vecchio); chi avesse scelto sull'hold-out avrebbe
preso 40%. Controllo positivo incluso. Regge sull'universo coerente a 5 gambe.

TROVATO PER STRADA: TLT parte dal 2016-02-03 invece che dalla quotazione (2002-07-22) →
GTAA01 gira su CINQUE gambe prima del 2016, e quella assente e' la gamba obbligazionaria.
Non e' di oggi (cosi' dal primo giro nel cron log del 24/06, prima della validazione) e non
e' un fetch da rifare: una richiesta retro esplicita a IB ritorna 0 barre.

Nessuna certificazione l'aveva visto perche' tutte guardano DENTRO la serie: una serie
troncata e' integra, senza gap, senza spike, senza duplicati. Cablate due guardie in
fetch_ib_equities.certify — TRONCATO (storia persa vs disco; il file NON viene sovrascritto
ne' fuso, ADJUSTED_LAST e' ri-aggiustato all'indietro e il giunto creerebbe un salto) e
STORIA-CORTA (parte dopo la quotazione, con distinzione dal tetto della richiesta 30Y).
Controlli negativi obbligatori: giro normale, serie al cap, ETF giovane, simbolo fuori
tabella.

Produzione INVARIATA: REBAL_BAND_USD resta $50, GTAA01 resta non deployabile (PRIIPs).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-08-07 19:30:34 +00:00
parent ba5ea2f5c3
commit 963776e5d2
6 changed files with 754 additions and 20 deletions
+18 -3
View File
@@ -148,9 +148,24 @@ def main() -> None:
rank_in = int((G["sh_in"] > prop['sh_in']).sum()) + 1
rank_oos = int((G["sh_oos"] > prop['sh_oos']).sum()) + 1
print(f" rango della proposta : {rank_in}/{len(G)} in-sample · {rank_oos}/{len(G)} sull'hold-out")
if rank_oos < rank_in:
print(" ⚠️ La proposta sta MEGLIO sull'hold-out che in-sample: e' la firma della")
print(" selezione-sull'hold-out. Il gate si giudica su cosa succede scegliendo al buio.")
print(" (⚠️ 2026-08-07: il confronto FRA I RANGHI e' stato ritirato come criterio — passa")
print(" ~meta' delle celle per costruzione e sulla proposta si decideva su 0.001 di")
print(" Sharpe. Resta stampato come descrizione. Vedi r0807_gtaa_gate_resolution.py.)")
# criterio decidibile: la proposta e' una BANDA, la cadenza e' gia' quella di produzione
ev = PROPOSTA[0]
riga = G[G["every"] == ev]
blind = riga.sort_values("sh_in", ascending=False).iloc[0]
hold = riga.sort_values("sh_oos", ascending=False).iloc[0]
secondo = riga[riga["frac"] != blind["frac"]]["sh_in"].max()
print(f"\n CRITERIO DECIDIBILE — a cadenza di produzione ({ev}), quale banda si sceglie?")
print(f" sui soli dati pre-2015 : {blind['frac']:.0%} "
f"(margine sulla 2ª: {blind['sh_in'] - secondo:+.4f} di Sharpe)")
print(f" guardando l'hold-out : {hold['frac']:.0%} "
"<- controllo positivo: se coincidessero, il gate non avrebbe potenza")
if blind["frac"] == PROPOSTA[1] and hold["frac"] != PROPOSTA[1]:
print(" -> la proposta e' la cella scelta AL BUIO, e chi avesse guardato l'hold-out")
print(" ne avrebbe scelta un'altra: e' il contrario di una selezione-sull'hold-out.")
print(f"\n Costo di scegliere al buio invece che a posteriori (hold-out): "
f"{best['sh_oos'] - prop['sh_oos']:+.2f} di Sharpe")
n_best = orders_per_year(cells[(int(best["every"]), float(best["frac"]))], CAP_REF,