백테스트 처음이라면,
수익률보다 먼저 볼 것들
백테스트는 예언이 아니라 검산
상폐 종목·수정주가·거래정지까지 데이터부터 의심
퀀트로 파이어한 분께 얻은 팁과 내가 겪은 사고
백테스트를 처음 돌리면 수익률부터 눈에 들어온다.
나는 6주 동안 백테를 돌리며 내 코드가 틀린 걸 다섯 번 찾았다.
첫 백테 전에 어디부터 의심해야 하는지, 체크리스트는 끝에 정리했다.
백테스트는 예언이 아니라 검산이다
백테스트로 "이 룰이 앞으로도 통한다"를 증명할 수는 없다.
대신 내 코드가 내 룰대로 도는지는 알려준다.
학부 때 동역학과 물리학은 역대 최초 만점자였다.
비결은 검산이었다.
얼른 다 풀고 처음부터 싹 다시 풀다가 실수를 찾아 고친 적도 있다.
그렇게 만점을 맞았다.
백테도 똑같다.
연 30%가 나와도 처음부터 다시 따라가 봐야 한다.
목표는 좋은 숫자가 아니라 믿을 수 있는 숫자다.
아래는 주변에 퀀트 투자로 파이어(경제적 자유를 이루고 일찍 은퇴하는 것)한 분께 얻은 팁을 바탕으로 정리했다.
초보가 어디서 많이 틀리는지 짚어주셨다.
데이터부터 의심한다
증권사 API는 지금 상장된 종목만 준다.
그걸로 돌리면 살아남은 종목만 고르는 셈이다.
이걸 생존편향이라고 한다.
신고가 전략은 특히 심하다.
신고가를 찍다가 무너져 상폐된 종목이 꽤 많기 때문이다.
트레이딩 모임에서 알게 된 퀀트하시는 분께 물어봤더니 답은 딱 한 줄이었다.
"상폐 데이터는 꼭 넣으세요. 넣고 안 넣고랑 결과가 아예 다릅니다."
데이터에서 자주 틀리는 자리는 이렇다.
| 빠뜨리면 생기는 일 | 이렇게 막는다 |
|---|---|
| 상폐 종목 살아남은 종목만 고르게 된다 | 상폐 종목 일봉을 넣고, 보유 중 상폐면 정리매매 첫날 시가에 전량 청산으로 가정 |
| 수정주가 5:1 분할이 80% 폭락으로 보여 스톱이 터진다 | 액면분할·감자·배당을 반영한 수정주가를 쓴다 |
| 거래대금 기준 수정주가에 원래 거래량을 곱하면 숫자가 틀어진다 | 가격과 거래량의 조정 기준을 맞춘다 |
| 거래정지 못 파는 날에 판 걸로 계산된다 | 정지 기간은 매매 불가로 막는다 |
정리매매 땐 거래도 유동성도 보장되지 않으니, 첫날 시가 청산이 보수적이라고 장담할 순 없다.
신호와 체결은 다르다
종가로 확정한 신호를 쓰는 이번 백테스트에서는 다음 거래일 시가에 진입한다.
장중 돌파를 바로 사는 전략이라면 체결 방식이 달라진다.
스톱이 10,000원인데 시가가 9,000원에 열리면 9,000원에 팔린다.
그래서 장중 손절은 먼저 그날 손절이 났는지 판정하고, 체결가는 시가가 이미 스톱 아래면 시가, 아니면 스톱으로 둔다.
슬리피지와 거래정지는 따로 반영하고, 종가로 판정하는 청산 룰엔 이 가정을 그대로 쓸 수 없다.
연간 거래비용은 거래 횟수보다 계좌 대비 총 거래금액에 좌우된다.
매수와 매도를 한 쌍으로 센 1년 왕복 거래금액이 계좌의 10배이고 왕복 비용이 0.3%라면, 비용은 대략 계좌의 3%다.
결과는 점이 아니라 분포다
슬롯은 5개인데 신호가 12개 떴다면, 뭘 먼저 사느냐가 결과를 바꾼다.
같은 룰을 돌린 내 백테스트 결과는 이렇게 갈렸다.
| 돌린 방식 | 연복리 | 메모 |
|---|---|---|
| 내 엔진 | 9.0% | 후보 종목은 99.5% 같은데 같은 날 무엇을 먼저 사느냐가 달랐다 |
| 다른 AI가 짠 엔진 | 11.6% | |
| 순서 무작위 48번 | 6.5~11.2% | 실전에서도 뭘 먼저 살지 모르니 이 폭이 실전의 불확실성이다 |
"우리 전략은 연 9%"가 아니라 "연 6~11%, 중앙 9%"가 정직한 표현이다.
내가 겪은 사고
에러는 안 났고 숫자는 그럴싸했는데, 내 백테스트 코드엔 이런 버그가 숨어 있었다.
| 버그 | 무슨 일이 있었나 |
|---|---|
| RS(상대강도) 최근 3개월 항 | 가중치 0.4짜리 항이 인덱스 하나 때문에 늘 0이었다. 고치자 연복리 14.5%가 9.5%로 내려갔고 "지수를 이긴다"는 주장도 사라졌다 |
| 신규 상장주 | 모집단에서 미리 빼고 있었다 |
| 백분위 | 2/3 대신 66.667로 썼다 |
| 피벗 배제 조건 | break 하나 때문에 하루만 막고 있었다 |
어떻게 찾았냐고?
다른 AI가 같은 룰을 새로 짜게 하고 날짜별 후보를 맞춰봤다.
처음엔 70%만 같았고, 12라운드 만에 99.5%가 됐다.
백테 코드는 자기가 짜고 자기가 검사하면, 틀린 자리를 거의 반드시 그냥 지나친다.
첫 백테스트 전 체크리스트
돌리기 전에 하나씩 확인해 본다.
| 볼 것 | 기준 |
|---|---|
| 상폐 종목 | 유니버스에 들어 있고, 보유 중 상폐 시 청산 가정이 있다 |
| 가격·거래정지 | 수정주가를 쓰고, 정지 기간은 매매 불가로 막았다 |
| 진입 | 종가 신호라면 다음 거래일 시가 |
| 장중 손절 체결가 | 시가가 스톱 아래면 시가, 아니면 스톱. 종가 청산 룰은 따로 짰다 |
| 결과 | 분포로 본다. 다른 도구로 한 번 더 만들어 맞춰봤다 |
첫 백테의 숫자는 거의 확실히 틀려 있다.
그걸 알고 돌리는 것과 모르고 돌리는 것의 차이가 결국 실전 계좌에 나타난다.
첫 댓글을 남겨 주세요.