백테스트 전문가
전문적인 방법론을 기반으로 한 체계적인 트레이딩 전략 백테스트 접근법으로, 낙관적 결과보다 견고성을 우선시합니다.
핵심 철학
목표: '가장 적게 망가지는' 전략을 찾는 것이지, 이론상 '가장 많이 수익을 내는' 전략을 찾는 것이 아닙니다.
원칙: 마찰을 추가하고, 가정에 스트레스 테스트를 수행하며, 무엇이 살아남는지 관찰하세요. 비관적인 조건에서도 견고한 전략은 실전 트레이딩에서 성공할 가능성이 더 높습니다.
이 스킬을 사용해야 할 때
다음과 같은 상황에서 이 스킬을 사용하세요:
- 체계적인 트레이딩 전략을 개발하거나 검증할 때
- 트레이딩 아이디어가 실전에 적용하기에 충분히 견고한지 평가할 때
- 백테스트 결과가 왜 오해의 소지가 있을 수 있는지 문제를 진단할 때
- 올바른 백테스트 방법론을 학습할 때
- 일반적인 함정(커브 피팅, 선견지명 편향, 생존자 편향)을 피할 때
- 매개변수 민감도와 시장 국면 의존성을 평가할 때
- 슬리피지 및 실행 비용에 대한 현실적인 기대치를 설정할 때
전제 조건
- Python 3.9+ (평가 스크립트 실행용)
- API 키 불필요
- 외부 데이터 의존성 없음 — 지표는 사용자가 제공
워크플로우
1. 가설 명시
한 문장으로 엣지를 정의하세요.
예시: "실적 발표 후 3% 이상 갭 상승한 주식이 첫 1시간 내에 전일 종가로 되돌아오면 평균 회귀 기회를 제공한다."
엣지를 명확하게 설명할 수 없다면 테스트를 진행하지 마세요.
2. 재량 없이 규칙 체계화
완전히 구체적으로 정의하세요:
- 진입: 정확한 조건, 타이밍, 가격 유형
- 청산: 손절매, 목표 이익, 시간 기반 청산
- 포지션 크기: 고정 금액, 포트폴리오 대비 %, 변동성 조정
- 필터: 시가총액, 거래량, 섹터, 변동성 조건
- 유니버스: 어떤 상품이 적격인지
중요: 주관적인 판단은 허용되지 않습니다. 모든 결정은 규칙 기반이며 모호함이 없어야 합니다.
3. 초기 백테스트 실행
다음 조건에서 테스트하세요:
- 최소 5년 (가급적 10년 이상)
- 다양한 시장 국면 (강세장, 약세장, 고/저 변동성)
- 현실적인 비용: 수수료 + 보수적인 슬리피지
기본적인 생존 가능성을 위해 초기 결과를 검토하세요. 근본적으로 결함이 있다면 가설을 반복 수정하세요.
4. 전략 스트레스 테스트
테스트 시간의 80%를 여기에 할애해야 합니다.
매개변수 민감도:
- 손절매를 기준 대비 50%, 75%, 100%, 125%, 150%로 테스트
- 목표 이익을 기준 대비 80%, 90%, 100%, 110%, 120%로 테스트
- 진입/청산 타이밍을 ±15~30분 변경
- 좁은 스파이크가 아닌 안정적인 성과의 '고원'을 찾으세요
실행 마찰:
- 슬리피지를 일반 추정치의 1.5~2배로 증가
- 최악의 체결 상황 모델링 (매수 시 매도호가+1틱, 매도 시 매수호가-1틱)
- 현실적인 주문 거부 시나리오 추가
- 비관적인 수수료 구조로 테스트
시간적 견고성:
- 연도별 성과 분석
- 대부분의 연도에서 양의 기대 수익 요구
- 전략이 1~2개의 예외적인 기간에 의존하지 않는지 확인
- 서로 다른 시장 국면에서 별도로 테스트
표본 크기:
- 절대 최소: 30건의 거래
- 권장: 100건 이상의 거래
- 높은 신뢰도: 200건 이상의 거래
5. 표본 외 검증
워크 포워드 분석:
- 훈련 기간(예: 1~3년) 동안 최적화
- 검증 기간(4년차)에서 테스트
- 앞으로 이동하며 반복
- 표본 내 vs 표본 외 성과 비교
경고 신호:
- 표본 외 성과가 표본 내 성과의 50% 미만
- 빈번한 매개변수 재최적화 필요
- 기간 간 매개변수가 급격히 변화
6. 결과 평가
답변할 질문:
- 비관적인 가정에서도 엣지가 유지되는가?
- 매개변수 변화에 따라 성과가 안정적인가?
- 전략이 여러 시장 국면에서 작동하는가?
- 표본 크기가 통계적 신뢰도에 충분한가?
- 결과가 현실적이며 '너무 좋아서 믿기 어렵지' 않은가?
결정 기준:
- ✅ 배포: 모든 스트레스 테스트를 허용 가능한 성과로 통과
- 🔄 개선: 핵심 로직은 타당하지만 매개변수 조정 필요
- ❌ 폐기: 스트레스 테스트 실패 또는 취약한 가정에 의존
체계적이고 정량적인 평가를 위해 평가 스크립트를 사용하세요:
python3 skills/backtest-expert/scripts/evaluate_backtest.py \
--total-trades 150 \
--win-rate 62 \
--avg-win-pct 1.8 \
--avg-loss-pct 1.2 \
--max-drawdown-pct 15 \
--years-tested 8 \
--num-parameters 3 \
--slippage-tested \
--output-dir reports/
이 스크립트는 5가지 차원(표본 크기, 기대 수익, 리스크 관리, 견고성, 실행 현실성)에서 점수를 산출하고, 위험 신호를 감지하며, 배포/개선/폐기 평결을 출력합니다.
핵심 테스트 원칙
전략에 불이익 주기
모든 곳에 마찰을 추가하세요:
- 수수료를 실제보다 높게 설정
- 슬리피지를 일반 추정치의 1.5~2배로 설정
- 최악의 체결 상황 가정
- 주문 거부
- 부분 체결
근거: 비관적인 가정에서도 살아남는 전략은 실전 트레이딩에서 종종 더 나은 성과를 냅니다.
피크보다 고원 찾기
성과 스파이크를 만드는 최적값이 아닌, 성과가 안정적인 매개변수 범위를 찾으세요.
좋은 예: 손절매가 1.5%에서 3.0% 사이 어디든 수익성 있는 전략 나쁜 예: 손절매가 정확히 2.13%일 때만 작동하는 전략
안정적인 성과는 진정한 엣지를 나타내며, 좁은 최적값은 커브 피팅을 시사합니다.
모든 사례 테스트, 선별된 예시는 금물
잘못된 접근법: 성공한 '시장 리더'만을 선별적으로 연구 올바른 접근법: 기준을 충족한 모든 종목(실패한 종목 포함)을 테스트
선별적인 예시는 생존자 편향을 만들고 전략 품질을 과대평가합니다.
아이디어 생성과 검증 분리
직관: 가설 생성에 유용 검증: 순수하게 데이터 기반이어야 함
아이디어에 대한 집착이 테스트 결과 해석에 영향을 미치지 않도록 하세요.
일반적인 실패 패턴
시간을 절약하기 위해 이러한 패턴을 조기에 인식하세요:
- 매개변수 민감도: 정확한 매개변수 값에서만 작동
- 국면 의존성: 어떤 해에는 훌륭하고 다른 해에는 끔찍함
- 슬리피지 민감도: 현실적인 비용을 추가했을 때 수익성이 없어짐
- 작은 표본: 통계적 신뢰도를 위한 거래 수 부족
- 선견지명 편향: '너무 좋아서 믿기 어려운' 결과
- 과최적화: 많은 매개변수, 표본 외 성과 불량
자세한 예시와 진단 프레임워크는 references/failed_tests.md를 참조하세요.
출력
reports/backtest_eval_<timestamp>.json— 차원별 점수, 위험 신호, 평결이 포함된 구조화된 평가reports/backtest_eval_<timestamp>.md— 차원 테이블, 주요 지표, 위험 신호 세부 정보가 포함된 사람이 읽을 수 있는 보고서
리소스
방법론 참조
파일: references/methodology.md
언제 읽어야 할까: 특정 테스트 기법에 대한 자세한 지침이 필요할 때.
내용:
- 스트레스 테스트 방법
- 매개변수 민감도 분석
- 슬리피지 및 마찰 모델링
- 표본 크기 요구 사항
- 시장 국면 분류
- 일반적인 편향 및 함정(생존자 편향, 선견지명 편향, 커브 피팅 등)
실패한 테스트 참조
파일: references/failed_tests.md
언제 읽어야 할까: 전략이 테스트에 실패했을 때 또는 과거 실수로부터 배울 때.
내용:
- 실패가 왜 가치 있는가
- 예시를 포함한 일반적인 실패 패턴
- 사례 연구 문서화 프레임워크
- 백테스트 평가를 위한 위험 신호 체크리스트
중요한 알림
시간 분배: 아이디어 생성에 20%, 이를 깨뜨리려는 시도에 80%를 할애하세요.
맥락 무관 요구 사항: 전략이 '완벽한 맥락'을 요구한다면 체계적인 트레이딩에 충분히 견고하지 않은 것입니다.
위험 신호: 백테스트 결과가 너무 좋아 보인다면(>90% 승률, 최소 드로우다운, 완벽한 타이밍) 선견지명 편향이나 데이터 문제가 있는지 주의 깊게 감사하세요.
도구 한계: 자신의 백테스팅 플랫폼의 한계를 이해하세요.