# -*- coding: utf-8 -*-
"""
2강 · 4단계 — 손절 폭을 1%~20%까지 한꺼번에 돌려 보기 (과적합 확인)
for 반복문: 사람이 20번 고쳐 돌릴 일을 컴퓨터가 한 번에 한다.
step3_stop_rule.py 의 함수를 그대로 빌려 쓴다(같은 폴더에 있어야 함).
"""
import importlib.util, io, contextlib
from pathlib import Path

# step3 파일을 불러오되, 그 파일이 찍는 글자는 숨긴다
spec = importlib.util.spec_from_file_location("s3", Path(__file__).parent / "step3_stop_rule.py")
s3 = importlib.util.module_from_spec(spec)
with contextlib.redirect_stdout(io.StringIO()):
    spec.loader.exec_module(s3)

train = s3.period(s3.rows, "2023-01-01", "2024-12-31")
test  = s3.period(s3.rows, "2025-01-01", "2026-09-30")
FEE = 0.00055   # 수수료는 원래 값으로 고정 (한 번에 하나만 바꾼다)

print("손절폭   학습구간(연습)   검증구간(처음 보는 차트)")
res = []
for k in range(1, 21):                       # 1%, 2%, ... 20%
    tr, _ = s3.stop_rule(train, fee=FEE, stop=k / 100)
    te, _ = s3.stop_rule(test,  fee=FEE, stop=k / 100)
    res.append((k, tr, te))
    print(f"  {k:2d}%      {tr:+8.1%}          {te:+8.1%}")

bt = max(res, key=lambda x: x[1])            # 학습구간에서 제일 좋았던 손절폭
bv = max(res, key=lambda x: x[2])            # 검증구간에서 제일 좋았던 손절폭(나중에 알게 되는 정답)
print()
print(f"학습구간 1등: {bt[0]}% → 학습 {bt[1]:+.1%}, 그런데 검증에서는 {bt[2]:+.1%}")
print(f"검증구간 1등: {bv[0]}% → 검증 {bv[2]:+.1%} (하지만 이건 시험을 본 뒤에야 아는 답)")
hold = test[-1][1] / test[0][1] - 1
print(f"검증구간 들고만 있기: {hold:+.1%}")
print()
print("교훈: 연습 문제에서 1등인 규칙이 실전에서도 1등이라는 보장은 없다 → '과적합'")
