백테스트로 수익률과 리스크 확인하는 법 — 데이터 구간·비용·워크포워드까지
첫 백테스트에서 저는 승률 62%, 연 28% 수익률을 만들었습니다.
입꼬리가 슬쩍 올라갔죠. 하지만 실거래 한 달, 결과는 딴판이었습니다. 그때 깨달았습니다. 문제는 전략이 아니라 검증 방식이었다는 것을요. 그 뒤로 저는 ‘멋진 곡선’이 아니라 의사결정에 도움 되는 숫자만 남기는 백테스트로 바꿨습니다. 오늘 그 방법을 공유합니다.
백테스트의 목표와 흔한 오해
- 목표: (1) 전략의 기대값이 플러스인지, (2) MDD가 감내 범위 안인지, (3) 실행 가능한 리듬(거래 빈도·회전율)인지 확인.
- 오해 1 — 승률 집착: 승률이 낮아도 손익비가 높으면 기대값이 좋을 수 있습니다.
- 오해 2 — 파라미터 놀이: 수십 번의 튜닝은 과최적화로 곧장 연결됩니다.
- 오해 3 — 비용 무시: 수수료·슬리피지·체결 제약을 빼면 ‘그림의 떡’입니다.
데이터 구간 설계 — In/Out 분리와 캘린더
좋은 백테스트는 구간 설계가 절반입니다. 저는 아래 순서를 고정합니다.
- In-Sample로 전략을 설계(예: 2016–2021).
- Out-of-Sample로 성능을 확인(예: 2022–2023).
- 워크포워드: 2년 학습 → 1년 테스트를 롤링으로 반복(여러 구간에서 일관성 확인).
캘린더·정합성 체크
- 휴장·조기폐장·서머타임 반영(거래 캘린더 테이블 고정).
- 상장폐지/분할/배당 조정가격(Adjusted) 사용.
- 생존편향 제거(퇴출 종목 포함 데이터셋).
- 지표는 모두 과거 시점으로 계산(미래 정보 누출 금지).
비용·체결 제약을 현실적으로 반영
- 수수료: 매수·매도 각각 bps로 반영(시장·브로커 요율 기준).
- 슬리피지: 고정 bps 또는 ATR·유동성 기반 가변 모델.
- 체결 제약: 상·하한가, 일중 변동폭, 거래대금 하위 종목 필터.
- 리밸런싱 주기: 요일·시간 고정(예: 화·금 21:00)으로만 계산.
예시 슬리피지: 종목별 20일 ATR의 5%를 미끄러짐으로 가정 예시 수수료: 매수 5bps + 매도 5bps (총 10bps)
핵심 지표 읽기 — 기대값과 MDD가 중심
기대값 E = (승률 × 평균이익R) − (패율 × 평균손실R) 예) 승률 42%, 평균이익 2.4R, 평균손실 1R → E = (0.42×2.4) − (0.58×1) = +0.452R
- MDD(Max Drawdown): 최대 낙폭과 회복기간을 함께 봅니다.
- CAGR·변동성·샤프: 과거 환경에 과적합되지 않았는지 교차 확인.
- Turnover(회전율): 실행 비용과 시간·집중력 자원을 고려.
- 보유기간: 전략이 요구하는 ‘기다림’이 내 성향에 맞는지 확인.
포인트: 지표가 많을수록 좋지 않습니다. E, MDD, 보유기간, 회전율만으로도 의사결정이 가능합니다.
워크포워드(롤링 검증) — 여러 시대를 통과시키기
한 시기에만 통하면 위험합니다. 저는 2년 학습 → 1년 테스트를 3~5번 굴려 일관성을 확인합니다.
Step 1) 2016–2017 학습 → 2018 테스트 Step 2) 2017–2018 학습 → 2019 테스트 Step 3) 2018–2019 학습 → 2020 테스트 (…반복) 평가: 각 테스트 구간의 E·MDD가 허용 범위 내인지?
모든 구간에서 압도적일 필요는 없습니다. 치명적 붕괴가 없는지가 핵심입니다.
간단 템플릿 — 1페이지 세팅
[데이터] 기간: 2016–2023 / 주기: 일 / 캘린더: KRX [전략] 20일 고가 돌파 + 거래대금 상위 30% [사이징] 1R=계좌 1%, 섹터 합산 2R, 동시 보유 6종 [비용] 수수료 10bps 왕복, 슬리피지 ATR 5% [리밸런싱] 화·금 21:00 [지표] E, MDD, 보유기간, Turnover, 샤프 [검증] 2년 학습→1년 테스트 롤링 4회 [합격선] E>0.2R/거래 & MDD<-12% 이내 & Turnover<월 120%
체크리스트 12 — 함정 회피
- In/Out 구간을 물리적으로 분리했는가?
- 파라미터 개수가 늘면 테스트 구간을 2배로 늘렸는가?
- 생존편향 제거(상폐 포함)와 조정가격 사용이 명확한가?
- 수수료·슬리피지를 보수적으로 잡았는가?
- 상·하한가/체결 제한을 반영했는가?
- 리밸런싱은 요일·시간 고정으로만 계산했는가?
- 한 종목·한 섹터 노출 한도를 문서화했는가?
- 오류/예외(미체결·데이터 결측) 처리 규칙이 있는가?
- 보고서는 1페이지로 요약했는가?
- 워크포워드를 3회 이상 롤링했는가?
- 실거래 전 모의→소액→확대로 단계 운영할 계획인가?
- 전략의 중단 기준(월 -3R, MDD -12% 등)이 있는가?
결과 해석 — ‘실행 가능한 결론’으로
테스트는 보고서를 위한 게 아닙니다. 다음 달의 행동을 바꾸기 위한 도구죠. 합격이면 소액으로 시작하고, 불합격이면 가설을 줄이고 다시 검증하세요. 저는 “규칙 추가”보다 “불필요 규칙 삭제”가 성과를 더 자주 개선했습니다.
결론: 백테스트는 ‘예쁜 곡선 만들기’가 아니라 실행 가능한 확률게임 설계입니다. 오늘은 데이터 구간을 나누고, 비용·제약을 보수적으로 반영한 뒤, E와 MDD만으로 합격/불합격을 나눠 보세요. 실전에서 흔들림이 줄어듭니다.
※ 본 글은 교육용 정보이며, 특정 상품·서비스를 권유하지 않습니다.
다음 글 예고
다음 글에서는 자동 리밸런싱과 포트폴리오 관리를 다룹니다. 요일·시간 고정 리밸런싱, 섹터/상관 노출 한도, 대시보드·리포트 자동화까지 실전 루틴을 공개합니다.
수익은 종목 선택에서 시작하지만, 지켜지는 운영에서 완성됩니다. 다음 글은 자동 리밸런싱과 노출 관리로 계좌의 롤러코스터를 줄이는 방법을 다룹니다.
다음 글에서 다룰 것
- 일정 기반: 요일·시간 고정 리밸런싱(예: 화·금 21:00)
- 노출 한도: 종목 1R, 섹터 합산 2R, 상관 노출 관리
- 재배분 로직: 손절/익절 후 남은 현금의 분배 원칙
- 대시보드: 노출·MDD·규칙 이탈 경보
- 리포트: 주간/월간 포트폴리오 스냅샷 자동 생성
미리보기: 5줄 리밸런싱 규칙
1) 화·금 21:00에만 실행 2) 종목 1R, 섹터 2R 초과 금지 3) +3R 절반익절, -1.5R 전량 손절 4) 승자 유지, 패자 교체(우주·시그널 재검색) 5) 규칙 변경은 비시장시간에만
구독을 눌러 알림을 받아보세요.