지난 편에서 미래 정보가 새지 않는 백테스트 하네스를 만들었다. 도구를 만들었으니 써 봐야 했다. 그래서 내 전략이 아니라 유튜브에서 배운 남의 룰을 그 하네스에 그대로 올려 봤다.
결과는 예상 밖이었다. 그 룰의 핵심인 시간 필터가 원래 셋업에서는 수익을 3.72%p 끌어올렸는데, 똑같은 필터를 내 봇에 붙이자 성적이 오히려 나빠졌다. 왜 그렇게 됐는지 끝까지 따라가 본 기록이다.
벽 양쪽에 페인트를 칠한 자리에서 들어간다
검증 대상은 한국어로 만든 ICT 매매법 입문 강의의 1강이다. ICT는 Inner Circle Trader의 약자로, 마이클 허들스턴이라는 트레이더가 정립한 시장 구조 분석 방식이다. 기관의 주문 흐름을 유동성과 가격 비효율로 읽는다.
영상은 두 개념 위에 서 있다. 하나는 FVG(Fair Value Gap, 공정가치 갭)다. 연속된 세 봉에서 첫 봉의 고점이 세 번째 봉의 저점보다 낮으면, 그 사이에 아무 거래도 없었던 빈 공간이 생긴다. 가격이 너무 급하게 지나간 흔적이라, 시장이 언젠가 그 자리를 메우러 돌아온다고 본다.
다른 하나는 BPR(Balanced Price Range, 균형 가격대)이다. 하락 방향 갭이 생긴 직후 상승 방향 갭이 생겨서 두 갭의 가격대가 서로 겹치는 구간을 말한다. 영상은 이걸 벽의 양쪽에 모두 페인트를 칠한 상태에 비유했다. 한쪽만 칠했으면 반대편을 칠하러 다시 오지만, 양쪽이 다 칠해졌으니 그 구간 자체가 강한 지지선이나 저항선이 된다는 논리다.

유동성이 한 번 쓸린 뒤 하락 갭과 상승 갭이 연달아 생기고 둘이 겹치면 그 구간에서 들어가고, 겹치지 않으면 관망한다. 목표가는 반대편 유동성이다.
마지막 조건이 Macro Time이다. 매시 50분부터 다음 시 10분까지, 20분짜리 창 안에서만 셋업을 찾으라는 것이다. 기관 주문 집행이 이 구간에 몰리니 유동성 쓸림과 갭도 여기서 주로 생긴다는 설명이고, 장중으로 한정하면 하루 일곱 번 정도 열린다. 영상이 만든 개념은 아니고 ICT 계열에서 널리 쓰는 시간 구분이다. 공개된 ICT 자료도 뉴욕 오전장 매크로 구간을 09:50~10:10, 10:50~11:10 식으로 정의하고 있어서 영상이 말한 창과 정확히 맞는다.
자막을 뜯어보니 숫자가 비어 있었다
봇에 넣으려면 모든 조건이 숫자여야 한다. 자막을 전부 뜯어보며 룰을 정리했더니 정량화되지 않은 칸이 여럿 남았다.
| 항목 | 영상이 말한 것 | 코드로 옮길 때 막히는 지점 |
|---|---|---|
| 손절 위치 | 전저점 · 갭 하단 · 봉 끝 중 자유 | 어느 걸 고르냐에 따라 결과 분포가 통째로 달라짐 |
| “전저점”의 범위 | 직전 저점 | 몇 봉 전까지 거슬러 볼지 기준 없음 |
| “빠른” 반등 | 10분도 안 걸렸다 | 봉 개수 기준인지 변동성 대비인지 불명 |
| 목표가 | 반대편의 쓸리지 않은 고점·저점 | 어디까지 거슬러 올라가 찾을지 기준 없음 |
| 종목 | 명시 없음 | 1분봉 환율과 5분봉 ETF는 완전히 다른 시장 |
| 자금 관리 | 1강에서는 다루지 않음 | 하루 몇 번, 얼마씩 넣을지 판단 불가 |
그래서 이 검증은 영상 룰을 완전히 재현했다기보다 옮겨 심은 것에 가깝다. 비어 있는 칸은 내 봇이 이미 쓰던 기준으로 채웠고, 손절은 갭 직전 봉의 저점으로 고정했다. 아래 숫자는 영상의 성적표라기보다 내가 이해한 대로 옮겼을 때의 성적표다.
TQQQ 60일에서 나온 승률 94.9%
TQQQ 5분봉 60일 구간에서 돌렸다. 비용은 내 봇이 실제로 내는 조건 그대로, 매수와 매도 각각 수수료 0.25%에 슬리피지 0.05~0.10%를 넣었다. 룰의 어느 부분이 성적을 만드는지 보려고 네 가지 변형을 만들어 비교했다.
| 변형 | 매매 | 승률 | 60일 수익 | 최대낙폭 |
|---|---|---|---|---|
| BPR + 시간필터 (영상에 가장 가까움) | 39 | 94.9% | +0.64% | −3.15% |
| BPR만 (시간필터 제거) | 54 | 92.6% | −3.08% | −6.71% |
| BPR + 시간필터, 목표 축소 | 39 | 94.9% | +0.46% | −3.15% |
| BPR + 시간필터, 되돌림 대기 후 진입 | 31 | 90.3% | −3.54% | −3.54% |
같은 기간 내 봇의 기본 설정은 매매 3건에 수익 −0.01%였다. 겉으로만 보면 영상 룰이 매매 빈도는 13배이고 수익도 앞선다. 여기서 멈췄다면 나는 봇을 갈아엎었을 것이다.
39건 가운데 36건이 본전 청산이었다
승률 94.9%가 이상해서 39건을 한 건씩 열어 봤다. 원인은 손절선을 본전으로 옮기는 규칙이었다. 오전 11시가 되면 손절선을 진입가로 끌어올리는데, 그 뒤 가격이 조금만 밀려도 진입가 근처에서 청산된다. 39건 중 36건이 이런 본전 청산이었고, 위험 대비 수익은 양수로 기록되지만 실제 손익은 수수료 때문에 −$0.03이었다. 본전 이동 전에 진짜 손절로 끝난 것이 2건(−$21.61, −$26.74), 목표가에 닿은 것은 1건뿐이었다.
이긴 걸로 기록된 36건이 사실상 무승부였던 셈이다. 손절선을 일찍 본전으로 당기면 승률은 올라가지만 이긴 거래의 평균 크기가 같이 줄어서, 승률과 평균 수익을 곱해 만드는 기대값은 오히려 나빠진다. 이 백테스트의 거래당 위험 대비 수익은 +0.60이었고, 그 정도로는 왕복 0.5% 수수료를 겨우 상쇄할 뿐이었다. 승률은 가장 쉽게 부풀려지는 숫자라서 이긴 거래의 평균 크기와 같이 봐야 한다.
Macro Time 하나만 켜고 꺼 봤다
실질 수익은 미미했지만 한 가지는 분명하게 드러났다. 다른 조건을 전부 고정하고 Macro Time 조건만 켜고 껐을 때의 차이로, 앞 표의 첫 두 줄이 그것이다. 매매를 54건에서 39건으로 28% 줄이면서 수익은 3.72%p 올라가고 낙폭은 3.56%p 줄었다. 걸러낸 15건이 평균적으로 손실이었다는 얘기다. 영상이 이 조건을 강조한 데는 근거가 있었다.
여기서 욕심이 생겼다. 이 필터를 내 봇에도 붙이면 되지 않을까.
진입 시간 창만 바꾼 A/B
내 봇은 영상과 다른 셋업을 쓴다. 장 시작 후 첫 15분에 만들어진 고점과 저점을 기준선으로 잡고, 그 선을 돌파한 뒤 갭으로 되돌아올 때 들어간다. 진입 가능 시간은 09:45~10:55 한 구간뿐이다.
비교를 깨끗하게 하려고 진입 시간 창 말고는 아무것도 바꾸지 않았다. 운영 코드와 설정 파일은 그대로 두고, 기존 룰 함수를 불러다 시간 조건만 인자로 뺀 스크립트를 따로 만들었다. A 그룹은 지금 운영값 그대로이고, B 그룹은 영상의 시간 창인 09:50~10:10, 10:50~11:10, 11:50~12:10, 12:50~13:10, 13:50~14:10, 14:50~15:10 여섯 구간이다.
A 그룹을 돌린 결과는 기존 백테스트 수치와 소수점까지 일치했다. 새 스크립트가 원래 룰을 그대로 재현하니, A와 B의 차이는 온전히 시간 창에서 나온 것이다.
| 설정 | 매매 | 승/패/무 | 수익 |
|---|---|---|---|
| A · 현재 시간창 | 3 | 0 / 3 / 0 | −0.01% |
| A · 현재 시간창 + 분할익절 (실제 운영값) | 3 | 0 / 2 / 1 | +0.14% |
| B · 영상 시간창 | 5 | 0 / 5 / 0 | −0.02% |
| B · 영상 시간창 + 분할익절 | 5 | 0 / 5 / 0 | −0.02% |
시간 창을 넓히자 매매는 3건에서 5건으로 늘었는데 성적은 −0.01%에서 −0.02%로 나빠졌다. 영상 셋업에서 3.72%p를 벌어다 준 필터가 여기서는 거꾸로 작동한 것이다. 목표가를 바꾸거나 분할익절을 켜 봐도 B 그룹은 네 가지 조합 모두 −0.02%를 벗어나지 못했다.
B가 새로 잡은 세 건은 전부 점심 무렵 이후였다
표본 두 건 차이로 넘길 수도 있었지만, 어떤 거래가 들어오고 빠졌는지 날짜별로 펼쳐 봤더니 구조가 보였다.
| 매매일 | A | B | 진입 시각 | 비고 |
|---|---|---|---|---|
| 02-27 | 진입 | 진입 | 12:20 | 공통 |
| 04-29 | 진입 | – | 10:00 | B가 놓침. 창이 09:50부터라 초반 돌파 배제 |
| 05-13 | 진입 | 진입 | 11:10 | 공통 |
| 03-03 | – | 진입 | 13:10 | B가 추가 |
| 03-19 | – | 진입 | 12:15 | B가 추가 |
| 04-16 | – | 진입 | 11:25 | B가 추가 |
B가 새로 잡은 세 건의 진입 시각은 11:25, 12:15, 13:10으로 전부 점심 무렵 이후다. 반대로 B는 A가 잡았던 10:00 진입을 놓쳤다. 영상 시간 창이 09:50부터 열리는 바람에 장 초반 돌파가 걸러진 것이다.
하루 종일 생기는 BPR, 장 초반에 몰리는 돌파
두 결과를 나란히 놓으니 모순이 풀렸다. 같은 필터가 정반대로 작동한 건 두 전략이 신호를 만드는 방식이 달라서다.
| 구분 | 영상의 BPR 셋업 | 내 봇의 돌파 셋업 |
|---|---|---|
| 신호 발생 시각 | 하루 종일 고르게 | 장 초반에 몰림 |
| 시간 필터의 역할 | 좋은 시간대를 골라냄 | 이미 지나간 시간대를 덧붙임 |
| 측정된 효과 | +3.72%p | −0.01%p |
BPR은 겹친 갭만 있으면 언제든 생긴다. 시간과 상관없이 후보가 널려 있으니 시간 필터가 그중 좋은 것만 골라내는 체 노릇을 한다. 반면 내 봇의 트리거는 장 시작 15분 동안 만들어진 기준선의 돌파이고, 그 돌파는 대부분 오전에 한 번 일어나고 끝난다. 오후까지 남아 있는 돌파는 오전에 이미 힘이 빠진 뒤의 뒷북에 가깝고, 시간 창을 넓히면 그 뒷북만 새로 들어온다.
다른 전략에서 효과가 검증된 필터라도 그 전략의 신호 분포와 한 세트일 때만 유효하다. 필터만 떼어다 붙이기 전에 먼저 따져야 할 건 필터가 좋은지보다 내 신호가 언제 생기는지다.
3건과 5건으로 말할 수 있는 것
걸리는 건 표본이다. A 3건, B 5건으로는 통계로 말할 수 있는 게 사실상 없다. 백테스트 표본 크기에 관한 통설을 보면, 평균의 분포가 정규분포에 가까워지기 시작하는 최소선이 30건이고, 지표를 믿으려면 100건 이상, 기관 수준의 검증은 여러 시장 국면에 걸친 200~500건이다. 거래가 짧은 기간에 몰려 있으면 비슷한 시장 환경을 공유하니 실질 표본은 숫자보다 더 적다.
한계는 더 있다. 영상은 1분봉을 쓰는데 나는 데이터를 구하지 못해 5분봉에 개념만 옮겼고, 종목이 명시되지 않았으니 3배 레버리지 ETF가 원래 의도한 시장이 아닐 수도 있다. 60일 구간 하나라 다른 국면에서는 뒤집힐 수 있고, 내 기준으로 채운 룰이 저자의 의도와 다를 수도 있다.
그래도 결론을 유지하는 이유가 하나 있다. −0.01% 대 −0.02%라는 크기는 표본이 적어서 의미가 없지만, B가 추가한 세 건이 예외 없이 점심 이후였다는 분포는 표본 수와 상관없는 구조적 패턴이다. 기준선 돌파가 오전에 몰리는 건 룰 자체에서 나오는 성질이라 표본을 늘려도 방향은 바뀌지 않을 거라고 본다.
봇에는 아무것도 바꾸지 않았다
시간 창은 09:45~10:55 그대로, 분할익절도 그대로 뒀다. A/B에서 수익이 양수였던 조합은 지금 돌아가고 있는 설정 하나뿐이었다.
며칠을 들여 아무것도 바꾸지 않기로 한 셈인데 손해라고 생각하지 않는다. 이 검증을 안 했다면 영상에서 +3.7%p 효과가 확인된 필터라는 이유로 그냥 붙이고, 오후 뒷북 신호가 계좌를 갉아먹는 동안 이유도 모른 채 파라미터만 만지고 있었을 것이다.
하나는 남겨 뒀다. 영상의 BPR 셋업 자체를 별도 옵션으로 넣는 건 여전히 후보다. 다만 시간 필터와 한 세트로만 검토하기로 했다. 이번에 둘을 따로 떼어 가져올 수 없다는 걸 확인했기 때문이다.
영상은 개념을 성실하게 풀어낸 교육 자료이고, 강의 안에서도 저자가 직접 “백테스팅 꼭 해보세요”라고 말한다. 이 글은 그 권유를 실제로 해 본 기록이고, 여기 나온 숫자는 영상의 성적이 아니라 내 이식본의 성적이다.
이 글의 수치는 60일 구간 백테스트 결과이고 표본이 적어 통계적 유의성을 주장하지 않으며, 특정 종목이나 전략의 매매를 권하는 글이 아니다. 레버리지 ETF는 변동성 손실 때문에 오래 들고 있으면 기초지수와 성과가 크게 달라질 수 있다.
참고한 자료: ICT Macro Times 시간 구분 정의 (innercircletrader.org), ictkillzone.com, 승률·손익비·기대값의 관계 (tradingstats.net), journalplus.co, 백테스트 표본 크기 기준 (backtestbase.com)