서론: 눈으로는 쉬운데 코드로는 어려운 도형

직사각형 패턴은 차트 패턴 중에서 가장 설명하기 쉽다. 가격이 위쪽 선에 닿았다가 내려오고, 아래쪽 선에 닿았다가 올라오기를 되풀이한다. 두 선이 거의 수평이라 박스처럼 보인다. 그러다 어느 쪽으로든 박스를 뚫고 나가면 그 방향으로 움직임이 이어진다고 본다. 여기까지는 초등학생에게도 설명할 수 있다.

문제는 이걸 봇에 넣으려는 순간 시작된다. 사람은 차트를 보고 “저기 박스네” 하고 넘어간다. 코드는 “저기"가 어디인지, “거의 수평"이 몇 도까지인지, “닿았다"가 꼬리인지 종가인지를 전부 숫자로 받아야 한다. 이번 편은 그 숫자들을 하나씩 꺼내 보는 글이다.

먼저 성격부터 밝힌다. 이번 편은 시세를 받아 성과를 검증한 글이 아니라 규칙 자체를 해부한 글이다. 승률도 수익률도 적지 않았다. 재 본 적이 없는 숫자를 쓸 수는 없어서다. 그림도 전부 손으로 만든 값으로 그렸고, 실제 시세가 아니라 규칙을 설명하기 위한 모식도다. 그림 안에도 모식도라고 적어 두었다.

무대는 폴카닷(DOT)으로 잡았다. 폴카닷을 분석하려는 게 아니다. 가격을 보지 않았으니 폴카닷의 성과는 말할 수 없다. 다만 이 코인이 어떤 성격의 자산인지 놓고, 직사각형이라는 규칙이 어울릴지는 따져볼 수 있다. 그건 뒤에서 한다.

본론 1: 직사각형은 무엇을 재는가

이 패턴이 재는 것은 균형이다. 위쪽 선 근처에서는 파는 쪽이 이기고, 아래쪽 선 근처에서는 사는 쪽이 이긴다. 양쪽 힘이 팽팽해서 한동안 가격이 갇혀 있다. 이 팽팽함이 깨지면 쌓여 있던 쪽으로 한꺼번에 쏠린다는 것이 패턴 이론의 가정이다.

직사각형 패턴의 해부

이 그림은 실제 시세가 아니라 규칙을 설명하기 위한 모식도다. 구성 요소는 네 가지다.

  • 저항선(상단): 고점들이 모여서 이루는 수평선. 최소 두 번은 닿아야 선으로 인정한다.
  • 지지선(하단): 저점들이 모여서 이루는 수평선. 마찬가지로 최소 두 번.
  • 박스 폭: 상단에서 하단을 뺀 높이. 돌파 뒤 움직임을 가늠할 때 “박스 높이만큼"이라는 말이 여기서 나온다.
  • 돌파봉: 박스 밖에서 마감하는 첫 번째 봉.

여기서 이미 “두 번"이라는 숫자가 튀어나온다. 이 숫자는 정의가 아니라 관습이다. 두 번이면 아무 두 점이나 이으면 선이 되니 세 번 이상을 요구하자는 사람도 있다. 그러면 박스가 훨씬 드물게 잡힌다. 어느 쪽이 맞는지는 시세를 돌려 봐야 아는데, 이번 편은 돌려 보지 않았으니 결론을 내지 않는다.

눈과 규칙의 차이

사람은 박스를 볼 때 몇 가지를 무의식적으로 한다. 튀어나온 꼬리 하나쯤은 무시한다. 선이 약간 기울어도 수평으로 받아 준다. 박스의 시작과 끝을 직관으로 정한다. 코드는 이 셋을 모두 숫자로 바꿔야 한다.

  1. 터치 허용폭: 고점이 상단선에서 얼마나 떨어져도 “닿았다"고 칠 것인가.
  2. 기울기 허용치: 두 선이 얼마까지 기울어도 “수평"으로 칠 것인가.
  3. 최소 길이: 박스가 몇 봉 이상 이어져야 하는가.

세 개 모두 사람 마음대로 정하는 값이고, 값을 바꾸면 같은 차트에서 박스가 생기기도 하고 사라지기도 한다. 이게 자동 검출이 어려운 핵심 이유다.

본론 2: 어떻게 계산하는가

직사각형은 지표처럼 하나의 수식으로 떨어지지 않는다. 대신 조건문의 묶음이다. 내가 쓴다면 이런 골격이 된다.

상단 = 최근 N봉 고점 중 상위 군집의 평균
하단 = 최근 N봉 저점 중 하위 군집의 평균
폭   = 상단 - 하단

조건 A: 상단 근처(± 허용폭)에 닿은 봉이 2개 이상
조건 B: 하단 근처(± 허용폭)에 닿은 봉이 2개 이상
조건 C: 폭이 변동성(ATR)의 일정 배수 이내
조건 D: 종가가 상단 위에서 마감 → 상방 돌파 신호

한 줄씩 뜯어 본다.

상단·하단을 어떻게 구하나. 최댓값을 그대로 쓰면 꼬리 하나가 선 전체를 끌어올린다. 그래서 고점들을 군집으로 묶어서 평균을 내거나, 상위 몇 개의 중앙값을 쓰는 식으로 둔다. 어느 쪽이든 선택지가 갈리는 지점이다.

터치는 꼬리인가 종가인가. 이 선택이 결과를 가장 크게 바꾼다.

터치 정의에 따른 차이

모식도다. 같은 봉 배열인데 꼬리 기준이면 터치가 두 번 잡히고, 종가 기준이면 한 번도 안 잡힌다. 꼬리 기준은 박스가 많이 잡히지만 순간적인 튐에 속는다. 종가 기준은 보수적이지만 박스가 늦게 인정된다. 정답이 있는 문제가 아니라서, 둘 중 무엇을 택했는지 글이나 코드에 남겨 두는 편이 낫다.

폭을 왜 변동성과 비교하나. 폭이 너무 넓으면 그건 박스가 아니라 그냥 큰 변동 구간이다. 반대로 너무 좁으면 노이즈 속 잔물결이다. 평균 실제 범위(ATR, 최근 봉들의 변동 폭 평균)와 견주면 자산이 바뀌어도 같은 기준을 쓸 수 있다. ATR의 기본 기간은 보통 14로 두는데, 이건 트레이딩뷰 기본 설정이고 시세와 무관한 정의값이다. 이 14가 최적이라는 뜻은 아니다.

파라미터를 바꾸면 어떻게 되나

허용폭을 바꿨을 때

모식도다. 같은 봉 열인데 허용폭이 좁으면 상단이 안 잡히고, 넓으면 박스가 잡힌다. 대신 넓게 잡은 박스는 두껍다. 두꺼운 박스는 돌파 기준선도 높아진다. 허용폭을 키우면 신호가 늘고, 늘어난 신호는 질이 떨어진다는 흔한 교환이 여기서도 벌어진다. 얼마나 떨어지는지는 재지 않았으니 모른다.

이 지점이 과최적화의 입구다. 파라미터가 세 개 이상이고 모두 연속값이면, 과거 차트에 맞는 조합은 반드시 존재한다. 바입다운처럼 파라미터 없는 규칙과 달리 직사각형은 처음부터 이 위험을 안고 있다.

본론 3: 무엇을 못 보는가

직사각형이 알려주지 못하는 것을 정리한다.

방향. 박스는 균형을 말할 뿐 어느 쪽으로 깨질지는 말하지 않는다. 그래서 규칙은 양쪽 돌파를 다 기다리거나, 직전 추세 방향으로 깨질 확률이 높다는 가정을 얹는다. 그 가정이 맞는지는 이번 편에서 확인하지 않았다.

가짜 돌파. 상단을 꼬리로만 넘었다가 돌아오는 경우다.

돌파와 가짜 돌파

모식도다. 왼쪽은 종가가 상단 위에서 마감해 신호가 난다. 오른쪽은 꼬리만 넘고 종가는 박스 안이라 신호가 안 난다. 종가 확정을 요구하면 오른쪽을 걸러내지만, 대신 왼쪽의 진입도 한 봉 늦어진다. 걸러냄과 늦음은 같은 값의 양면이다.

박스의 끝. 사람은 박스가 끝나는 시점을 사후에 안다. 실시간으로는 지금 박스 안인지, 박스가 이미 깨진 건지 구분이 안 된다. 돌파봉이 나오고서야 박스였다고 확정되니, 박스를 확신하고 들어가는 진입은 원리상 불가능하다.

청산. 패턴 이론은 진입 위치와 대략의 목표만 말한다. 손절을 박스 안쪽 어디에 둘지, 돌파 후 되돌림을 어떻게 볼지는 규칙에 없다. 청산 규칙이 비어 있으면 진입 신호만 있는 반쪽짜리 전략이다. 내가 봇에 넣는다면 청산은 별도로 설계해야 한다.

본론 4: 코인 시장의 함정

이 부분이 주식판과 가장 다르다.

일봉 경계가 거래소 설정값이다. 24시간 거래되는 시장이라 하루의 끝이 따로 없다. 국내 거래소는 KST 자정에, 해외 거래소는 UTC 자정에 일봉을 자른다. 아홉 시간 차이다. 직사각형은 “종가가 상단 위"를 요구하는데, 종가를 몇 시 기준으로 잡느냐에 따라 같은 날이 돌파가 되기도 하고 아니기도 하다. 박스 가장자리에서 맴도는 날이라면 특히 그렇다. 그래서 어느 거래소 일봉으로 만든 규칙인지 명시해야 하고, 다른 거래소 데이터로 돌릴 때는 신호 자체가 달라질 수 있다.

갭이 드물다. 주식은 장이 닫혔다 열리면서 박스를 단번에 뛰어넘는 갭이 생긴다. 코인은 닫히지 않으니 갭이 드물다. 돌파가 연속된 봉으로 이어지는 만큼 종가 확정 규칙이 덜 불리하다. 이건 코인에서 유리한 점이다.

현물에는 공매도가 없다. 직사각형은 하방 돌파도 신호다. 하지만 현물 계좌로는 하방 돌파에 숏을 칠 수 없다. 하단을 뚫으면 보유 중이던 걸 정리하는 신호로는 쓸 수 있어도 진입 신호로는 못 쓴다. 규칙이 대칭이어도 내 봇은 비대칭으로 쓰게 된다.

본론 5: 폴카닷을 무대에 세우면

폴카닷은 여러 체인을 하나의 중앙 체인에 묶는 구조를 내세운 레이어1 계열 코인이다. 이런 자산은 차트만으로는 보이지 않는 네트워크 쪽 사정이 있다. 스테이킹 참여나 개발 활동 같은 것들이다. 직사각형은 차트만 보는 규칙이라 그런 변화를 알아채지 못한다. 균형이 깨지는 진짜 원인이 차트 밖에 있다면, 박스 돌파는 결과를 뒤늦게 확인하는 도구일 뿐이다.

또 하나. 한 번 크게 움직인 뒤 오랜 기간 좁은 구간에서 머무는 자산이라면 직사각형이 자주 잡힐 것이고, 그건 규칙에는 호재다. 다만 폴카닷이 실제로 그런 성격인지는 가격을 안 봤으므로 단정하지 않는다. 확실한 사실만 쓰기로 했기 때문에 여기까지만 쓴다.

결론: 봇에 넣을 것인가

넣지 않기로 했다. 이유를 남겨 둔다.

  1. 파라미터가 세 개 이상이고 전부 사람이 정하는 값이다. 시세로 검증하기 전에는 어떤 값도 근거가 없다.
  2. 박스는 사후에 확정된다. 실시간 신호로 쓰려면 돌파봉 종가라는 지연을 받아들여야 한다.
  3. 청산 규칙이 비어 있다. 진입만 있는 규칙을 봇에 올리면 나머지는 내가 임의로 채우게 된다.
  4. 일봉 경계 문제로 거래소를 바꾸면 신호가 달라진다.

내 봇의 게이트는 “재현 가능한 숫자로 정의돼 있고, 검증 가능하며, 청산까지 닫혀 있을 것"이다. 직사각형은 지금 형태로는 세 가지 중 하나도 온전히 통과하지 못한다. 그렇다고 영영 버리는 건 아니다. 터치를 종가 기준으로 고정하고, 폭을 ATR 배수로 제한하고, 청산을 따로 붙인 형태를 정의한 다음에야 시세로 검증할 자격이 생긴다. 그건 다음에 다시 판단할 일이다.

다시 말하지만 이번 편은 시세를 받아 성과를 검증한 글이 아니라 규칙 자체를 해부한 글이다. 승률을 적지 않은 이유도 그래서다. 이 글은 투자 권유가 아니다.

약어 풀이

  • DOT (Polkadot) — 폴카닷의 심볼.
  • ATR (Average True Range) — 평균 실제 범위. 최근 봉들의 변동 폭 평균으로 변동성 크기를 재는 지표.
  • KST (Korea Standard Time) — 한국 표준시. 국내 거래소는 이 자정에 일봉을 자른다.
  • UTC (Coordinated Universal Time) — 협정 세계시. 해외 거래소는 이 자정에 일봉을 자른다.