research: il piano dichiarato EUR 5.000 + EUR 500/mese, e la strozzatura del cap

L'operatore ha dato i numeri veri: EUR 5.000 subito + EUR 500/mese. Cambia la scala
(conto da $597 a $6.047 = 10.1x), quindi ricalcolato in dedicata invece che estrapolato.

QUANDO: traguardo EUR 50/g ($272.061) a p10 9.4a / MEDIANA 11.6a / p90 14.4a;
P(entro 15a) 94%, P(entro 20a) 100%. Rendita mediana: EUR 6.37/g a 3 anni, EUR 11.57/g a
5, EUR 35.18/g a 10, EUR 87.63/g a 15.

VALIDAZIONE INCROCIATA: la variante "solo EUR 500/mese da $600" da' 12.4 anni = esattamente
il numero pubblicato il 25/07 con macchineria diversa.

IL LUMP VALE 0.8 ANNI (12.4 -> 11.6), MENO di quanto suggerisse il "fattore 6" del
calendario, e la ragione e' aritmetica: EUR 5.000 sono ~10 mesi di versamenti a EUR 500,
quindi comprano ~10 mesi. Anticipare vale in proporzione a quanto si anticipa. La mia
aspettativa era piu' alta ed e' corretta.

SOGLIE: $3k e $5k superate il giorno 1 (GTAA01 e XSR01 diventano eseguibili); $13k a ~0.9
anni (GTAA01 entra nel book deployable); $20k a ~1.6 anni = LA DECISIONE VENUE DEL 26/07
SMETTE DI ESSERE UN'IPOTESI E DIVENTA UNA DATA (~19 mesi); $117k a ~7.6 anni (XS01).
Le soglie superate subito NON autorizzano ad anticipare il gate XSR01 del 23/10.

CON IL RISCHIO DI VENUE: P(traguardo) 100% -> 88% a p=1% (P(perso tutto) 23.2%); a p=5% il
capitale mediano e' ZERO. Il piano regge fino a p=2%.

⚠️ AZIONE OPERATIVA TROVATA (non eseguita, e' config su soldi veri): `book._cap` ripiega su
max_notional_per_asset_usd=$300 quando l'equity reale non e' leggibile. A $597 il fallback
era INERTE (equity/2 = $298 ~ $300); dopo il versamento equity/2 vale ~$3.023, quindi un
fallback strozzerebbe il book al ~10% del target, in silenzio. E' l'azione gia'
pre-registrata il 2026-07-02 ("al deposito alzare il cap a equity/2"). Cablato
test_il_cap_fisso_diventa_una_strozzatura_dopo_un_deposito, che FALLISCE se si deposita
senza adeguare il cap.

Aggiunta anche la sezione (F) frontiera di sostenibilita' a r0726_deposits.py: capitale e
rendita per (importo x anni sostenuti), e il confronto "tirare poco tempo vs comodo a
lungo" — EUR 400/m per 5a batte EUR 200/m per 20a, ma EUR 600/m per 3a perde contro
EUR 250/m per 15a.

Book, pesi, cron, config INVARIATI. 380 test verdi (+3).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-07-26 20:34:00 +00:00
parent d1cf44f874
commit 1227b2baab
4 changed files with 382 additions and 0 deletions
+43
View File
@@ -250,6 +250,49 @@ def main() -> None:
print(" resta strozzato (vedi la guardia in `_cap`: col cap dinamico attivo, cap =")
print(" equity/2 = esattamente il nozionale massimo che il book puo' chiedere).")
# ------------------------------------------------------------ (F) frontiera di sostenibilita'
# "Quanto posso versare?" non ha una risposta da modello: dipende dal bilancio di chi versa.
# Ma la domanda DIETRO ("conviene tirare?") si': si misura come iso-risultato fra un importo
# alto tenuto poco e uno basso tenuto a lungo.
print("\n" + "=" * 100)
print(" (F) FRONTIERA DI SOSTENIBILITA' — conviene tirare, o restare comodi piu' a lungo?")
print("=" * 100)
print("\n Capitale mediano a 20 anni per (importo mensile × anni per cui riesci a tenerlo):")
amounts = (100, 150, 200, 250, 400, 600)
spans = (3, 5, 10, 15, 20)
print(f"\n {'€/mese':>8}" + "".join(f"{s:>12}a" for s in spans))
grid = {}
for eur in amounts:
cells = []
for sp in spans:
sch = monthly_schedule(n_days, float(eur), stop_year=sp)
cap, _ = simulate(paths, sch)
grid[(eur, sp)] = float(np.median(cap))
cells.append(f"${grid[(eur, sp)]:>11,.0f}")
print(f" {eur:>8}" + "".join(cells))
print("\n Rendita netta mediana corrispondente (€/giorno a 20 anni):")
print(f"\n {'€/mese':>8}" + "".join(f"{s:>12}a" for s in spans))
for eur in amounts:
cells = [f"{rent_from_capital(np.array([grid[(eur, sp)]]), perp)[0]:>11.2f}"
for sp in spans]
print(f" {eur:>8}" + "".join(cells))
# il confronto che risponde alla domanda: tirare poco tempo vs comodo a lungo
print("\n IL CONFRONTO CHE DECIDE — stessa fatica percepita, esiti opposti:")
for hi, hi_yrs, lo, lo_yrs in ((400, 5, 200, 20), (600, 3, 250, 15), (400, 10, 250, 20)):
a, b = grid[(hi, hi_yrs)], grid[(lo, lo_yrs)]
tot_a = monthly_schedule(n_days, float(hi), stop_year=hi_yrs).sum()
tot_b = monthly_schedule(n_days, float(lo), stop_year=lo_yrs).sum()
win = "il PRIMO" if a > b else "il SECONDO"
print(f"{hi}/m per {hi_yrs:>2}a (${tot_a:>7,.0f} versati) -> ${a:>9,.0f} vs "
f"{lo}/m per {lo_yrs:>2}a (${tot_b:>7,.0f}) -> ${b:>9,.0f} vince {win}")
print("\n REGOLA CHE NE ESCE: l'importo massimo NON e' l'obiettivo. L'obiettivo e' il")
print(" massimo importo che sopravvive a un anno brutto — perche' l'unico modo di")
print(" perdere davvero e' smettere presto (§A: i primi 5 anni sono il 58% del")
print(" risultato), e si smette presto quando si e' versato piu' del sostenibile.")
if __name__ == "__main__":
main()