research(gtaa): DEGIRO ha tutte e sei le gambe — verificato sul conto reale
Screenshot della watchlist "Pythagoras" su flatexDEGIRO: le 6 gambe ci sono tutte, coi ticker esatti raccomandati. Era Revolut a non avere R2US. VERIFICA INDIPENDENTE che le due linee EUR (VUAA, XNAS su Tradegate) siano gli stessi fondi, dai dati e non dallo screenshot: il rapporto prezzo-IB/prezzo-Degiro dev'essere un solo cambio -> 1.1341 e 1.1315, scarto 0.23%. Le altre 4 stanno a 0.993-0.998 (gia' USD). Due fondi diversi non darebbero lo stesso cambio. ERRORE MIO, dello stesso tipo che avevo codificato come regola un messaggio prima: per cercare le linee in euro delle altre 4 gambe ho interrogato IB per TICKER sulle borse tedesche, ottenendo "nessuna linea EUR" su 4/4. Falso. Cercando per ISIN ognuna ce l'ha: ZPRR (=R2US), IS04 (=IDTL), EGLN (=IGLN, Londra EUR), IS0R (=IHYU). Un "assente" da una ricerca per ticker su una borsa dove quel ticker non esiste non significa "non esiste". TURNOVER PER GAMBA a $10k (21 ordini/anno): IDTL 9 ordini / $6.257 = 46% del totale, poi VUAA 17%, IGLN 12%, XNAS 12%, IHYU 7%, R2US 6%. Il 71% del turnover e' su gambe in USD ($9.752/anno) -> conversione $24/anno a 25bps. Spostare la sola IDTL sulla linea in euro (IS04) copre il 64% del turnover convertibile. Ma non e' un risparmio netto (spread Xetra piu' larghi delle linee primarie di Londra, tariffa di connettivita' per borsa) e su $10k si parla di decine di dollari l'anno in entrambe le direzioni: non e' una decisione importante, ed e' piu' utile dirlo che costruire una precisione finta. Il prompt W-8BEN di Degiro non riguarda queste sei: sono fondi irlandesi, non titoli USA. Stato: preparazione, non azione (saldo Degiro EUR 328,92; GTAA01 richiede >=$3k e la decisione venue tiene tutto su Deribit fino a $20k). Book, pesi, cron, config INVARIATI. 448 test verdi (+1). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XBbYmiXqbUNuGpK9sfbsGp
This commit is contained in:
@@ -46,10 +46,21 @@ ISIN = {"VUAA": ("IE00BFMXXD54", "Vanguard S&P 500 UCITS (Acc, USD)"),
|
||||
"IGLN": ("IE00B4ND3602", "iShares Physical Gold ETC"),
|
||||
"IHYU": ("IE00B4PY7Y77", "iShares $ High Yield Corp Bond UCITS")}
|
||||
|
||||
# Stesso fondo, ticker diverso su borse diverse. Verificato su contract details IB: se le ISIN
|
||||
# coincidono e' la STESSA classe di quote, quindi lo stesso NAV — cambia solo dove si negozia e in
|
||||
# che valuta. Serve perche' un broker puo' non quotare la linea di Londra e quotare quella di Xetra.
|
||||
EQUIVALENZE = [("R2US", "ZPRR", "IE00BJ38QD84", "Xetra EUR")]
|
||||
# Stesso fondo, ticker diverso su borse diverse. Verificato su contract details IB cercando **per
|
||||
# ISIN**: se le ISIN coincidono e' la STESSA classe di quote, quindi lo stesso NAV — cambia solo
|
||||
# dove si negozia e in che valuta. Serve perche' (a) un broker puo' non quotare la linea di Londra,
|
||||
# (b) su un conto in EURO la linea in euro evita la conversione a ogni ordine.
|
||||
#
|
||||
# ⚠️ Queste righe vanno cercate PER ISIN e non per ticker, ed e' un errore che ho fatto io stesso
|
||||
# costruendo la tabella: la prima sonda cercava il ticker "R2US" sulle borse tedesche e non trovava
|
||||
# nulla, concludendo "nessuna linea EUR". La linea c'e' e si chiama ZPRR. Cercare un ticker su una
|
||||
# borsa dove quel ticker non esiste da' sempre "assente", che NON significa "non esiste".
|
||||
EQUIVALENZE = [("R2US", "ZPRR", "IE00BJ38QD84", "Xetra EUR"),
|
||||
("IDTL", "IS04", "IE00BSKRJZ44", "Xetra EUR"),
|
||||
("IGLN", "EGLN", "IE00B4ND3602", "Londra EUR"),
|
||||
("IHYU", "IS0R", "IE00B4PY7Y77", "Xetra EUR"),
|
||||
("VUAA", "VUAA", "IE00BFMXXD54", "Xetra/BIt EUR"),
|
||||
("XNAS", "XNAS", "IE00BMFKG444", "Xetra EUR")]
|
||||
|
||||
# Ripiego misurato: se un broker non ha NESSUNA linea Russell 2000, l'S&P 400 mid cap e' l'unica
|
||||
# alternativa comune. NON e' lo stesso indice (mid, non small) — vedi sezione (6) per il costo.
|
||||
@@ -280,6 +291,23 @@ def main() -> None:
|
||||
print(" reale, ma piccolo rispetto alla soglia (${:.2f}/ordine a ${:,.0f}).".format(
|
||||
float(soglia_per_ordine(dep, cal, CAP, band_c, can_every)[1:]), int(CAP)))
|
||||
|
||||
print("\n ⚠️ E LA CONVERSIONE NON SI DISTRIBUISCE IN MODO UNIFORME: il turnover e' concentrato")
|
||||
print(" in poche gambe, quindi conviene sapere QUALI conviene spostare su una linea in euro.")
|
||||
print(f"\n {'gamba':7s}{'ticker':8s}{'ordini/anno':>13s}{'turnover/anno':>16s}{'quota':>8s}")
|
||||
tv = {}
|
||||
for s in U.US:
|
||||
_, pos = U.leg_returns(dep[s], dep[s], cal, CAP / 6.0, band_c, can_every,
|
||||
U.cost_form(fixed=1.0))
|
||||
tv[s] = (int((pos.diff().abs() > 1e-12).sum()) / (len(cal) / 252.0),
|
||||
float(pos.diff().abs().sum()) * CAP / 6.0 / (len(cal) / 252.0))
|
||||
tot = sum(v for _, v in tv.values())
|
||||
for s, (n, v) in sorted(tv.items(), key=lambda kv: -kv[1][1]):
|
||||
print(f" {s:7s}{U.SET_DEPLOY[s]:8s}{n:>13.0f}{'$'+format(v,',.0f'):>16s}{v/tot:>8.0%}")
|
||||
top = max(tv.items(), key=lambda kv: kv[1][1])
|
||||
print(f"\n -> {U.SET_DEPLOY[top[0]]} da sola vale il {top[1][1]/tot:.0%} del turnover e "
|
||||
f"{top[1][0]:.0f} dei {sum(n for n, _ in tv.values()):.0f} ordini: se si vuole ridurre la")
|
||||
print(" conversione senza cambiare sei strumenti, si sposta QUELLA su una linea in euro.")
|
||||
|
||||
# ---------- (6) ripiego sulla gamba small cap ----------
|
||||
print("\n" + "=" * 100)
|
||||
print(" (6) SE IL BROKER NON HA NESSUNA LINEA RUSSELL 2000")
|
||||
|
||||
Reference in New Issue
Block a user