백테스트란? 기본 개념과 실행 순서, 거래 한 건을 손계산으로 재현하는 법
백테스트는 과거 자료를 시간 순서대로 읽으며 가상의 주문과 손익을 계산하는 작업입니다. 이번 강의에서는 가상 자료로 거래 한 건을 처음부터 다시 계산해, 같은 결과를 재현하는 순서를 익힙니다.

매매 규칙을 적었다면 다음 질문은 "이 규칙을 과거에 적용했을 때 어떤 거래가 나왔을까?"입니다. 그런데 많은 분이 이 단계에서 수익률 숫자부터 찾아요. 정작 그 숫자가 규칙대로 계산된 것인지는 확인하지 않은 채로요.
이번 강의는 고급 29강의 가상 A 자산 돌파 규칙을 이어받습니다. 짧은 자료로 신호와 체결을 직접 대조한 뒤 비용, 계좌 가치, 검증 구간까지 살펴볼게요. 본문 숫자는 모두 자체 가상 자료로 계산했으며 실제 종목의 과거 성과가 아닙니다.
- 백테스트는 미래를 맞히는 시험이 아니라, 고정한 규칙이 과거 자료에서 어떤 거래와 위험을 만들었는지 조사하는 과정입니다.
- 신호는 봉 마감에, 체결은 다음 봉 시가에 분리해 기록하고, 판단선(98원)이 아닌 실제 가정 체결가(94원)와 비용으로 손익을 계산합니다.
- 먼저 손계산과 프로그램 결과를 맞춰 계산 정확성을 확인한 뒤, 규칙을 고정하고 수정에 쓰지 않은 구간에서 전략을 평가합니다.
목차
백테스트란 무엇이고, 왜 하는 걸까?
백테스트는 과거 자료를 시간 순서대로 읽으며 정해 둔 매매 규칙대로 가상의 주문과 손익을 계산하는 작업입니다. 미래를 맞히는 시험이 아니라, 정한 조건이 어떤 결과와 위험을 만들었는지 조사하는 과정이에요.
검토는 두 단계로 나눕니다. 먼저 "계산이 정확한가"를 확인하고, 그다음에 "다른 자료에서도 타당한가"를 봅니다. 실행 흐름은 아래 네 단계입니다.
- 규칙 고정검증하는 동안 같은 조건을 유지합니다.
- 자료 점검봉 시각과 누락을 확인합니다.
- 거래 계산체결 가정과 비용을 반영합니다.
- 결과 검토손익과 위험을 함께 비교합니다.
백테스트 전에 무엇을 고정해야 할까?
규칙 버전, 종목·거래소, 시간봉, 관찰 기간, 초기 자금, 비용과 체결 방식을 먼저 적어 고정해야 합니다. 규칙을 바꿔 가며 결과를 비교하면 무엇을 검증했는지 흐려지기 때문이에요.
- 거래 방식
- 현물 매수, 레버리지 없음
- 시간봉·시각
- 일반 1시간봉, UTC 시각
- 수량 단위
- 정수 수량
- 초기 자금
- 현금 10,000원
| 항목 | 규칙 |
|---|---|
| 신호 | 이전 종가 ≤ 100, 현재 종가 > 100, 거래량이 직전 20개 평균의 1.5배 이상 |
| 진입 | 신호 다음 한 봉 시가가 100 초과 103 이하이면 그 시가로 전량 체결 가정 |
| 청산 | 종가 ≤ 98 또는 ≥ 110이면 다음 시가 청산. 그 전에 없으면 진입 봉 포함 6번 마감 뒤 다음 시가 청산 |
| 횟수 | 첫 유효 신호 한 번만 사용. 취소 또는 청산 뒤 같은 설정 재진입 없음 |
| 수량 | 계획 예산 500원과 가용 현금의 제한 중 작은 정수 수량 |
| 비용 | 매수와 매도 각각 단위당 0.1원. 기본 예제의 추가 슬리피지 0 |
규칙표에 안 적힌 경우는 어떻게 처리할까?
애매한 상황도 미리 정해 둡니다. 이번 예제의 보조 규칙은 이렇습니다.
- 손실 대응·목표·시간 제한이 같은 마감에 겹치면 그 순서로 청산 사유를 기록합니다.
- 추가 매수와 분할 청산은 없습니다.
- 자료가 부족하거나 평균이 0이면 신호를 만들지 않고, 수량이 0이면 거래하지 않습니다.
- 가격선은 자료를 보기 전에 정했다고 가정합니다.
백테스트 데이터는 무엇을 점검해야 할까?
최소한 봉 시각, 시가(O), 고가(H), 저가(L), 종가(C), 거래량(V)이 필요하고, 시각 기준·중복·역순·누락·가격 논리·거래량 단위를 점검해야 합니다. 자료가 틀리면 계산이 아무리 정확해도 결과는 의미가 없어요.
- 시각이 봉 시작인지 종료인지 확인합니다.
- 중복·역순·누락을 점검합니다.
- 저가는 시가와 종가 이하, 고가는 시가와 종가 이상이어야 합니다.
- 거래량 단위와 거래 시간 포함 범위가 같아야 합니다.
계산 준비 구간은 왜 따로 둘까?
이 규칙은 현재 봉을 제외한 직전 20개 거래량 평균을 쓰므로 최소 20개의 과거 봉이 먼저 있어야 합니다. 계산 준비 구간은 지표 계산용이며 신호 평가 기간과 구분합니다. 또 각 봉이 마감돼야 그 봉의 종가와 거래량을 사용할 수 있습니다.
| 봉 번호 | 시가 | 고가 | 저가 | 종가 | 거래량 |
|---|---|---|---|---|---|
| 1~20 각각 | 99 | 100 | 98 | 99 | 100 |
| 21 | 99 | 103 | 98 | 102 | 180 |
| 22 | 103 | 106 | 101 | 105 | 120 |
| 23 | 105 | 106 | 96 | 97 | 140 |
| 24 | 94 | 98 | 93 | 96 | 160 |
첫 20개 봉은 모두 같은 값이고, 21번 봉부터 신호를 평가합니다. 초기 상태는 현금만 보유하고 주문은 없어요. 주식 분할·배당·휴장이나 선물 만기 같은 실제 시장의 처리는 이 가상 자료에 없습니다.
누락 구간이 있으면 어떻게 할까?
조용히 건너뛰지 않습니다. 보유 중 봉이 빠지면 그동안 청산 조건이 발생했는지 알 수 없기 때문이에요.
- 오류로 표시누락 구간을 기록에 남깁니다.
- 복구 후 재계산자료를 복구한 뒤 다시 계산합니다.
- 복구 불가 시 불완전 결과로 표시완전한 성과처럼 제시하지 않습니다.
- 마지막 청산 봉이 없으면 미청산 표시실현손익과 구분합니다.
백테스트는 한 봉씩 어떻게 계산할까?
봉 마감에 신호를 판단하고, 체결은 다음 봉 시가에서 처리하며, 신호 봉과 체결 봉을 분리해 기록합니다. 신호를 판단하는 순간에는 다음 봉 시가를 아직 모른다는 점이 핵심이에요.
- 21번 봉 마감: 신호 발생이전 종가 99원, 현재 종가 102원으로 100원을 넘었습니다. 거래량 평균 100개 대비 현재 180개로 1.8배입니다. 가격과 거래량 조건이 맞아 진입을 예약합니다. 이때는 22번 시가를 아직 모릅니다.
- 22번 봉 시가: 103원 진입시가 103원은 허용 범위(100 초과 103 이하) 안입니다. 계획 단위 손실은 103 − 98 + 0.2 = 5.2원, 예산 수량은 500 ÷ 5.2의 정수 부분인 96개입니다. 현금 제한도 10,000 ÷ 103.1의 정수 부분인 96개이므로 96개를 진입시킵니다. 이 봉이 보유 1번이고, 종가 105원에서는 청산 조건이 없습니다.
- 23번 봉 마감: 청산 예약보유 2번입니다. 종가 97원이 98원 이하이므로 다음 봉 청산을 예약합니다.
- 24번 봉 시가: 94원 청산시가 94원으로 청산하며, 판단선 98원으로 바꾸지 않습니다. 그 뒤에는 같은 설정으로 다시 거래하지 않습니다.

각 봉에서 처리 순서는 어떻게 정할까?
같은 봉 안에서도 무엇을 먼저 처리하느냐에 따라 결과가 달라질 수 있어서, 순서를 고정해 둡니다.
- 시가: 예약된 청산 처리이전에 예약된 청산을 먼저 실행합니다.
- 시가: 진입 예약 확인진입 예약이 있으면 허용 조건과 수량을 확인합니다.
- 마감: 보유 수와 청산 조건 확인보유 봉 수를 세고 청산 조건을 점검합니다.
- 마감: 새 신호 평가아직 사용하지 않은 설정에서만 새 신호를 평가합니다.
- 평가액 기록현금과 보유 자산의 평가액을 기록합니다.
봉 중간에 저가가 판단선 아래로 내려가면?
이 모형에서는 종가가 판단선 위라면 청산하지 않습니다. 장중 스톱 주문 방식으로 바꾸면 그건 다른 전략 버전이에요.
백테스트에서 체결 가격과 비용은 어떻게 계산할까?
가격 차이 손익과 거래 비용을 분리해서 계산한 뒤 합칩니다. 이번 거래는 96개를 103원에 사서 94원에 판 경우로, 순손익은 −883.2원입니다.
| 항목 | 계산 | 결과 |
|---|---|---|
| 가격 차이 손익 | (94 − 103) × 96 | −864원 |
| 진입 비용 | 0.1 × 96 | 9.6원 |
| 청산 비용 | 0.1 × 96 | 9.6원 |
| 왕복 비용 | (0.1 + 0.1) × 96 | 19.2원 |
| 순손익 | −864 − 19.2 | −883.2원 |
| 최종 현금 | 10,000 − 883.2 | 9,116.8원 |

계획 예산은 500원이었는데 손실이 그보다 큰 이유는, 이 규칙이 98원 청산을 보장하지 않기 때문입니다. 종가로 판단하고 다음 시가에 나오니까요.
현금 흐름으로도 검산할 수 있을까?
네, 손익 계산과 현금 계산이 반드시 일치해야 합니다. 맞지 않으면 어딘가 계산 오류가 있다는 신호예요.
- 진입 시 지출96 × 103.1 = 9,897.6원을 지출해 현금 102.4원이 남습니다.
- 청산 시 수령96 × 93.9 = 9,014.4원을 받습니다.
- 최종 현금102.4 + 9,014.4 = 9,116.8원으로 손익 계산과 같습니다.
수수료·슬리피지·스프레드는 어떻게 다를까?
- 수수료
- 거래에 드는 비용
- 슬리피지
- 기대 가격과 체결 가격의 차이
- 스프레드
- 매수·매도 호가 차이
- 상품별 비용
- 선물·차입 거래를 검증할 때 필요한 펀딩비나 차입 비용 등
비용 가정만 바꾸면 결과가 얼마나 달라질까?
비용 가정을 바꾸면 결과도 다시 계산해야 합니다. 수량과 체결가를 96개·103원·94원으로 고정하고 비용만 바꾼 민감도 예시입니다.
| 편도 비용 | 왕복 비용 | 순손익 |
|---|---|---|
| 단위당 0.1원 | 19.2원 | −883.2원 |
| 단위당 0.2원 | 38.4원 | −902.4원 |
이건 비용 영향만 보는 비교예요. 전략 전체를 다시 실행할 때는 새 비용으로 수량도 재계산해야 합니다.
아래 계산기에 이번 예제 값(계좌 10,000원, 예산 500원, 왕복 비용 0.2원, 진입 103원, 손실 판단선 98원, 목표 110원)을 넣어 두었습니다. 판단선 기준 계산이라는 점, 실제 가정 청산가는 다를 수 있다는 점을 함께 기억하세요.
백테스트 결과에서 최종 수익률과 최대낙폭은 어떻게 읽을까?
최종 수익률은 처음과 끝의 계좌 가치만 비교한 숫자이고, 최대낙폭은 그 사이 고점에서 얼마나 떨어졌는지를 보여주는 숫자입니다. 둘은 다른 정보이므로 반드시 함께 읽어야 해요.
입출금이 없으므로 최종 수익률은 (9,116.8 − 10,000) ÷ 10,000 × 100 = −8.832%입니다. 이는 이 가상 한 거래의 결과이며, 연간 수익률로 바꾸거나 전략 전체의 기대수익으로 해석하지 않습니다.
| 시점 | 계산 | 계좌 가치 |
|---|---|---|
| 시작 | 현금 | 10,000.0원 |
| 22번 마감 | 102.4 + 96 × 105 | 10,182.4원 |
| 23번 마감 | 102.4 + 96 × 97 | 9,414.4원 |
| 24번 청산 | 청산 후 현금 | 9,116.8원 |
보유 중 평가액에서는 아직 발생하지 않은 매도 수수료를 차감하지 않았고, 실제 가상 청산 시점에 차감했습니다. 표시 시점의 최고 계좌 가치 10,182.4원에서 최종 9,116.8원까지 감소액은 1,065.6원이고, 이 표본 기준 최대낙폭은 1,065.6 ÷ 10,182.4 × 100 = 약 10.47%입니다.

수익률 한 숫자로 평가하면 안 될까?
안 됩니다. 아래 항목을 함께 기록해야 결과를 제대로 해석할 수 있어요.
- 거래 횟수, 비용 후 총손익
- 평균 이익과 평균 손실, 승률
- 최대낙폭, 보유 시간
- 취소와 미청산 건수, 검증 기간
한 건에서 승률을 계산할 수는 있어도 안정적인 성공 확률의 추정치로 삼을 수는 없습니다. 비교 대상도 같은 기간·초기 자금·비용·가격 기준으로 맞춰야 하고요. 단순 보유와 비교할 때는 현금 대기 시간과 투자 규모가 다를 수 있으니 수익률만 보고 우열을 확정하지 마세요. 결과가 좋더라도 특정 장세나 소수 거래에 의존했는지 확인합니다.
계산 확인과 전략 평가는 어떻게 나눌까?
먼저 작은 자료에서 손계산과 프로그램 결과를 맞춰 계산이 정확한지 확인하고, 그다음 규칙을 고정한 채 수정에 쓰지 않은 구간에서 전략을 평가합니다. 이 두 단계를 섞으면 결과를 믿을 근거가 사라져요.
이번 강의 제작에서는 29강 규칙을 실행해 손실 청산, 목표 청산, 시간 청산, 진입 취소를 각각 확인했습니다. 아래는 서로 독립된 가상 입력이며, 연속된 투자 성과나 승률 표가 아닙니다.
| 독립 사례 | 핵심 입력 | 계산 결과 |
|---|---|---|
| 손실 청산 | 103 진입 후 종가 97, 다음 시가 94 | 순손익 −883.2원 |
| 목표 청산 | 103 진입 봉 종가 111, 다음 시가 112 | 순손익 +844.8원 |
| 시간 청산 | 103 진입 후 6봉 종가 105 유지, 다음 시가 104 | 순손익 +76.8원 |
| 진입 취소 | 신호 뒤 다음 시가 104 | 거래 없음, 현금 10,000원 |
네 사례는 모두 같은 초기 현금과 비용에서 시작하고, 수익·손실 사례의 수량은 96개입니다. 목표 사례도 110원 판단선이 아니라 실제 가정된 다음 시가 112원으로 계산했어요. 이런 대조는 계산 오류를 찾는 데 쓰며 전략의 성능을 주장하는 자료가 아닙니다.
새 자료에서 평가하기 전에 무엇을 해야 할까?
규칙을 고정하고, 자료를 시간 순서대로 두 구간으로 나눕니다.
- 개발 구간
- 규칙을 만들 때 쓴 앞쪽 구간입니다.
- 평가 구간
- 아직 수정에 사용하지 않은 뒤쪽 구간입니다. 이 구간의 결과를 본 뒤 조건을 수정하면 그 구간도 개발에 사용한 셈이므로 새 평가 자료가 필요합니다.
- 평가 기간 시작에서 과거 지표 준비 자료를 쓰는 것은 가능하지만, 그 시점 이후의 정보가 계산에 들어가면 안 됩니다.
- 반복해서 시도한 규칙 수와 실패 결과도 보관합니다.
- 정해진 거래 횟수 하나만으로 검증 완료라고 판단하지 않습니다.
과거 평가 뒤에는 규칙을 고정한 모의 기록으로 앞으로의 신호와 실행 차이를 확인합니다. 다만 모의 체결도 실제 유동성과 주문 대기를 그대로 재현하지 못할 수 있어요.
백테스트에서 자주 하는 실수는?
대부분 "결과를 좋게 보이게 하는" 방향의 실수입니다. 아래 다섯 가지를 실행 전에 점검해 보세요.
1. 좋아 보이는 구간만 골라 합친다
같은 초기 자금으로 여러 구간을 반복한 결과를 하나의 연속 계좌 성과로 합치면 실제와 다른 숫자가 됩니다.
점검: 새 설정을 만드는 시점과 자금 연결 방법을 먼저 정하기2. 누락 구간을 조용히 건너뛴다
보유 중 빠진 봉에서 청산 조건이 발생했는지 알 수 없습니다.
점검: 오류 표시 후 복구·재계산, 안 되면 불완전 결과로 표시하기3. 판단선 가격으로 체결을 계산한다
98원 판단선이 아니라 다음 시가 94원이 계산에 쓸 청산가입니다. 목표 청산도 110원이 아니라 112원으로 계산했죠.
점검: 체결 목록의 가격이 체결 가정과 일치하는지 대조하기4. 비용을 두 번 빼거나 기본값을 그대로 쓴다
체결가에 이미 넣은 슬리피지·호가 차이를 또 빼면 결과가 왜곡되고, 도구의 기본 설정은 내 체결 가정과 다를 수 있습니다.
점검: 비용 항목별로 어디에 반영했는지 적어두기5. 평가 구간을 보고 조건을 고친다
그 순간 평가 구간은 개발 구간이 됩니다.
점검: 수정했다면 새 평가 자료를 준비하고 시도 횟수 기록하기
상황 판단 문제, 직접 풀어볼까요?
Q1. 신호 다음 봉 시가가 104원이었습니다. 어떻게 처리할까요?
허용 범위(100 초과 103 이하)를 벗어났으므로 진입을 취소합니다. 거래는 없고 현금은 10,000원 그대로입니다. 첫 유효 신호 한 번만 쓰는 규칙이라 같은 설정으로 재진입하지 않아요.
Q2. 23번 봉 저가가 96원으로 98원 아래였는데, 그때 바로 청산해야 할까요?
이 모형에서는 아닙니다. 종가 기준으로 판단하므로 23번 종가 97원을 보고 다음 봉 청산을 예약합니다. 장중 스톱 주문 방식으로 바꾸면 다른 전략 버전이 됩니다.
Q3. 계좌 가치가 10,182.4원까지 올랐다가 9,116.8원에 끝났습니다. 최종 수익률과 최대낙폭은?
최종 수익률은 (9,116.8 − 10,000) ÷ 10,000 × 100 = −8.832%, 표시 시점 기준 최대낙폭은 1,065.6 ÷ 10,182.4 × 100 = 약 10.47%입니다. 봉 중간 가격을 포함하지 않았으니 장중 최대낙폭이라고 부르지 않아요.
이 강의를 마치고 해볼 것은?
백테스트의 첫 성과는 높은 수익률이 아니라 설명 가능한 거래 기록입니다. 같은 자료와 설정에서 같은 결과가 나오는지 확인한 뒤에야 전략을 평가할 수 있어요. 아래 결과물을 직접 하나씩 만들어 보세요.
성과 화면 한 장만으로는 같은 계산을 재현하기 어렵습니다. 이번 예제의 24개 봉으로 손계산부터 해보고, 내가 쓰는 도구의 결과와 숫자가 같은지 맞춰 보세요. 다음 고급 31강 「백테스트 수익률이 실전에서 재현되지 않는 이유」에서는 과최적화·미래 정보 참조·생존편향을 더 자세히 다룹니다.

자주 묻는 질문
백테스트란 무엇인가요?
백테스트는 과거 자료를 시간 순서대로 읽으며 정해 둔 매매 규칙대로 가상의 주문과 손익을 계산하는 작업입니다. 미래를 맞히는 시험이 아니라, 정한 조건이 어떤 결과와 위험을 만들었는지 조사하는 과정입니다.
백테스트는 어떤 순서로 실행하나요?
규칙 고정, 자료 점검, 거래 계산, 결과 검토 순서로 진행합니다. 먼저 작은 자료로 손계산과 프로그램 결과를 맞춰 계산이 정확한지 확인하고, 그다음 수정에 쓰지 않은 구간에서 전략의 타당성을 평가합니다.
백테스트에서 손절 판단선과 실제 청산가가 다른 이유는 뭔가요?
이번 예제는 봉 마감 종가로 판단하고 다음 봉 시가에 청산하는 모형이기 때문입니다. 23번 봉 종가 97원이 판단선 98원 이하여서 청산을 예약했고, 실제 계산은 24번 봉 시가 94원으로 했습니다. 그래서 손실이 계획 예산 500원보다 큰 883.2원이 됐습니다.
백테스트 데이터는 무엇을 확인해야 하나요?
봉 시각, 시가·고가·저가·종가, 거래량이 필요하고 시각이 봉 시작인지 종료인지, 중복·역순·누락이 없는지 점검합니다. 저가는 시가와 종가 이하, 고가는 이상인지, 거래량 단위와 거래 시간 범위가 같은지도 확인합니다.
백테스트 최대낙폭은 어떻게 계산하나요?
기록된 계좌 가치의 최고점에서 이후 최저점까지 감소한 비율로 계산합니다. 예제에서는 10,182.4원에서 9,116.8원까지 1,065.6원이 줄어 약 10.47%입니다. 봉 중간 가격을 포함하지 않았다면 장중 최대낙폭이라고 부르지 않습니다.
백테스트 결과가 좋으면 실전에서도 수익이 나나요?
보장되지 않습니다. 정확한 계산은 전략의 수익성이나 실전 체결 가능성을 입증하지 않으며, 미래 정보 참조·생존편향·과최적화는 결과를 실제보다 좋게 보이게 할 수 있습니다. 규칙을 고정한 모의 기록으로 신호와 실행 차이도 확인해야 합니다.
인용 안내 이 글을 인용할 때는 출처를 함께 적어 주세요.이재민, 「백테스트란? 기본 개념과 실행 순서, 거래 한 건을 손계산으로 재현하는 법」, 트레이드캠프, 2026-11-06. https://tradecamp.co.kr/post/backtest-basics-execution-steps
본문의 모든 숫자는 강사가 만든 가상 자료로 계산한 예시이며 실제 종목의 과거 성과나 실전 수수료가 아닙니다. 트레이드캠프의 모든 콘텐츠는 교육 목적으로 제공되며 투자 권유나 자문이 아닙니다. 투자 판단과 그 결과에 대한 책임은 투자자 본인에게 있으며, 가상자산과 주식은 원금 손실 위험이 있습니다.



