백테스트가 좋아 보여도 전략을 바로 바꾸면 안 되는 이유

자동매매백테스트운영실험stock-auto-trade

요약

백테스트 수익률이 좋아 보여도 전략을 바로 바꾸면 안 된다. 중요한 건 숫자가 아니라, 그 숫자가 실제 매매 환경에 맞게 계산됐는지 먼저 확인하는 일이다.

자동매매를 운영하다 손실이 나면 조건을 바꾸고 싶어진다.

RS 기준이 느슨한 건 아닐까. MA20 이격 상한을 올려야 하는 건 아닐까. 이런 생각은 자연스럽다. 그런데 이번 점검을 통해 다시 확인한 것은, 그 질문에 바로 답하면 안 된다는 점이다.

처음 백테스트 결과는 좋아 보였다. 5년 기준 수익률과 손익비 모두 나쁘지 않았다. 겉으로 보면 전략이 건강해 보였다.

그런데 코드를 들여다보니 T일 종가로 신호를 판단하면서, 같은 T일 종가로 체결 처리를 하고 있었다. 룩어헤드 편향이었다. 룩어헤드 편향은 실제 매매 시점에는 알 수 없는 미래 정보를 백테스트에 사용해 성과가 과장되는 문제다.

실제 장중 자동매매는 10시, 13시, 14시에 스캔하고 그 시점의 조건과 가격을 바탕으로 매수를 판단한다. 하루가 끝난 뒤에야 알 수 있는 종가를 미리 알고 체결한 것처럼 계산하면, 백테스트는 실제보다 유리해질 수 있다.

이 문제를 제거했더니 성과는 낮아지고 위험은 커졌다. 하지만 그 결과가 더 가치 있었다. 과장된 수익률보다 현실적인 기준선이 운영 판단에는 더 쓸모 있기 때문이다.

두 번째로 확인한 것은 생존자 편향이었다. 현재 기준으로 선정된 40종목을 5년 전으로 되돌려 돌리면, 미래에 살아남았거나 강해진 종목이 이미 선택된 것처럼 반영된다. 이건 당시에는 알 수 없던 정보다.

이 지점에서 백테스트의 역할을 다시 정의했다.

백테스트는 미래 수익률을 예측하는 도구가 아니다. 조건 A와 조건 B를 같은 기준에서 비교하는 도구다.

RS 기준과 이격 상한을 그 방식으로 비교했다. old-15는 더 엄격한 RS 기준이고, loosen-30은 최근 시장 대응을 위해 완화한 RS 기준이다. old-15는 백테스트상 안정적으로 보였다. 그런데 실거래 30건을 같이 놓고 보니, old-15였다면 절반 이상이 진입하지 못했을 가능성이 있었다.

최근 시장에서는 loosen-30이 실제 기회를 만든 측면도 있었다. 이격 12%도 지표상 우세해 보였지만, 일부 고변동 종목의 편입이 늘고 손실이 커지는 구간이 있었다. 그래서 특정 조건이 더 낫다고 단정하기 어려웠다.

결론은 단순했다. 아직 바꿀 수 없다.

대신 관찰할 수 있는 구조를 만들었다. 매수 신호마다 RS 값, 이격률, 후보 기준 통과 여부가 남도록 로그를 보강했다. 실제 주문은 건드리지 않고, shadow_report로 후보 조건과 실거래를 나란히 비교한다. shadow_report는 실제 주문은 바꾸지 않고, 후보 조건이 적용됐을 때의 결과를 나란히 비교하기 위한 관찰용 기록이다.

2주 뒤에 이 데이터를 보고 다시 판단한다.

자동매매에서 중요한 건 빠른 수정이 아니다. 수정해도 되는지를 판단할 수 있는 구조다.

전략을 바꾸는 건 쉽다. 바꾼 뒤 왜 좋아졌는지, 왜 나빠졌는지 모르면 그건 개선이 아니다.

오늘은 전략을 바꾸지 않았다. 전략을 바꿀 수 있는 눈을 만들었다.

작업 기록

항목내용
What I built백테스트 편향 제거와 shadow_report 비교 구조
What broke초기 백테스트에 룩어헤드 편향이 있었다
What I learned좋은 백테스트 결과보다 중요한 건 그 결과를 믿을 수 있는지 확인하는 일이다

관련 Log: 자동매매 프로그램을 바로 고치지 않았다. 백테스트보다 먼저 계측판을 달았다