research(gtaa): la via UCITS e' aperta e costa ~zero — il broker non e' la variabile

Domanda dell'operatore: "usiamo revolut o degiro". Risposta misurata: cambiare
broker non sblocca nulla (il PRIIPs e' una norma, non una politica di IB); cambiare
VEICOLO si', e costa ~zero.

CORREZIONE A UNA MIA AFFERMAZIONE. La nota in gtaa.py diceva che gli UCITS fanno
perdere la validazione a 30 anni. Falso: il PRIIPs vieta di COMPRARE, non di
GUARDARE — i prezzi dei 6 ETF USA restano leggibili, quindi il segnale gira sui 30
anni per sempre e cambia solo il veicolo su cui si incassa.

Misure (3 lenti, un grado di liberta' per volta, 6.3 anni comuni):
  L0 segnale USA + rend. USA   Sh 0.81 / CAGR 3.96%
  L2 segnale UCITS + rend. UCITS Sh 0.84 / CAGR 4.08%
  drag del veicolo +0.10%/anno EW, coerente coi TER; ritenuta USA ~35bps a FAVORE
  dell'UCITS e non inclusa nel drag.

Lo stimatore ovvio sbagliava: la media delle differenze giornaliere dava -0.47%/anno
su CSPX contro -0.06% vero (SE ~7%/anno = 15x la quantita' stimata, piu' drag di
varianza). La deviazione fra veicoli sullo stesso indice si misura sul RAPPORTO
CUMULATO.

Il vincolo non e' il broker ma il prezzo di UNA azione, che e' una scelta: CSPX $802
vs VUAA $144 sullo stesso S&P 500. A $3.000 con azioni intere l'insieme STORIA tiene
4/6 gambe (a mercato il 33%), l'insieme DEPLOY 6/6 (65%) -> il frazionamento non
serve. Letto su gambe-vive+vol, non su Sharpe: il vincolo intero ALZA lo Sharpe
perche' de-leveraggia (null de-levering, 4a occorrenza).

Resta da verificare una cosa sola: 77-149 ordini/anno contro soglie $0.90 ($3k) /
$2.23 ($10k) / $7.62 ($50k) per ordine. Raccomandazione: restare su IB.

Feed equity: aggiunto il CROSS-CHECK che mancava (src/data/eq_crosscheck.py). Il
primo veicolo estero ha trovato subito CSPX 2012-01-13 con open/high in USD e
low/close in EUR (fattore 1.2797 = EURUSD del giorno), invisibile alla guardia
maxret>50% — stesso schema dello split 2:1 del 25/07. Soglia non tarabile sulla
deviazione (rumore 9.90%, margine 2.2x): cambiata statistica in |dev|/movimento del
gemello -> margine 5.3x. Limite EURUSD 1.09 dichiarato e chiuso sul DANNO (dSharpe
mediano -0.003), congelato in un test.

Book, pesi, cron, config INVARIATI. 435 test verdi (+24).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XBbYmiXqbUNuGpK9sfbsGp
This commit is contained in:
Adriano Dal Pastro
2026-07-26 23:01:54 +00:00
parent 6664575e1c
commit be4690375f
8 changed files with 1481 additions and 16 deletions
+278
View File
@@ -0,0 +1,278 @@
# 2026-07-26 — GTAA01 sugli UCITS: la via d'uscita dal blocco PRIIPs è aperta, e il broker non è la variabile
**Domanda dell'operatore:** *"usiamo revolut o degiro"* — dopo che il conto reale ha rifiutato
l'ordine sui 6 ETF USA di GTAA01 con `Trading limitato — Questo prodotto non dispone di un KID`.
**Risposta breve:** cambiare broker non sblocca niente (il PRIIPs è una norma, non una politica di
IB). Ciò che sblocca è cambiare **veicolo**. Misurato: il cambio di veicolo costa **~0**, e con la
scelta giusta delle linee lo sleeve è eseguibile **senza frazionamento** già a $3.000.
**Book, pesi, cron, config: INVARIATI.** GTAA01 non entra nel book live (resta la decisione venue
del 26/07: 100% Deribit fino a $20k).
Script: `scripts/research/fetch_ib_ucits.py`, `scripts/research/r0726_gtaa_ucits.py`.
Modulo nuovo: `src/data/eq_crosscheck.py`. Test: `tests/test_eq_crosscheck.py` (14),
`tests/test_gtaa_ucits.py` (10).
---
## 0. La premessa che era falsa, ed è la ragione per cui il problema è piccolo
La nota che avevo scritto in `src/portfolio/gtaa.py` diceva:
> storia più CORTA (diversi nati dopo il 2010) → si perde la validazione a 30 anni che è ciò che
> rendeva credibile questo sleeve
**È falsa, per un motivo strutturale: il PRIIPs vieta di COMPRARE, non di GUARDARE.** I prezzi di
SPY/QQQ/IWM/TLT/GLD/HYG restano leggibili — l'operatore li aveva sotto gli occhi sul terminale
*mentre* l'ordine veniva rifiutato. Quindi il **segnale** di GTAA01 può continuare a girare sui 30
anni di serie USA per sempre; cambia solo il **veicolo** su cui si incassa il rendimento.
La storia corta degli UCITS non serve a validare la strategia. Serve a misurare una cosa sola: la
**deviazione del veicolo**, che è un drift lento e si stima bene anche su pochi anni.
> **Regola:** prima di dichiarare che un vincolo esterno distrugge un risultato, chiedersi
> *esattamente cosa* vincola. Qui la differenza fra "non posso comprare" e "non posso vedere"
> separa uno sleeve morto da uno sleeve con un problema di esecuzione.
---
## 1. Il dato, prima della strategia — e il feed equity non aveva un cross-check
Estratti 12 veicoli UCITS da IB (`LSEETF`, **tutti in USD**: quotare in USD elimina un livello di
costo, la conversione per ordine). Alla prima certificazione, **7 su 10 con gap lunghi** e CSPX con
un **+27.8% giornaliero** su un tracker S&P 500.
I gap sono tutti **al lancio** della linea USD (ultimo gap lungo: CSPX 2014-04, XRSU 2016-10,
IGLN/IHYU 2011); negli ultimi 3 anni tutti i veicoli fanno 253 barre/anno. Non è un problema
corrente.
Il +27.8% invece è un difetto vero. La barra CSPX 2012-01-13:
```
open 112.740 high 112.740 low 88.010 close 88.010
```
**`open`/`high` in USD, `low`/`close` in EUR** — fattore dai close adiacenti **1.2797**, cioè
l'EURUSD di quel giorno (reale 1.266-1.282). Andata e ritorno: 112.63 → 88.01 → 112.47 mentre SPY
faceva 0.39% e +0.23%.
**La certificazione esistente non lo vedeva.** L'unica guardia sui movimenti era
`maxret > 50% → SPIKE?`, e una contaminazione EUR/USD vale ~22-28%. È lo **stesso schema** dello
split 2:1 non aggiustato del 25/07 (che valeva *esattamente* 50%): una soglia tarata su una classe
di difetto non sorveglia le altre.
### Perché serviva il gemello e non una regola locale
Il discriminante del 25/07 (**range intraday**) qui non funziona: una barra contaminata ha un range
enorme, ma anche un crollo vero (SLV 2026-01-30 aveva 33% di range). Ciò che separa i due casi è che
**un evento di mercato lo fa anche il gemello**: nel *rapporto* veicolo/gemello i movimenti veri si
cancellano.
Controprova su dati reali: la stessa scansione fatta sui **prezzi** segnalava IDTL 2020-03
(liquidazione dei treasury) e IGLN 2013-04 (crollo dell'oro) — andate-e-ritorni identiche nella
forma. Sul **rapporto** spariscono, e resta la sola CSPX 2012-01-13.
Questo è il buco che il feed equity aveva: nel crypto la certificazione incrocia sempre più venue
(`certify_feed.py` vs Coinbase USD); il feed equity aveva **solo controlli locali**.
### La soglia non è tarabile sulla deviazione, ed è il punto interessante
| statistica | rumore massimo misurato | difetto CSPX | margine |
|---|---|---|---|
| deviazione dal gemello | **9.90%** (2025-04-09) | 21.4% | 2.2× ❌ |
| **|dev| / movimento del gemello** | **8.1** | **42.7** | **5.3×** ✅ |
Il 9.90% è **legittimo**: Londra chiude alle 11:30 di New York, quindi in un giorno violento le due
chiusure sono davvero lontane. Ma **un disallineamento d'orario non può superare il movimento del
mercato**: se il gemello si è mosso dello 0.4% e il veicolo se ne va del 21%, non c'è orario che lo
spieghi. La statistica adimensionale porta il margine da 2.2× a 5.3× — sopra il 3× che questo
progetto richiede a un rilevatore.
Tre condizioni congiunte (come il rilevatore di split, e per la stessa ragione): deviazione oltre
`MIN_DEV`, non-spiegato oltre `MIN_UNEXPLAINED=18.0`, e **rientro** entro 5 barre (una divergenza di
NAV vera persiste, una stampa sbagliata no).
**Riparazione = scartare la barra, non ricostruirla.** Del prezzo vero non sappiamo niente;
sappiamo che quello scritto è sbagliato. Scartarla rende corretto il rendimento 12/01→17/01
(0.14%); "ripararla" con un fattore stimato inventerebbe un dato.
### ⚠️ Limite dichiarato, e come è stato chiuso
GBPUSD ~1.27 → 21% di deviazione = **sempre rilevata**. EURUSD ~1.09 → 8.3% = **dentro il rumore**
dei giorni violenti. Non è tappabile abbassando la soglia (sotto 12 si segnalano i giorni veri).
Invece di inseguire la rilevabilità ho misurato il **danno** di una contaminazione non vista:
iniettando 60 contaminazioni casuali, **dSharpe mediano 0.003, peggiore 0.056, |Δ|>0.05 nel 2%
dei casi**. Il limite resta, ma è quantificato e irrilevante.
> **Regola:** quando un rilevatore ha un buco che non si può chiudere senza generare falsi positivi,
> si misura il **danno** del caso non rilevato, non la sua probabilità. Un buco quantificato e
> innocuo è un risultato; un buco taciuto è un debito.
---
## 2. Quanto costa il veicolo: ~zero — ma lo stimatore ovvio dà la risposta sbagliata
Prima stesura: media delle differenze giornaliere → **CSPX 0.47%/anno**. Sbagliato.
Le due serie seguono lo **stesso indice** ma sono campionate a orari diversi. La differenza
giornaliera è dominata da uno sfasamento che si **inverte il giorno dopo**: volatilità 17-22%
annualizzata, **errore standard ~7%/anno** sulla stima del drag — cioè **15 volte più grande del
drag stesso**. In più la media delle differenze *semplici* è contaminata dal drag di varianza.
Il rapporto veicolo/gemello invece è **stazionario**: il suo drift *è* il drag.
| gamba | UCITS | drag misurato | atteso da TER | + ritenuta USA | banda annua |
|---|---|---|---|---|---|
| SPY | CSPX | **0.06%** | +0.02% | +0.20% | [0.52,+0.63] |
| QQQ | EQQQ | **0.00%** | 0.10% | 0.03% | [0.13,+1.29] |
| IWM | XRSU | **0.15%** | 0.11% | +0.07% | [0.91,+0.37] |
| TLT | IDTL | **+0.18%** | +0.08% | +0.68% | [0.45,+1.60] |
| GLD | IGLN | **+0.36%** | +0.28% | +0.28% | [0.56,+0.99] |
| HYG | IHYU | **+0.28%** | 0.01% | +0.89% | [0.83,+1.88] |
| **media EW** | | **+0.10%/anno** | +0.03% | **+0.35%** | |
Controllo di plausibilità: **segno concorde in 4/6, scarto < 30bps in 6/6**. Il caso più netto è
l'oro (GLD 0.40% vs IGLN 0.12% → atteso +0.28%, misurato +0.36%): è un controllo indipendente che la
misura sta cogliendo il TER e non rumore. Le due gambe discordi restano entro 30bps, e su una banda
annua larga [0.9%,+1.9%] il segno di uno scarto così piccolo non è informativo. **Ciò che il
controllo stabilisce è la scala: decine di bps, non punti.**
⚠️ La colonna "ritenuta" è **a favore dell'UCITS e non è nel drag misurato**: `ADJUSTED_LAST` sulle
serie USA è al **lordo** della ritenuta USA del 15% che un residente italiano paga davvero sui
dividendi. Comprando SPY quella ritenuta la paghi e nella serie non c'è; un UCITS irlandese la
subisce una volta a livello di fondo e non una seconda all'incasso. *(Ipotesi fiscale dichiarata,
fonte secondaria, da confermare col commercialista — non è un parere fiscale.)*
### Le tre lenti
| lente | Sharpe | CAGR | maxDD | vol |
|---|---|---|---|---|
| L0 segnale USA + rend. USA (pubblicato) | 0.81 | 3.96% | 7.9% | 5.0% |
| L1 segnale USA + rend. UCITS (veicolo) | 0.89 | 4.22% | 7.0% | 4.8% |
| L2 segnale UCITS + rend. UCITS (+orologio) | **0.84** | **4.08%** | 7.5% | 4.9% |
**Totale L2L0: dSharpe +0.03, dCAGR +0.12%/anno.** Il cambio di veicolo *non costa*.
⚠️ `corr(L0,L2) = 0.65`, bassa per due serie sullo stesso indice — ed è l'**orologio**, non un
difetto: le due chiusure condividono la notte e la mattina americana ma non il pomeriggio.
Verificato che non sia uno sfasamento di date: la correlazione veicolo/gemello è **massima a lag 0
su 6/6 coppie** (0.46-0.78). Conseguenza: le statistiche *giornaliere* delle due lenti non sono
confrontabili una a una, mentre il **drift** sì — che è esattamente perché la sezione 2 usa il
rapporto cumulato.
---
## 3. Il vincolo vero non è il broker: è il prezzo di UNA azione
Senza frazionamento un ordine è almeno una azione. **Il prezzo unitario è una scelta
dell'emittente, non una proprietà dell'indice**: CSPX costa $802 e VUAA $144 sullo *stesso* S&P 500.
| gamba | STORIA | prezzo | DEPLOY | prezzo | a $3.000 | a $10.000 |
|---|---|---|---|---|---|---|
| SPY | CSPX | $801.86 | **VUAA** | $143.80 | 29% | 9% |
| QQQ | EQQQ | $692.67 | **XNAS** | $65.74 | 13% | 4% |
| IWM | XRSU | $437.80 | **R2US** | $86.35 | 17% | 5% |
| TLT | IDTL | $3.09 | IDTL | $3.09 | 1% | 0% |
| GLD | IGLN | $79.06 | IGLN | $79.06 | 16% | 5% |
| HYG | IHYU | $94.12 | IHYU | $94.12 | 19% | 6% |
*(% = quanto pesa una azione sull'allocazione di quella gamba)*
Danno misurato dell'esecuzione a numero **intero** di azioni, stessa finestra per entrambi:
| insieme | capitale | Sh fraz. | Sh intero | Δ | vol fraz. | vol intero | **gambe vive** | esposta |
|---|---|---|---|---|---|---|---|---|
| STORIA | $3.000 | 0.84 | 0.80 | 0.04 | 5.1% | **2.2%** | **4/6** | **33%** |
| STORIA | $10.000 | 1.08 | 1.02 | 0.06 | 5.1% | 4.2% | 6/6 | 63% |
| **DEPLOY** | **$3.000** | 0.88 | 0.84 | 0.04 | 5.1% | **4.5%** | **6/6** | **65%** |
| DEPLOY | $10.000 | 1.10 | 1.09 | 0.02 | 5.1% | 4.9% | 6/6 | 66% |
**Con i veicoli giusti il frazionamento non serve.** Con quelli sbagliati, a $3.000 lo sleeve perde
due gambe su sei ed è a mercato un terzo del tempo: non è GTAA01 con un vincolo, è un'altra cosa.
⚠️ **Si legge `gambe vive` e `vol`, non `Sharpe`.** Un vincolo che alza lo Sharpe non è un
miglioramento: arrotondando in giù riduce l'esposizione e paga meno commissioni. È il **null
de-levering** (4ª occorrenza dopo VRP-DD, TP01×DVOL, MAT01). Qui il controllo è stato eseguito e
il verdetto è che con l'insieme DEPLOY il de-levering **non c'è**.
⚠️ Scartati di proposito, benché con più storia: **RTWO** (Russell 2000 *quality* = fattore),
**CSUSS** (MSCI USA Small Cap *ESG*), **IDP6** (S&P 600, indice diverso). Equivalenza dell'indice
prima della storia.
---
## 4. Il costo del venue, per FORMA — la sola cosa su cui i broker differiscono davvero
**Ordini/anno** (dipendono da banda e cadenza, non dal listino): **77 a $3.000, 102 a $10.000, 149 a
$50.000**. Con questo numero ogni listino è calcolabile a mano.
| costo fisso/ordine | $3.000 Sh | CAGR | $10.000 Sh | CAGR | $50.000 Sh | CAGR |
|---|---|---|---|---|---|---|
| $0.00 | 0.92 | 4.45% | 0.92 | 4.48% | 0.92 | 4.48% |
| $0.35 (IB US) | 0.73 | 3.52% | 0.84 | 4.11% | 0.90 | 4.37% |
| $1.00 | 0.39 | 1.80% | 0.71 | 3.42% | 0.86 | 4.17% |
| $2.00 | 0.13 | 0.79% | 0.50 | 2.37% | 0.79 | 3.86% |
| $5.00 | 1.51 | 8.17% | 0.12 | 0.71% | 0.61 | 2.93% |
| costo proporzionale | $3.000 | $10.000 | $50.000 |
|---|---|---|---|
| 5 bps/ordine | 0.89 | 0.89 | 0.88 |
| 25 bps/ordine | 0.77 | 0.76 | 0.75 |
| 50 bps/ordine | 0.62 | 0.60 | 0.59 |
**Le soglie da verificare presso il broker:**
| capitale allocato | CAGR = 0 | Sharpe = 0.45 |
|---|---|---|
| $3.000 | $1.68/ordine | **$0.90/ordine** |
| $10.000 | $4.34/ordine | **$2.23/ordine** |
| $50.000 | $14.65/ordine | **$7.62/ordine** |
Un listino **proporzionale** è quasi indifferente al capitale (0.75-0.89 di Sharpe a ogni taglia);
uno **fisso** è una tassa regressiva. È la regola del 25/07 riconfermata su un venue diverso.
---
## 5. Risposta operativa alla domanda
**Revolut o Degiro non sbloccano gli ETF USA**: il PRIIPs vale per ogni intermediario che serve
retail UE. IB è anzi fra i più permissivi. Aprire un terzo conto per lo stesso rifiuto aggiunge
rischio di venue senza guadagno.
Ciò che si compra su *qualunque* dei tre sono gli **UCITS**, e a quel punto la scelta si gioca su
**una sola dimensione misurabile**: il costo per ordine, contro le soglie della tabella sopra, con
77-149 ordini l'anno.
**Raccomandazione: restare su IB**, perché (a) il conto esiste già, (b) i dati per il segnale
arrivano dallo stesso gateway, (c) è l'unico dei tre di cui la forma di costo è già modellata in
`gtaa.py`. La verifica che resta da fare è **una sola**: la tariffa IB per ordine su LSEETF in USD,
contro $2.23 (a $10.000) o $0.90 (a $3.000).
**Nessuna azione oggi**: la decisione venue del 26/07 tiene tutto su Deribit fino a $20k, cioè
~2028 col piano di versamenti corrente.
---
## Lezioni
1. **Prima di dichiarare che un vincolo esterno distrugge un risultato, chiedersi cosa vincola
esattamente.** "Non posso comprare" ≠ "non posso vedere": tutta la validazione a 30 anni era
salva, e la nota che diceva il contrario era mia.
2. **Un feed senza secondo parere non è certificato**, e la regola valeva già nel crypto. Il feed
equity ha vissuto 5 settimane con soli controlli locali, e il primo veicolo estero ha trovato
il buco alla prima estrazione.
3. **Una soglia tarata su una classe di difetto non sorveglia le altre** — 2ª conferma dopo lo
split 2:1 del 25/07. E quando la taratura non regge il margine richiesto, la risposta non è
accettarla ma **cambiare statistica**: qui il passaggio da assoluta ad adimensionale
(deviazione / movimento del gemello) porta il margine da 2.2× a 5.3×.
4. **La media delle differenze giornaliere non è la deviazione fra due veicoli sullo stesso
indice.** Errore standard 15× più grande della quantità stimata, più il drag di varianza. La
domanda "quanto mi costa il veicolo" è una domanda sul **drift**, quindi si misura sul rapporto
cumulato.
5. **Il prezzo unitario di un ETF è un parametro di progetto, non un dato.** Sceglierlo cambia la
soglia di capitale di uno sleeve più di qualunque negoziazione con un broker.
6. **Il grado d'accordo si conta, non si dichiara.** La prima stesura stampava "stesso segno su 6/6
gambe"; i dati dicevano 4/6. Scriverlo a mano nel `print` è il modo più facile di pubblicare una
conclusione che i propri dati smentiscono — 3ª occorrenza in questa sessione.