백테스트 계산기는 생각보다 단순한 물건입니다. 거래 목록 한 장을 받아서 열 몇 개를 차례로 채우고, 맨 아래에 숫자 몇 개를 내놓습니다. 웹에 있는 계산기든 엑셀이나 구글 시트로 직접 짠 것이든 하는 일은 같고, 차이는 어느 칸을 빼먹었느냐에서 납니다.
이 글은 그 계산기를 스프레드시트로 직접 만드는 순서를 다룹니다. 열을 하나씩 추가하면서 각 열이 무엇을 계산하는지, 어디서 실제 계좌와 어긋나는지를 봅니다. 예시 가격은 설명용으로 지어낸 값이고, 사이트 기록에서 가져온 숫자는 바이낸스 USDⓈ-M 무기한 선물 394종목을 90일간(2026년 10월 6일 11시 21분 KST까지) 모은 것입니다. 이 사이트는 성과를 계산하지 않으므로 그런 숫자는 나오지 않습니다.
계산기에 넣는 것은 신호가 아니라 거래 목록입니다
첫 단계에서 많이 막힙니다. 차트나 스크리너에서 받는 것은 "이 종목 이 시간봉에서 조건이 성립했다"는 신호 기록이고, 계산기가 먹는 것은 "언제 들어가서 언제 나왔다"는 거래 기록입니다. 둘 사이에 규칙 세 개가 끼어야 합니다.
- 진입 시점 — 신호가 기록된 봉의 종가인지, 다음 봉 시가인지. 조건은 봉이 닫힌 뒤에야 확인되므로(확정 시각) 다음 봉 시가 쪽이 실제와 가깝습니다.
- 청산 규칙 — 몇 봉 뒤에 나오는지, 반대 신호가 뜰 때 나오는지, 손절 가격에 닿을 때 나오는지.
- 겹침 처리 — 포지션을 들고 있는 동안 같은 종목에서 신호가 또 뜨면 무시할지, 추가로 들어갈지.
세 번째가 의외로 큽니다. 90일 기록에서 5이평 다이버전스는 23,543건으로 하루 평균 262건쯤이고, 종목당으로 나누면 60건 가까이 됩니다. 1시간봉 기준이면 이틀에 한 번꼴로 같은 종목에 신호가 뜨는 셈이라, 청산까지 몇 봉을 들고 있느냐에 따라 겹치는 신호가 꽤 나옵니다. 이걸 무시하느냐 더하느냐에 따라 거래 목록의 줄 수 자체가 달라집니다.
그래서 계산기 시트의 첫 탭은 이렇게 생깁니다. 종목, 방향, 진입 시각, 진입가, 청산 시각, 청산가, 명목 금액. 일곱 칸입니다.
1열 — 가격 변화를 방향에 맞춰 비율로 바꿉니다
첫 계산 열은 건별 가격 변화율입니다. 롱이면 (청산가 − 진입가) ÷ 진입가, 숏이면 (진입가 − 청산가) ÷ 진입가입니다. 스프레드시트에서는 방향 칸이 "숏"이면 부호를 뒤집는 IF 하나로 처리합니다.
이걸 비율로 두는 이유는 종목을 섞기 위해서입니다. 비트코인(BTC)이 60,000 USDT에서 600 USDT 움직인 것과 바이낸스코인(BNB)이 600 USDT에서 6 USDT 움직인 것은 둘 다 1.00%입니다. 금액으로 두면 비싼 종목이 표를 지배합니다.
다만 이 열에는 들고 있는 동안 무슨 일이 있었는지가 안 들어갑니다. 진입가와 청산가 두 점만 보기 때문입니다. 이 문제는 레버리지 열에서 다시 나옵니다.
2열 — 비용은 세 갈래로 따로 뺍니다
다음 열은 비용입니다. 한 칸에 뭉쳐 넣지 말고 세 칸으로 나누는 편이 나중에 읽기 쉽습니다.
| 비용 | 계산 | 예시 |
|---|---|---|
| 수수료 | 명목 금액 × 요율 × 2(진입·청산) | 시장가 0.05%면 왕복 0.10% |
| 펀딩비 | 보유 중 지난 정산 횟수 × 그때 요율, 방향에 따라 부호 | 8시간마다 한 번 |
| 체결 미끄러짐 | 신호 가격과 실제 체결가의 차이 | 호가가 얇은 종목일수록 큼 |
수수료 요율이 어디서 결정되는지는 선물 수수료 계산기 입력값에 정리해 두었습니다. 펀딩비는 부호가 핵심입니다. 요율이 양수이면 롱이 내고 숏이 받습니다. 그래서 같은 정산 시각을 지나도 롱 거래에서는 비용 칸이 커지고 숏 거래에서는 오히려 줄어듭니다. 정산 횟수를 세는 방법과 금액 계산은 펀딩비 계산에 있습니다.
네 건짜리 예시로 두 열을 채워 보면 이렇습니다. 수수료는 전부 시장가 왕복 0.10%, 펀딩비 요율은 0.01%로 둡니다.
| 거래 | 방향 | 진입 → 청산 | 가격 변화율 | 펀딩 | 비용 합 | 비용 뺀 값 |
|---|---|---|---|---|---|---|
| 이더리움(ETH) | 롱 | 2,500 → 2,550 | +2.00% | 0회 | 0.10% | +1.90% |
| 비트코인(BTC) | 롱 | 60,000 → 59,100 | −1.50% | 2회 지불 | 0.12% | −1.62% |
| 이더리움(ETH) | 숏 | 2,600 → 2,522 | +3.00% | 1회 수령 | 0.09% | +2.91% |
| 바이낸스코인(BNB) | 롱 | 600 → 597 | −0.50% | 0회 | 0.10% | −0.60% |
가격 변화율만 더하면 +3.00%, 비용을 빼면 +2.59%입니다. 네 건에서 0.41%포인트가 빠졌습니다. 건수가 늘면 이 차이가 어떻게 되는지는 아래 절에서 봅니다.
3열 — 레버리지는 배수가 아니라 명목 금액으로 넣습니다
웹 계산기 중에는 레버리지를 "10배" 같은 칸으로 받아 결과에 곱하는 것이 있습니다. 이렇게 하면 두 가지가 빠집니다.
하나는 비용도 같이 커진다는 점입니다. 증거금 100 USDT로 명목 1,000 USDT를 잡으면 왕복 수수료 0.10%는 1 USDT이고, 이건 증거금의 1%입니다. 가격 변화율에 10을 곱하면서 비용에는 안 곱하면 결과가 실제보다 좋게 나옵니다.
다른 하나는 청산입니다. 10배 격리라면 가격이 10% 가까이 반대로 가기 전에 포지션이 정리됩니다. 그런데 1열은 진입가와 청산가만 보니까, 중간에 청산선 아래로 내려갔다가 다시 올라와서 청산가가 멀쩡해 보이는 거래를 그대로 통과시킵니다. 이걸 잡으려면 보유 구간의 최저가(숏이면 최고가)를 한 칸 더 받아서 청산 가격과 비교하는 열이 필요합니다. 청산 가격 자체를 구하는 식은 청산가 계산기에 있습니다.
그래서 시트에는 레버리지 배수 대신 명목 금액 칸을 두고, 손익을 금액으로 한 번 더 계산하는 편이 낫습니다. 명목 금액 × 비용 뺀 비율이 그 거래의 USDT 손익입니다.
4열 — 누적은 더할지 곱할지부터 정합니다
거래별 값이 나왔으면 아래로 누적합니다. 여기서 계산기마다 방식이 갈립니다.
- 고정 금액 — 매번 같은 명목 금액으로 들어간다고 가정하면 손익을 그냥 더합니다.
- 계좌 비율 — 매번 계좌의 일정 비율로 들어간다고 가정하면 (1 + 비율)을 차례로 곱합니다.
둘은 같은 거래 목록에서도 다른 답을 냅니다. +10%와 −10% 두 건이면 더하기로는 0, 곱하기로는 1.1 × 0.9 = 0.99, 즉 −1%입니다. 건수가 많고 한 건의 크기가 클수록 둘의 간격이 벌어집니다. 계산기 결과를 남과 비교할 때 이 칸이 어느 쪽인지 모르면 비교가 성립하지 않습니다.
5열 — 최대 낙폭은 누적 열 옆에 두 열을 더 둡니다
최대 낙폭은 누적 곡선이 이전 최고점에서 얼마나 내려갔는지의 최댓값입니다. 스프레드시트로는 두 열이면 됩니다. 하나는 "지금까지의 최고 누적값"(위 칸과 현재 누적값 중 큰 쪽, 시작은 0), 다른 하나는 "현재 누적값 − 그 최고값"입니다. 이 열의 최솟값이 최대 낙폭입니다.
고정 금액 기준으로 여섯 건을 넣어 보면 이렇습니다.
| 순서 | 건별 | 누적 | 이전 최고 | 낙폭 |
|---|---|---|---|---|
| 1 | +3 | 3 | 3 | 0 |
| 2 | −2 | 1 | 3 | −2 |
| 3 | −4 | −3 | 3 | −6 |
| 4 | +1 | −2 | 3 | −5 |
| 5 | +5 | 3 | 3 | 0 |
| 6 | −3 | 0 | 3 | −3 |
최대 낙폭은 −6입니다. 같은 여섯 건을 −4, −3, −2, +1, +3, +5 순서로 바꿔 넣으면 마지막 누적값은 똑같이 0인데, 누적이 −4, −7, −9까지 내려가서 최대 낙폭은 −9가 됩니다. 합계는 순서와 상관이 없고 낙폭은 순서에 따라 달라집니다. 그래서 거래 목록을 종목별로 정렬해 놓고 계산하면 낙폭이 틀립니다. 반드시 청산 시각 순으로 정렬한 다음 누적해야 합니다.
거래 횟수가 비용을 곱합니다 — 신호 빈도로 본 규모
비용 열이 결과를 얼마나 흔드는지는 거래 횟수가 정합니다. 90일 기록의 조건별 건수로 대략의 규모를 잡아 보면 이렇습니다. 신호마다 한 번씩 왕복 0.10%를 낸다고 가정한 단순 곱셈입니다.
| 조건 | 90일 전체 | 394종목 평균 | 종목당 수수료 누계 |
|---|---|---|---|
| 5이평 다이버전스 | 23,543건 | 약 60건 | 약 6.0% |
| 10이평 다이버전스 | 10,727건 | 약 27건 | 약 2.7% |
| 삼박자 | 2,328건 | 약 6건 | 약 0.6% |
평균만 그런 것도 아닙니다. 5이평 다이버전스가 가장 많이 나온 KSM은 81건이라 같은 계산으로 8.1%, 삼박자가 가장 많이 나온 이더리움(ETH)·바이낸스코인(BNB)은 각 15건이라 1.5%입니다. 시간봉으로 보면 1시간봉 기록이 29,652건, 4시간봉이 6,946건으로 4.27배 차이가 납니다.
이 표가 말하는 건 어느 조건이 낫다는 게 아니라, 자주 드나드는 규칙일수록 계산기의 비용 칸 하나가 결과의 부호를 바꿀 수 있다는 점입니다. 비용 칸을 비워 둔 채 나온 숫자는 사실상 다른 질문에 대한 답입니다. 종목당 평균은 감시 목록 394종목으로 나눈 값이라, 90일을 다 채우지 못한 신규 상장 종목이 섞여 있다는 점은 감안해야 합니다.
결과를 읽기 전에 시트 맨 아래에 세 줄을 더 둡니다
계산이 끝나면 맨 아래에 누적값과 최대 낙폭이 남습니다. 그 숫자를 보기 전에 세 줄을 같이 띄워 두는 편이 안전합니다.
- 거래 건수 — 몇 건으로 나온 값인지. 20건짜리 결과와 2,000건짜리 결과는 같은 무게가 아닙니다. 표본이 어떻게 쪼개지는지는 백테스트 데이터 점검표에 있습니다.
- 비용 전과 후 — 두 줄을 나란히. 차이가 크면 결과는 규칙보다 체결 조건에 더 민감하다는 뜻입니다.
- 가장 큰 한 건을 뺀 값 — 한 건이 전체를 만들고 있는지 봅니다. 그 한 건을 빼서 부호가 바뀐다면 규칙보다 그 한 번의 움직임을 본 셈입니다.
웹 계산기를 쓸 때 확인할 칸 — 주식용 틀이 섞여 있습니다
검색하면 나오는 백테스트 계산기 상당수는 주식용으로 만들어졌습니다. 코인 무기한 선물 거래 목록을 그대로 넣으면 몇 군데가 어긋납니다.
- 하루의 경계 — 주식 계산기는 일봉 종가 기준으로 날짜를 자릅니다. 코인은 장이 안 닫혀서 하루가 어디서 끝나는지를 따로 정해야 하고, 바이낸스 일봉은 한국 시간 오전 9시에 닫힙니다(봉 마감 시간표).
- 펀딩비 칸 — 주식 계산기에는 없습니다. 오래 들고 있는 규칙일수록 이 칸이 빠진 영향이 큽니다.
- 숏 처리 — 공매도를 지원하지 않거나, 숏을 대차 비용이 붙는 주식 공매도로 계산하는 계산기가 있습니다.
- 청산 점검 — 레버리지 칸이 있어도 보유 중 최저가를 받지 않으면 청산을 못 잡습니다.
이 네 칸이 없는 계산기라면 결과를 내려받아 위 열들을 시트에서 직접 덧붙이는 편이 빠를 수 있습니다. 완벽한 계산기를 찾는 것보다, 지금 쓰는 계산기가 어느 칸을 비워 두고 있는지 아는 쪽이 현실적입니다.
처음 보는 말이 있으면 용어 사전에 다이버전스·펀딩비·미결제약정 등을 풀어 두었습니다.