# -*- coding: utf-8 -*-
# 10년 보유 롤링의 정확한 최악·최고 값 + 분포 (제목 근거 확정용)
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, IRX = load("qqq"), load("spy"), 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 mults(px, lev, er, i0, i1, ds):
    eq3 = eq1 = 1.0
    for i in range(i0+1, i1+1):
        r = px[ds[i]]/px[ds[i-1]] - 1
        eq1 *= (1+r)
        eq3 = max(eq3*(1+lev*r - (lev-1)*(rf_on(ds[i])+0.005)/252.0 - er/252.0), 1e-12)
    return eq1, eq3

L = []
for name, px, er in (("QQQ(나스닥100)", QQQ, 0.0095), ("SPY(S&P500)", SPY, 0.0091)):
    ds = sorted(px); rows = []
    for i in range(0, len(ds)-2520, 21):
        m1, m3 = mults(px, 3.0, er, i, i+2520, ds)
        rows.append((ds[i], ds[i+2520], m1, m3))
    rows3 = sorted(rows, key=lambda t: t[3])
    win = sum(1 for r in rows if r[3] > r[2])
    lose_half = sum(1 for r in rows if r[3] < 1.0)     # 원금 손실
    L.append(f"■ {name} · 10년 보유 {len(rows)}개 구간 (매월 시작)")
    L.append(f"   3배가 1배를 이긴 구간 {win} ({win/len(rows)*100:.1f}%) · "
             f"3배가 원금 손실난 구간 {lose_half} ({lose_half/len(rows)*100:.1f}%)")
    for tag, r in (("최악", rows3[0]), ("2위", rows3[1]), ("중앙", rows3[len(rows3)//2]),
                   ("최고", rows3[-1])):
        L.append(f"   {tag}: {r[0]} 매수 → {r[1]}  |  1배 {r[2]:8.2f}배   3배 {r[3]:10.4f}배")
    L.append("")
open(os.path.join(HERE, "out", "lev_rolling.txt"), "w", encoding="utf-8").write("\n".join(L))
print("\n".join(L))
