# -*- coding: utf-8 -*-
# ③ 회복기간 재계산(저점 통과 후 회복) + ⑤ 최악의 날 실물 TQQQ 대조 + 수익률 분해
import csv, datetime, math, os
HERE = os.path.dirname(os.path.abspath(__file__))
def load(s):
    o = {}
    with open(os.path.join(HERE, f"lev_{s}_daily.csv"), encoding="utf-8") as f:
        for r in csv.DictReader(f): o[datetime.date.fromisoformat(r["date"])] = float(r["close"])
    return o
QQQ, SPY, TQQQ, IRX = load("qqq"), load("spy"), load("tqqq"), load("irx")
_rf = {}
def rf_on(d):
    if not _rf:
        p = 0.05
        for x in sorted(IRX):
            v = IRX[x]/100.0
            if v == v and v >= 0: p = v
            _rf[x] = p
        _rf["_k"] = sorted(IRX)
    if d in _rf: return _rf[d]
    ks = [x for x in _rf["_k"] if x <= d]
    return _rf[ks[-1]] if ks else 0.05
def rets(px, d0=None, d1=None):
    ds = sorted(d for d in px if (d0 is None or d >= d0) and (d1 is None or d <= d1))
    return [(ds[i], px[ds[i]]/px[ds[i-1]]-1) for i in range(1, len(ds))]
def run(px, lev, er, d0=None, d1=None):
    p, eq = [], 1.0
    for d, r in rets(px, d0, d1):
        c = 0.0 if lev == 1 else (lev-1)*(rf_on(d)+0.005)/252.0 + er/252.0
        eq = max(eq*(1+lev*r-c), 1e-12); p.append((d, eq))
    return p

L = ["③ 닷컴 고점(2000-03-24) 매수 후 — 저점 통과 뒤 원금 회복까지"]
st = datetime.date(2000, 3, 24)
for tag, lev, er in (("QQQ 1배", 1.0, 0.0), ("QQQ 3배", 3.0, 0.0095)):
    p = run(QQQ, lev, er, st)
    ti = min(range(len(p)), key=lambda i: p[i][1])       # 저점 인덱스
    td, tv = p[ti]
    rec = next((d for d, v in p[ti:] if v >= 1.0), None)
    L.append(f"   {tag}: 저점 {td} {tv:.4f}배(원금의 {tv*100:.2f}%)")
    L.append(f"      → " + (f"{rec} 원금 회복, {(rec-st).days/365.25:.1f}년 걸림"
                            if rec else f"2026-07-22까지 미회복 · 현재 {p[-1][1]:.4f}배"))

L += ["", "⑤ 최악의 날 — 시뮬 vs 실물 TQQQ (모델 재검증)"]
td = sorted(TQQQ)
tr = {td[i]: TQQQ[td[i]]/TQQQ[td[i-1]]-1 for i in range(1, len(td))}
qr = dict(rets(QQQ))
for d, x in sorted(tr.items(), key=lambda t: t[1])[:5]:
    q = qr.get(d)
    L.append(f"   {d}  실물 TQQQ {x*100:+7.2f}%  |  QQQ {q*100:+6.2f}% ×3 = {q*3*100:+7.2f}%"
             f"  (오차 {(x-q*3)*100:+.2f}%p)" if q else f"   {d} {x*100:+.2f}%")

L += ["", "⑥ 수익률 분해 — 3배는 어디서 새는가 (QQQ 1999-03~2026-07, 27.4년)"]
rs = [r for _, r in rets(QQQ, min(QQQ))]
m = sum(rs)/len(rs); mu = m*252
var = sum((r-m)**2 for r in rs)/(len(rs)-1)*252
g1, g3 = mu - var/2, 3*mu - 9*var/2
act1 = run(QQQ, 1.0, 0.0, min(QQQ)); act3 = run(QQQ, 3.0, 0.0095, min(QQQ))
yrs = (act1[-1][0]-act1[0][0]).days/365.25
c1 = act1[-1][1]**(1/yrs)-1; c3 = act3[-1][1]**(1/yrs)-1
L.append(f"   (a) 단순 기대 '3배니까 3배'      3 × μ(13.86%) = {3*mu*100:6.2f}%")
L.append(f"   (b) 변동성 감쇠 차감           - 9σ²/2 ({9*var/2*100:.2f}%p)  →  {g3*100:6.2f}%")
L.append(f"   (c) 조달이자+보수 차감          - {(g3-c3)*100:.2f}%p          →  {c3*100:6.2f}%  ← 실제 3배 CAGR")
L.append(f"   비교) 1배 실제 CAGR {c1*100:.2f}%  ·  누적 {act1[-1][1]:.2f}배 vs 3배 {act3[-1][1]:.2f}배")
L.append(f"   → 27.4년 뒤 3배는 1배의 {act3[-1][1]/act1[-1][1]*100:.1f}%")
open(os.path.join(HERE, "out", "lev_detail2.txt"), "w", encoding="utf-8").write("\n".join(L))
print("\n".join(L))
