diff --git a/CLAUDE.md b/CLAUDE.md index d32a2ac..5d7df06 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -472,9 +472,22 @@ Prima ondata di ricerca onesta su BTC/ETH certificati (5 track, harness condivis restano refutati, come BIGLIETTO (prop) no. Rendita a $600: €0.12/g → **€0.18/g** (centesimi: il fattore conta per il MURO e le soglie prop, non per il conto attuale). Cio' che NON dipende dalla lente: **la rendita perpetua vale ~45-55% del CAGR**, quindi ogni muro - calcolato come `target/CAGR` sbaglia di un fattore ~2. Traiettoria (bootstrap, - de-luck): **0 depositi → 0% dei path in 20 anni**; €500/m mediana 19.6a; €1000/m mediana 14.8a - (⚠️ calcolata a ×0.6: col fattore corretto i tempi si accorciano, non ricalcolata). + calcolato come `target/CAGR` sbaglia di un fattore ~2. + **TRAIETTORIA da $600, ricalcolata col fattore corretto (26/07).** Il fattore agisce **due + volte**: alza il drift (si accumula prima) E abbassa il bersaglio (serve meno capitale), e i due + effetti pesano quasi uguale. Mediana degli anni per toccare il capitale-rendita: + | dep./mese | ×0.60 muro $495k (25/07) | ×0.89 muro $495k (solo drift) | ×0.89 muro $272k (26/07) | + |---|---|---|---| + | €0 | mai | mai | **mai** | + | €250 | 22.4a (8% entro 20a) | 19.6a (53%) | **16.2a (91%)** | + | €500 | 19.6a (48%) | 15.7a (94%) | **12.4a (100%)** | + | €1000 | 14.8a (95%) | 12.0a (100%) | **9.0a (100%)** | + | €2000 | 10.0a (100%) | 8.5a (100%) | **6.0a (100%)** | + ✅ La colonna ×0.60 **riproduce esattamente** i numeri del 25/07 (19.6a / 14.8a) = validazione + indipendente della replica. ⚠️ **Cio' che NON cambia col fattore: senza depositi il + capitale-rendita non si raggiunge mai** (0% dei path a 20 anni a OGNI fattore) — l'accumulo + viene dai versamenti, non dal rendimento; e la mediana e' una MEDIANA (meta' dei path arriva + dopo, una quota non arriva affatto). (3) **Diversificare NON crea reddito a pari nozionale — libera BUDGET DI RISCHIO.** Per tier: iso-nozionale 2 sleeve 5.98% → 4 sleeve 6.35% (nulla, il diversificatore a basso CAGR toglie vol e ritorno insieme); a **ISO-RISCHIO** (vol 15%) 7.51%/$395k → **9.25%/$321k (−19% di muro)**. diff --git a/docs/diary/2026-07-26-skh-live-book-deluck.md b/docs/diary/2026-07-26-skh-live-book-deluck.md index 4a94b6b..7b0b500 100644 --- a/docs/diary/2026-07-26-skh-live-book-deluck.md +++ b/docs/diary/2026-07-26-skh-live-book-deluck.md @@ -173,6 +173,32 @@ Cambia la taglia dell'errore, e cambia che il numero e' misurato invece che scel Rendita sul conto attuale: EUR 0.12/g (×0.6) → **EUR 0.18/g** (×0.89). A questa taglia sono centesimi: **il fattore conta per il MURO e per le soglie prop, non per il conto di oggi.** +### La traiettoria — il fattore agisce DUE volte + +Correggere il fattore alza il drift (si accumula prima) **e** abbassa il bersaglio (serve meno +capitale). I due effetti pesano quasi uguale, quindi vanno separati invece che sommati alla cieca: + +``` +dep./mese ×0.60 muro $495k ×0.89 muro $495k ×0.89 muro $272k + (25/07) (solo drift) (26/07) + €0 mai mai mai + €250 22.4a (8% <20a) 19.6a (53%) 16.2a (91%) + €500 19.6a (48%) 15.7a (94%) 12.4a (100%) + €1000 14.8a (95%) 12.0a (100%) 9.0a (100%) + €2000 10.0a (100%) 8.5a (100%) 6.0a (100%) +``` + +✅ **Validazione indipendente:** la colonna ×0.60 riproduce **esattamente** i numeri pubblicati il +25/07 (€500/m → 19.6a, €1000/m → 14.8a). La replica e' fedele, quindi le altre due colonne sono +confrontabili con quelle. + +A €500/mese: dei ~7 anni guadagnati, ~4 vengono dal drift e ~3 dal bersaglio piu' basso. + +⚠️ **Cio' che il fattore NON cambia:** senza depositi il capitale-rendita **non si raggiunge mai** +(0% dei path a 20 anni, a ogni fattore). L'accumulo viene dai versamenti, non dal rendimento — +correggere il ×0.6 accorcia i tempi, non crea una via che non c'era. E la mediana e' una mediana: +meta' dei path arriva dopo, e una quota non arriva affatto. + --- ## 5. Regole trasferibili diff --git a/scripts/research/r0726_capwall_refresh.py b/scripts/research/r0726_capwall_refresh.py index 2ed18b6..9f8cc5e 100644 --- a/scripts/research/r0726_capwall_refresh.py +++ b/scripts/research/r0726_capwall_refresh.py @@ -67,6 +67,33 @@ def perp_and_wall(r: np.ndarray, k: float, gross_needed: float) -> tuple[float, return lo2, perp, cap +def trajectory(r: np.ndarray, cap_needed: float, n_paths: int = 3000, + years: int = 25, seed: int = 725) -> dict: + """Da $600 al capitale-rendita, stocastico (block bootstrap): stessa logica di + r0725_capcurve.part_d, parametrizzata sul fattore e sul bersaglio.""" + rng = np.random.default_rng(seed) + n_days = 365 * years + paths = CC._boot_paths(r, n_paths, n_days, 20, rng) + out = {} + for dep_eur in (0, 250, 500, 1_000, 2_000): + dep = dep_eur * CC.EURUSD + cap = np.full(n_paths, 600.0) + hit = np.full(n_paths, -1, int) + for t in range(n_days): + cap = cap * (1.0 + paths[:, t]) + if t % 30 == 0 and t > 0: + cap += dep + newly = (hit < 0) & (cap >= cap_needed) + hit[newly] = t + yrs = np.where(hit >= 0, hit / 365.0, np.nan) + fin = yrs[~np.isnan(yrs)] + out[dep_eur] = dict( + p50=float(np.percentile(fin, 50)) if len(fin) > 100 else float("nan"), + p10=float(np.percentile(fin, 10)) if len(fin) > 100 else float("nan"), + p20y=float((yrs <= 20).sum() / len(yrs))) + return out + + def main() -> None: print("=" * 100) print(" r0726 — MURI DI CAPITALE col fattore de-luck MISURATO (era ×0.6 a occhio)") @@ -123,6 +150,36 @@ def main() -> None: print("\n (a questa taglia la differenza fra ×0.6 e ×0.89 sono centesimi al giorno:") print(" il fattore conta per il MURO e per le soglie prop, non per il conto attuale.)") + # ---------------------------------------------------------------- traiettoria + print("\n" + "=" * 100) + print(" TRAIETTORIA da $600 al capitale-rendita (block bootstrap, 3000 path, 25 anni)") + print("=" * 100) + print(" Il fattore agisce DUE VOLTE: alza il drift (si accumula piu' in fretta) E abbassa") + print(" il bersaglio (serve meno capitale). Le due colonne centrali separano gli effetti.") + cap_old = res[(0.60, 1.0)][2] + cap_new = res[(0.89, 1.0)][2] + scen = [ + (0.60, cap_old, f"×0.60, muro ${cap_old:,.0f} (25/07)"), + (0.89, cap_old, f"×0.89, muro ${cap_old:,.0f} (solo drift)"), + (0.89, cap_new, f"×0.89, muro ${cap_new:,.0f} (26/07)"), + ] + T = {} + for f, capn, lab in scen: + r = (base - (1.0 - f) * mu).values.astype(float) + T[lab] = trajectory(r, capn) + + for dep in (0, 250, 500, 1_000, 2_000): + print(f"\n deposito {dep:,}/mese") + print(f" {'scenario':<34}{'p10':>8}{'MEDIANA':>10}{'P(entro 20a)':>14}") + for _f, _c, lab in scen: + d = T[lab][dep] + fm = (lambda v: f"{v:.1f}a" if np.isfinite(v) else " —") + print(f" {lab:<34}{fm(d['p10']):>8}{fm(d['p50']):>10}{d['p20y']:>13.0%}") + + print("\n ⚠️ Restano vere le due cose che non dipendono dal fattore: senza depositi il") + print(" capitale-rendita non si raggiunge, e la mediana e' una MEDIANA (meta' dei") + print(" path arriva dopo, e una quota non arriva affatto).") + if __name__ == "__main__": main()