시간 필터 하나가 두 전략에서 정반대로 갈렸다

시간 필터 하나가 두 전략에서 정반대로 갈렸다 — ICT Macro Time을 A/B로 나눠본 기록

미국주식 자동매매 봇 개발기 · 백테스트 검증 · 2026년 7월

지난 글에서 미래 정보가 새지 않는 백테스트 하네스를 만들었습니다. 신호는 오늘 종가까지만 쓰고 체결은 다음 날 시가에, 정수주와 현금 제약을 그대로 강제하고, 수수료는 실제 요율로 자산에서 직접 빼는 구조였습니다. 도구를 만들었으면 써봐야죠. 그래서 제 전략이 아니라 유튜브에서 배운 남의 룰을 그 하네스에 그대로 올려봤습니다.

결과가 예상 밖이었습니다. 그 룰의 핵심인 시간 필터가 원본 셋업에서는 수익을 3.72%p 끌어올렸는데, 똑같은 필터를 제 봇에 붙이자 오히려 성적이 나빠졌습니다. 같은 필터, 정반대 결과. 왜 그런지 끝까지 파고든 기록입니다.

📺 영상이 가르친 룰 — 겹친 두 개의 갭에서 들어간다

검증 대상은 한국어로 만들어진 ICT 매매법 입문 강의 1강입니다. ICT는 Inner Circle Trader의 약자로, 마이클 허들스턴이라는 트레이더가 정립한 시장 구조 분석 방식입니다. 기관의 주문 흐름을 유동성과 가격 비효율로 읽는다는 관점이죠.

영상의 핵심은 두 가지 개념 위에 서 있습니다.

▶ FVG (Fair Value Gap, 공정가치 갭)

연속된 세 개의 봉에서 첫 봉의 고점이 세 번째 봉의 저점보다 낮으면, 그 사이에 아무 거래도 일어나지 않은 빈 공간이 생깁니다. 가격이 너무 급하게 지나가면서 남긴 흔적이죠. 시장은 이 불균형을 싫어해서 언젠가 그 자리를 메우러 돌아온다고 봅니다.

▶ BPR (Balanced Price Range, 균형 가격대)

하락 방향 갭이 생긴 직후 상승 방향 갭이 생겨서, 두 갭의 가격대가 서로 겹치는 구간입니다. 영상의 표현을 빌리면 벽의 양쪽에 모두 페인트를 칠한 상태입니다. 한쪽만 칠했으면 반대편을 칠하러 다시 오지만, 양쪽이 다 칠해졌으니 그 구간 자체가 강한 지지선 또는 저항선이 된다는 논리입니다.

이 두 개를 엮은 진입 판단은 이렇게 흘러갑니다.

graphviz diagram

🔁 다이어그램 요약: 유동성이 한 번 쓸린 뒤 하락 갭과 상승 갭이 연달아 생기고 두 갭의 가격대가 겹치면 그 구간에서 진입하며, 겹치지 않으면 관망합니다. 목표가는 반대편 유동성입니다.

여기에 시간 조건이 하나 붙습니다

영상이 강조한 마지막 조건이 Macro Time입니다. 매시 50분부터 다음 시 10분까지, 20분짜리 창 안에서만 셋업을 찾으라는 겁니다. 기관 주문 집행이 이 구간에 몰리기 때문에 유동성 쓸림과 갭도 여기서 주로 생긴다는 논리입니다. 장중으로 한정하면 하루 일곱 번 정도 열립니다.

이건 영상이 만들어낸 개념이 아니라 ICT 계열에서 널리 공유되는 시간 구분입니다. 공개된 ICT 자료를 보면 뉴욕 오전장 매크로 구간을 09:50~10:10, 10:50~11:10 식으로 정의하고 있어서, 영상이 말한 창과 정확히 맞아떨어집니다.

코드로 옮기려니 비어 있는 칸이 보였다

사람이 차트를 보고 판단할 땐 문제가 안 되지만, 봇에 넣으려면 모든 조건이 숫자여야 합니다. 자막을 전부 뜯어보며 룰을 정리하다 보니 정량화되지 않은 칸이 여럿 남았습니다.

항목 영상이 말한 것 코드로 옮길 때 막히는 지점
손절 위치 전저점 · 갭 하단 · 봉 끝 중 자유 어느 걸 고르냐에 따라 결과 분포가 통째로 달라짐
“전저점”의 범위 직전 저점 몇 봉 전까지 거슬러 볼지 기준 없음
“빠른” 반등 10분도 안 걸렸다 봉 개수 기준인지 변동성 대비인지 불명
목표가 반대편의 쓸리지 않은 고점·저점 어디까지 거슬러 올라가 찾을지 기준 없음
종목 명시 없음 1분봉 환율과 5분봉 ETF는 완전히 다른 시장
자금 관리 1강에서는 다루지 않음 하루 몇 번, 얼마씩 넣을지 판단 불가

그래서 이 검증은 영상 룰의 완전한 재현이 아니라 이식입니다. 비어 있는 칸은 제 봇이 이미 쓰던 기준으로 채웠고, 손절은 갭 직전 봉의 저점으로 고정했습니다. 이 전제를 먼저 밝혀두는 이유는, 아래 숫자가 영상의 성적표가 아니라 “제가 이해한 대로 옮겼을 때의 성적표”이기 때문입니다.

📊 60일 TQQQ에 올려보니 승률 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건 — 목표가 도달

승률 94.9%의 실체는 이겼다고 기록된 36건이 사실상 무승부였다는 뜻입니다. 이건 이 전략만의 문제가 아니라 본전 손절을 쓰는 시스템 전반에서 알려진 현상입니다. 손절선을 일찍 본전으로 당기면 승률 숫자는 올라가지만 이긴 거래의 평균 크기가 같이 줄어들어, 승률과 평균 수익을 곱해 만드는 기대값은 오히려 나빠집니다.

🟡 여기서 얻은 규칙 — 승률은 전략을 고를 때 가장 먼저 보게 되는 숫자지만, 가장 쉽게 부풀려지는 숫자이기도 합니다. 승률을 볼 땐 이긴 거래의 평균 크기를 반드시 같이 봐야 합니다. 이 백테스트에서 거래당 위험 대비 수익은 +0.60에 그쳤고, 그 정도로는 왕복 0.5%의 수수료를 겨우 상쇄하는 수준이었습니다.

⏰ 시간 필터만 떼어내니 수익이 3.72%p 갈렸다

실질 수익은 미미했지만, 한 가지는 분명하게 드러났습니다. 다른 조건을 전부 고정하고 Macro Time 조건만 켜고 껐을 때의 차이입니다.

60일 수익률

시간필터 켬
+0.64%
시간필터 끔
−3.08%

최대낙폭

시간필터 켬
−3.15%
시간필터 끔
−6.71%

매매 횟수를 54건에서 39건으로 28% 줄이면서 수익은 3.72%p 올라가고 낙폭은 3.56%p 줄었습니다. 걸러낸 15건이 평균적으로 손실이었다는 뜻이죠. 영상이 이 조건을 강조한 데는 근거가 있었습니다.

여기서 욕심이 생겼습니다. 그럼 이 필터를 내 봇에도 붙이면 되지 않나?

🔬 진입 시간만 바꿔서 A/B로 갈랐다

제 봇은 영상과 다른 셋업을 씁니다. 장 시작 후 첫 15분에 만들어진 고점과 저점을 기준선으로 잡고, 그 선을 돌파한 뒤 갭으로 되돌아올 때 들어가는 방식입니다. 진입 가능 시간은 09:45~10:55 한 구간뿐입니다.

비교를 깨끗하게 하려고 원칙을 하나 세웠습니다. 진입 시간 창을 제외한 모든 것을 그대로 둔다. 실제 운영 코드와 설정 파일은 한 줄도 건드리지 않고, 기존 룰 함수를 그대로 불러다 시간 조건만 인자로 뺀 별도 스크립트를 새로 만들었습니다.

그룹 진입 가능 시간
A · 현재 운영값 09:45~10:55 (한 구간)
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%에서 벗어나지 못했습니다.

늘어난 신호는 전부 점심 이후에 나왔다

숫자만 보면 “표본 두 건 차이”로 넘어갈 수 있습니다. 그래서 어떤 거래가 들어오고 빠졌는지 날짜별로 펼쳐봤습니다. 여기서 구조가 보였습니다.

매매일 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 셋업 제 봇의 돌파 셋업
신호 발생 시각 하루 종일 고르게 장 초반에 몰림
시간 필터의 역할 좋은 시간대를 골라냄 이미 지나간 시간대를 덧붙임
측정된 효과 +3.72%p −0.01%p

BPR은 겹친 갭만 있으면 언제든 생깁니다. 시간과 무관하게 후보가 널려 있으니, 시간 필터가 그중 좋은 것만 골라내는 체 역할을 합니다. 반면 제 봇의 트리거는 장 시작 15분 동안 만들어진 기준선의 돌파입니다. 그 돌파는 대부분 오전에 한 번 일어나고 끝납니다. 오후까지 남아 있는 돌파는 이미 오전에 힘이 빠진 뒤의 뒷북에 가깝고, 시간 창을 넓히면 그 뒷북만 새로 들어옵니다.

💼 가져갈 원칙 — 다른 전략에서 효과가 검증된 필터라도 그 전략의 신호 분포와 세트로만 유효합니다. 필터만 떼어다 붙이는 건 성립하지 않습니다. 붙이기 전에 물어야 할 질문은 “이 필터가 좋은가”가 아니라 “내 신호는 언제 생기는가”입니다.

⚖️ 이 숫자를 어디까지 믿을 수 있나

여기까지 쓰고 나면 스스로 검열해야 하는 대목이 있습니다. 표본이 너무 적습니다. 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 셋업 자체를 별도 옵션으로 넣는 건 여전히 후보로 열어뒀습니다. 다만 시간 필터와 세트로만 검토하기로 했습니다. 둘은 분리해서 가져올 수 있는 물건이 아니라는 걸 이번에 확인했으니까요.

마지막으로, 이 검증의 출발점이 된 영상에 대해 덧붙이자면 — 영상 자체는 개념을 성실하게 풀어낸 교육 자료이지 수익을 보장하는 자료가 아닙니다. 강의 안에서도 저자가 직접 “백테스팅 꼭 해보세요”라고 말합니다. 이 글은 그 권유를 실제로 실행해본 기록이고, 나온 숫자는 영상의 성적표가 아니라 제 이식본의 성적표입니다. 이 구분이 이 글에서 가장 중요한 부분일지도 모르겠습니다.

📌 세 줄 정리

✓ 승률 94.9%처럼 보이던 룰은 39건 중 36건이 본전 청산이었습니다. 승률은 이긴 거래의 크기와 함께 봐야 합니다.

✓ 같은 시간 필터가 한쪽에서는 +3.72%p, 다른 쪽에서는 −0.01%p였습니다. 필터는 신호 분포와 세트로만 유효합니다.

✓ 표본 3~5건으로는 크기를 말할 수 없지만, 추가 신호가 전부 오후에 몰린 분포는 표본과 무관한 구조입니다. 무엇을 말할 수 있고 무엇을 말할 수 없는지 나누는 게 검증의 절반입니다.

🔗 참고 자료

• ICT Macro Times 시간 구분 정의 — innercircletrader.org, ictkillzone.com

• 승률·손익비·기대값의 관계 — tradingstats.net, journalplus.co

• 백테스트 표본 크기 기준 — backtestbase.com

본 글의 수치는 60일 구간 백테스트 결과이며, 표본 수가 적어 통계적 유의성을 주장하지 않습니다. 과거 성과는 미래 수익을 보장하지 않습니다. 본 콘텐츠는 자동매매 시스템 개발 과정의 기록으로 정보 제공을 목적으로 하며, 특정 종목이나 전략의 매수·매도를 권유하지 않습니다. 레버리지 ETF는 변동성 손실로 장기 보유 시 기초지수 대비 성과가 크게 달라질 수 있습니다. 모든 투자 판단과 그 결과에 대한 책임은 투자자 본인에게 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤