변동성 돌파 전략 백테스트 방법: 비용과 편향까지 반영하는 실전 검증

“백테스트 수익률이 높으면 실전에서도 통할까?”라는 질문의 답은 단순하지 않습니다. 과거 차트에서 좋아 보이는 전략도 수수료와 슬리피지를 적용하거나 검증 기간을 바꾸면 성과가 크게 달라질 수 있습니다. 여러 조건을 반복해서 시험한 뒤 가장 좋은 결과만 고르면 우연을 실력으로 오해하기도 쉽습니다.

변동성 돌파 전략 백테스트의 목적은 높은 수익률을 찾아 자랑하는 것이 아닙니다. 누가 다시 실행해도 같은 결과가 나오도록 데이터, 매매 규칙, 체결 방식과 비용을 기록하고 전략의 약점을 확인하는 과정입니다. 백테스트는 가설 검증 도구이지 미래 성과를 보장하는 증명서가 아니라는 전제부터 세워야 합니다.

가격 차트에 변동성 범위와 돌파 지점을 표시한 개념도

변동성 돌파 전략 백테스트란 무엇인가

백테스트는 과거 시장 데이터에 미리 정한 진입·청산 규칙을 적용해 당시 거래했다면 어떤 결과가 나왔을지 계산하는 시뮬레이션입니다. 변동성 돌파 전략은 일정 기간의 가격 범위나 ATR처럼 변동성을 나타내는 수치를 기준으로 돌파선을 만들고, 가격이 그 선을 넘어설 때 진입하는 방식입니다.

그러나 과거 결과는 선택한 시장 환경에 의존합니다. 상승 추세가 길었던 기간에서 잘 작동한 규칙이 횡보장이나 급락장에서도 같은 모습을 보인다고 단정할 수 없습니다. 따라서 전체 수익률뿐 아니라 서로 다른 장세, 비용 차감 후 성과, 낙폭과 거래 표본을 함께 살펴야 합니다.

데이터를 준비할 때 먼저 고정할 조건

시장·종목·기간을 구체적으로 정한다

대상 시장과 종목 목록, 시작일과 종료일, 일봉·시간봉 같은 봉 주기를 먼저 고정합니다. 강세장만 포함된 짧은 구간보다 상승·하락·횡보와 변동성 확대·축소 국면이 섞인 기간이 적합합니다. 단일 종목 결과만 보지 말고 가능하면 성격과 유동성이 다른 여러 종목에서도 같은 규칙을 확인합니다.

거래량이 부족한 종목은 백테스트 가격대로 원하는 수량을 체결하기 어렵습니다. OHLCV의 O·H·L·C는 각각 시가, 고가, 저가, 종가이고 V는 거래량입니다. 누락된 봉, 중복 행, 잘못된 시간대, 거래정지와 상장폐지 처리 여부를 검사하고 데이터 제공처와 내려받은 날짜도 기록합니다.

수정주가와 종목 구성의 시점을 확인한다

주식 데이터는 액면분할과 배당을 어떻게 반영했는지 확인해야 합니다. 진입 가격은 원시 가격인데 지표에는 수정주가를 쓰는 식으로 기준을 섞으면 신호가 왜곡될 수 있습니다. 현재 살아남은 종목만 과거에도 존재했던 것처럼 시험하면 상장폐지 종목이 빠지는 생존자 편향이 생깁니다. 당시 실제 투자할 수 있었던 종목 집합을 사용하는 것이 원칙입니다.

변동성 돌파 매매 규칙을 숫자로 정의하기

과거 가격 범위를 이용하는 방법

예를 들어 일봉 전략을 “오늘 시가 + 전일 가격 범위의 0.5배”를 돌파선으로 정하고, 장중 가격이 이를 넘으면 진입한다고 정의할 수 있습니다. 전일 범위가 고가와 저가의 차이인지, 최근 20일 범위의 평균인지 분명히 적어야 합니다. 계수 0.5, 보유 기간, 손절선과 청산 시점도 함께 고정해야 완전한 규칙이 됩니다.

ATR로 갭까지 반영하는 방법

ATR은 일정 기간의 True Range 평균으로 가격 변동성을 측정하는 지표입니다. True Range는 ① 당일 고가−저가, ② 당일 고가와 전일 종가 차이의 절댓값, ③ 당일 저가와 전일 종가 차이의 절댓값 중 가장 큰 값입니다. 따라서 단순한 고가·저가 범위와 달리 전일 종가에서 발생한 갭도 반영합니다. 자세한 정의는 Fidelity의 ATR 설명에서도 확인할 수 있습니다.

한 가지 규칙은 “전일 종가 + 전일까지 계산한 14일 ATR의 1.0배를 종가가 상향 돌파하면 신호를 만들고, 다음 봉 시가에 진입한다”처럼 쓸 수 있습니다. ATR 기간과 배수는 예시일 뿐 정답이 아닙니다. ATR은 방향성이 없는 지표이므로 ATR 상승 자체를 상승 매수 신호로 해석해서도 안 됩니다.

True Range 세 가지 계산 요소와 ATR 관계를 보여주는 개념도

진입·청산·손절을 서로 분리한다

진입 조건만 정의하면 백테스트를 실행할 수 없습니다. 시간 청산은 진입 후 5개 봉의 종가, 추적 청산은 최고가에서 2 ATR 하락, 초기 손절은 진입가에서 1.5 ATR 하락처럼 각각 숫자로 적습니다. 같은 봉에서 목표가와 손절가가 모두 닿았다면 어느 주문이 먼저 체결됐는지 일봉만으로 알 수 없습니다. 더 짧은 주기 데이터를 사용하거나 불리한 순서를 적용하는 보수적 규칙이 필요합니다.

신호와 체결 가격을 현실적으로 구분하기

종가가 확정되어야 알 수 있는 신호를 확인한 뒤 같은 종가에 이미 체결됐다고 계산하면 미래 정보를 사용한 결과가 됩니다. 종가 신호는 다음 봉 시가에 주문하거나, 다음 봉에서 지정한 가격 조건을 충족할 때 체결되는 것으로 처리해야 합니다. 지표 계산에는 신호 시점까지 확정된 데이터만 사용합니다.

장중 고가가 돌파선보다 높았다는 이유만으로 돌파선 가격에 완벽히 체결됐다고 가정하는 것도 낙관적입니다. 시가가 돌파선 위로 갭 상승했다면 진입가는 돌파선이 아니라 실제 시가 또는 더 불리한 가격이 될 수 있습니다. 거래량 부족, 가격제한, 주문 지연과 미체결 조건도 대상 시장에 맞춰 정해야 합니다.

수수료·스프레드·슬리피지 반영하기

거래비용에는 증권사 수수료와 세금뿐 아니라 매수 호가와 매도 호가의 차이인 스프레드, 주문 가격과 실제 체결 가격의 차이인 슬리피지가 포함됩니다. 한 번의 왕복 거래비용은 진입 비용과 청산 비용을 모두 더해야 합니다. 비용률을 거래대금에 곱하는 방식이라면 매수와 매도 각각에 적용합니다.

슬리피지는 모든 종목에 같은 숫자를 넣기보다 유동성, 주문 규모, 변동성에 따라 시나리오를 나누는 편이 현실적입니다. 기본·보수·스트레스 비용을 각각 적용해 순수익률과 MDD가 얼마나 변하는지 비교합니다. 비용을 조금 높였을 때 기대값이 바로 음수로 바뀐다면 실전에서 견고한 전략이라고 보기 어렵습니다.

백테스트 검증 절차를 순서대로 보여주는 흐름도

포지션 크기와 손실 한도를 함께 시험하기

매번 같은 수량을 매수하면 가격이 높은 종목과 낮은 종목의 위험이 달라집니다. 계좌 자산의 일정 비율을 거래당 허용 손실로 정하고 손절 거리로 나누는 방식이 비교에 유용합니다. 기본 수량은 ‘허용 손실액 ÷ 주당 손실 가능액’의 정수 이하 값으로 계산할 수 있습니다.

예를 들어 손절 거리를 진입가의 1.5 ATR 아래로 정했다면 주당 손실 가능액에는 그 거리와 예상 비용을 포함합니다. 계산된 수량이 실제 거래량에 비해 지나치게 크지 않은지도 확인합니다. 최대 동시 포지션 수, 종목당 한도, 전체 레버리지와 현금 부족 시 주문 우선순위도 포트폴리오 백테스트 규칙에 넣어야 합니다.

수익률보다 함께 봐야 할 성과 지표

  • 누적수익률과 연환산수익률: 전체 증가율과 기간을 보정한 성장 속도를 보여주지만 위험의 크기는 설명하지 못합니다.
  • 최대낙폭(MDD): 누적 자산의 이전 고점에서 이후 저점까지 발생한 가장 큰 하락률입니다. 낙폭의 깊이와 회복에 걸린 기간을 함께 봅니다.
  • 승률과 손익비: 승률은 이긴 거래의 비율이고 손익비는 평균 이익과 평균 손실의 관계입니다. 높은 승률이라도 한 번의 손실이 지나치게 크면 불리할 수 있습니다.
  • 거래당 기대값: ‘승률×평균이익−패률×평균손실’로 계산하며 반드시 비용 차감 후 금액이나 수익률을 사용합니다.
  • 샤프지수: 변동성 대비 초과수익을 비교하는 지표지만 수익률 분포와 계산 주기, 표본 수에 민감합니다.
  • 거래 횟수: 전략을 평가할 표본의 크기입니다. 거래가 지나치게 적으면 높은 수익률이나 승률이 몇 건의 우연에 좌우될 수 있습니다.

월별·연도별 성과, 연속 손실 횟수, 평균 보유 기간과 시장 노출 비율도 확인합니다. 전체 이익이 특정 한 해나 소수 거래에 집중되었는지, 비용 적용 전후 결과가 얼마나 달라졌는지 보면 누적수익률 하나로는 드러나지 않는 취약성을 찾을 수 있습니다.

누적자산 곡선과 최대낙폭 구간을 함께 나타낸 예시 차트

과최적화와 편향을 줄이는 검증 절차

먼저 데이터를 인샘플과 아웃오브샘플로 나눕니다. 인샘플에서는 아이디어와 제한된 파라미터 범위를 정하고, 아웃오브샘플은 규칙을 확정한 뒤 한 번 검증하는 구간으로 남겨둡니다. 외부 구간 결과를 본 후 계속 수정하면 그 구간도 사실상 인샘플이 되므로 새로운 검증 데이터가 필요합니다.

워크포워드 검증은 과거 일정 구간에서 조건을 정한 뒤 바로 다음 구간에서 시험하고, 시간창을 앞으로 이동하며 이 과정을 반복하는 방법입니다. 실제로 시간이 흐르며 이용 가능한 정보가 늘어나는 상황을 흉내 낼 수 있습니다. 구간 길이와 재조정 주기는 테스트 전에 정해 두어야 합니다.

ATR 14일·1.0배만 유독 좋고 12~16일 또는 0.8~1.2배에서 성과가 급격히 무너지면 우연에 맞춘 값일 가능성을 의심해야 합니다. 비슷한 주변 값에서도 비용 차감 후 성과와 낙폭이 안정적인지 확인하십시오. 여러 전략과 파라미터를 반복 시험해 최고 결과만 고르는 과정은 선택 편향을 키운다는 점이 Bailey 등의 백테스트 과최적화 연구에서도 다뤄집니다.

시도한 파라미터 범위와 조합 수, 폐기한 전략까지 실험 일지에 남겨야 합니다. 테스트 횟수가 늘수록 우연히 좋은 결과를 발견할 기회도 늘어나기 때문입니다. 지표를 계산할 때 미래 봉이 포함되지 않았는지, 종목 목록이 당시 기준인지, 수정주가와 발표 시점이 올바른지도 별도로 점검합니다.

재현 가능한 결과표에 기록할 항목

결과표에는 데이터 출처와 추출일, 시장·종목 목록, 기간과 봉 주기, 가격 조정 방식, 진입·청산·손절 공식, 모든 파라미터를 기록합니다. 주문 종류, 신호 시각, 체결 가격, 갭 처리, 동일 봉 주문 순서, 미체결 처리와 슬리피지 모델도 빠뜨리지 않습니다.

초기자본, 포지션 사이징, 레버리지, 동시 보유 한도, 수수료와 세금, 스프레드 가정도 필요합니다. 결과에는 비용 전후 수익률, MDD와 회복 기간, 승률, 평균 이익·손실, 기대값, 샤프지수, 거래 수, 기간별 성과를 함께 적습니다. 코드 버전과 실행 환경, 난수 사용 시 시드까지 남기면 같은 결과를 다시 만들기 쉽습니다.

실전 투입 전 확인할 사항

  • 확정되지 않은 현재 봉이나 미래 데이터가 지표 계산에 들어가지 않았는가?
  • 상장폐지 종목과 당시 종목 구성을 포함해 생존자 편향을 줄였는가?
  • 신호 가격과 실제 주문·체결 가격을 구분했는가?
  • 왕복 수수료, 세금, 스프레드와 슬리피지를 적용했는가?
  • 다른 시장 국면과 아웃오브샘플에서도 결과가 유지되는가?
  • 파라미터 주변 값에서도 성과가 급변하지 않는가?
  • 거래 횟수와 유동성이 실제 운용을 판단하기에 충분한가?

검사를 통과했더라도 즉시 큰 자금을 투입하기보다 모의매매나 소규모 전진 테스트로 신호 전달, 주문 지연과 실제 슬리피지를 확인하는 편이 안전합니다. 실거래 결과가 가정과 달라지는 원인을 기록하고, 전략 변경 기준과 중단 조건을 사전에 정해 두십시오.

직접 실행하는 백테스트 순서

  1. 검증할 시장과 시점 기준 종목군, 기간, 봉 주기를 정합니다.
  2. OHLCV를 정제하고 수정주가·결측치·거래정지를 확인합니다.
  3. 돌파 기준, ATR 기간과 배수, 진입·청산·손절을 숫자로 고정합니다.
  4. 신호와 주문 시점을 분리하고 갭·미체결·동일 봉 충돌 규칙을 설정합니다.
  5. 포지션 크기와 모든 거래비용을 반영해 성과 지표를 계산합니다.
  6. 인샘플, 아웃오브샘플과 워크포워드 검증을 실시합니다.
  7. 파라미터 안정성과 편향을 점검하고 전체 실험 기록을 보관합니다.

좋은 변동성 돌파 전략 백테스트는 가장 화려한 곡선을 만드는 작업이 아니라 불리한 가정에서도 가설이 얼마나 유지되는지 확인하는 작업입니다. 결과를 미래 수익의 약속으로 해석하지 말고, 비용과 실패 가능성까지 드러내는 의사결정 자료로 활용해야 합니다.