# -*- coding: utf-8 -*-
"""
2강 · 4단계 — 과적합 직접 만들기: 학습구간에서 '가장 좋은 손절폭'을 고르고, 검증구간에서 채점
(기사: 학습 차트 1484% → 처음 보는 차트 -32.7%)
"""
import csv
from pathlib import Path
rows = []
with open(Path(__file__).parent / "data" / "BTC_USD_daily.csv", encoding="utf-8") as f:
    for r in csv.DictReader(f):
        if r["timestamp"]:
            rows.append((r["timestamp"], float(r["close"])))
rows.sort(key=lambda x: x[0])
def period(rows, a, b): return [x for x in rows if a <= x[0] <= b]
def stop_rule(p, stop, fee=0.00055):
    money = 1.0; holding = False; peak = last = 0
    for i, (d, price) in enumerate(p):
        if holding:
            money *= price / last; last = price; peak = max(peak, price)
            if price <= peak * (1 - stop): money *= (1 - fee); holding = False
        elif i < len(p) - 1:
            money *= (1 - fee); holding = True; peak = last = price
    return money - 1

train = period(rows, "2023-01-01", "2024-12-31")
test  = period(rows, "2025-01-01", "2026-09-30")
# ① 학습구간에서 1%~30% 손절폭을 모두 시험
results = []
for k in range(1, 31):
    results.append((k / 100, stop_rule(train, k / 100)))
best = max(results, key=lambda x: x[1])
print(f"학습구간 최고 손절폭: {best[0]:.0%} → 학습 수익 {best[1]:+.1%}")
# ② 그 손절폭으로 검증구간 채점
print(f"검증구간 성적: {stop_rule(test, best[0]):+.1%}  / 보유 {test[-1][1]/test[0][1]-1:+.1%}")

# ── 해 보기 ──
# ① 검증구간에서 '사후에' 가장 좋은 손절폭을 찾아보세요. 학습구간 최고와 같나요?
# ② 이것이 왜 '1484% 수익'을 믿으면 안 되는 이유인지 한 줄로 써 보세요.
