# -*- coding: utf-8 -*-
"""곱버스 반만 — 코스피 하락에 1,000만원을 걸 때
  인버스 다   = KODEX 인버스(114800) 1,000만원
  곱버스 반   = KODEX 200선물인버스2X(252670) 500만원 + KODEX 단기채권(153130) 500만원
처음에 사서 끝에 판다(중간 조정 없음). 실제 종가(야후, 분배금 미반영) · 기준일 ASOF 고정.
두 방법 모두 한 번 사고 한 번 팔아 매매 수수료는 같다고 보고 넣지 않았다.
세금(국내 ETF 매매차익 15.4%, 종목마다)도 넣지 않았다 — 곱버스가 잃고 단기채만 번 해엔 곱버스 반 쪽에 조금 불리한 몫이 빠져 있다.
표준 라이브러리만 쓴다:  python run_gopbus.py
"""
import csv, os, sys
sys.stdout.reconfigure(encoding="utf-8")
ASOF = "2026-11-02"
HERE = os.path.dirname(os.path.abspath(__file__))

def load(name):
    with open(os.path.join(HERE, "data", name + ".csv"), encoding="utf-8") as f:
        return {r["date"]: float(r["close"]) for r in csv.DictReader(f) if r["date"] <= ASOF and float(r["close"]) > 0}

IX, I1, I2, C = (load(n) for n in ("KODEX200", "KODEX_INVERSE", "KODEX_INVERSE2X", "KODEX_SHORTBOND"))
D = sorted(set(IX) & set(I1) & set(I2) & set(C))
P = 1000.0  # 만원

def at(i0, i1):
    a, b = D[i0], D[i1]
    inv = P * I1[b] / I1[a]
    gop = P / 2 * I2[b] / I2[a]
    bond = P / 2 * C[b] / C[a]
    return {"산날": a, "판날": b, "코스피200": (IX[b] / IX[a] - 1) * 100, "인버스다": inv, "곱버스": gop, "단기채": bond, "곱버스반": gop + bond}

def seg(t0, t1):
    i0 = next(i for i, d in enumerate(D) if d >= t0)
    i1 = max(i for i, d in enumerate(D) if d <= t1)
    return at(i0, i1)

def m(x):
    return f"{x:,.0f}만원"

print(f"자료: {D[0]} ~ {D[-1]} · 거래일 {len(D):,}일 · 1,000만원\n")
print("■ 2025년 한 해 (코스피 하락에 건 두 사람 — 틀린 해)")
r = seg("2025-01-01", "2025-12-31")
print(f"  {r['산날']} → {r['판날']} · 코스피200(KODEX 200) {r['코스피200']:+.1f}%")
print(f"  인버스 다 {m(r['인버스다'])} · 곱버스 반 {m(r['곱버스반'])} (곱버스 {m(r['곱버스'])} + 단기채 {m(r['단기채'])})")
print(f"  곱버스 반이 덜 잃은 돈 {m(r['곱버스반'] - r['인버스다'])}\n")

print("■ 해마다 (1월 첫 거래일에 사서 12월 마지막 거래일에 판다)")
down = []
for y in range(2017, 2026):
    r = seg(f"{y}-01-01", f"{y}-12-31")
    d = r["곱버스반"] - r["인버스다"]
    if r["코스피200"] < 0:
        down.append(d)
    print(f"  {y}  코스피200 {r['코스피200']:+6.1f}%  인버스 다 {r['인버스다']:7,.0f}  곱버스 반 {r['곱버스반']:7,.0f}  차이(곱버스 반 − 인버스 다) {d:+6,.0f}만원")
print(f"  코스피가 내린 해 {len(down)}번 · 차이 " + " · ".join(f"{x:+.0f}" for x in down) + f"만원 · 가장 큰 차이 {max(abs(x) for x in down):.0f}만원"
      + f" · 곱버스 반이 더 많았던 해 {sum(x > 0 for x in down)}번\n")

print("■ 올해 5월부터 (코스피가 내렸는데 크게 오르내린 구간)")
r = seg("2026-05-01", ASOF)
print(f"  {r['산날']} → {r['판날']} · 코스피200 {r['코스피200']:+.1f}% · 인버스 다 {m(r['인버스다'])} · 곱버스 반 {m(r['곱버스반'])} · 차이 {m(r['곱버스반'] - r['인버스다'])}\n")

print("■ 올해 1월부터")
r = seg("2026-01-01", ASOF)
print(f"  {r['산날']} → {r['판날']} · 코스피200 {r['코스피200']:+.1f}% · 인버스 다 {m(r['인버스다'])} · 곱버스 반 {m(r['곱버스반'])}\n")

for H, name in ((250, "1년"), (120, "반년")):
    rs = [at(i, i + H) for i in range(len(D) - H)]
    A = [x["인버스다"] for x in rs]; B = [x["곱버스반"] for x in rs]
    dn = [x["곱버스반"] - x["인버스다"] for x in rs if x["코스피200"] < 0]
    up = [x["곱버스반"] - x["인버스다"] for x in rs if x["코스피200"] > 0]
    def q(v, p):
        v = sorted(v); k = (len(v) - 1) * p; f = int(k); c = min(f + 1, len(v) - 1)
        return v[f] + (v[c] - v[f]) * (k - f)
    print(f"■ 모든 거래일에 시작한 {name}({H}거래일) {len(rs):,}번")
    print(f"  가장 나빴을 때: 인버스 다 {m(min(A))} · 곱버스 반 {m(min(B))}")
    print(f"  500만원 아래로 줄어든 경우: 인버스 다 {sum(a < 500 for a in A) / len(A) * 100:.1f}% · 곱버스 반 {sum(b < 500 for b in B) / len(B) * 100:.1f}%")
    print(f"  곱버스 반이 더 남은 경우 {sum(b > a for a, b in zip(A, B)) / len(A) * 100:.1f}%")
    print(f"  코스피가 내린 {len(dn):,}번: 차이 10%/50%/90% 지점 {q(dn, .1):+.0f} / {q(dn, .5):+.0f} / {q(dn, .9):+.0f}만원")
    print(f"  코스피가 오른 {len(up):,}번: 차이 10%/50%/90% 지점 {q(up, .1):+.0f} / {q(up, .5):+.0f} / {q(up, .9):+.0f}만원\n")
print("끝.")
