서론: 두 개의 봉으로 바닥을 말하는 패턴

이번 편은 시세를 받아 성과를 검증한 글이 아니라 규칙 자체를 해부한 글이다. 승률을 적지 않은 이유도 그래서다. 비트코인은 사고 실험의 무대일 뿐이고, 가격은 한 번도 조회하지 않았다. 아래 그림도 전부 규칙을 설명하려고 손으로 만든 모식도다. 실제 시세가 아니라 규칙을 설명하기 위한 모식도라는 점을 먼저 밝혀 둔다.

오늘 볼 스크립트는 트레이딩뷰에 있는 캔들 패턴 중 하나, 도지 스타 강세(Doji Star - Bullish)다. 이름만 들으면 거창한데 규칙은 봉 두 개가 전부다. 하락 중에 긴 음봉이 나오고, 바로 다음 봉이 아래로 벌어져서 도지로 끝나면 “매도세가 힘을 잃었다"고 읽는다. 사람 눈에는 직관적이다. 그런데 봇은 눈이 없다. 조건문으로 옮기는 순간 “벌어져서"가 무슨 뜻인지, “도지"가 어디까지인지, “하락 중"이 무엇인지를 전부 숫자로 정해야 한다.

내가 이걸 보는 이유는 단순하다. 캔들 패턴은 지표 계산 없이 OHLC 네 값만 있으면 되니 구현이 가볍다. 그래서 더더욱 “정말 비트코인 같은 시장에서 성립하는 조건인가"를 먼저 따져야 한다. 성립하지 않는 조건을 가볍게 구현하면, 신호가 안 나거나 엉뚱한 곳에서 난다.

본론 1: 무엇을 재는가

캔들 패턴이 재는 것은 가격 수준이 아니라 봉의 모양과 봉 사이의 관계다. 도지 스타 강세가 가정하는 이야기는 이렇다.

  1. 하락 추세에서 매도세가 강하게 밀어 긴 음봉이 만들어진다.
  2. 다음 봉은 전 봉 종가보다 더 아래에서 시작한다. 매도 추세가 이어질 거라는 기대가 반영된 시작이다.
  3. 그런데 그 봉은 시가와 종가가 거의 같게 끝난다. 아래에서 팔자와 사자가 팽팽했다는 뜻이다.
  4. 팽팽해졌다는 건 하락 에너지가 소진되었을 수 있다는 단서가 된다.

여기서 중요한 건 4번이 가정이라는 점이다. 도지 하나가 심리를 증명하지는 않는다. 규칙이 하는 일은 “그럴 법한 모양"을 기계적으로 골라내는 것뿐이다. 이 글에서 효과를 말하지 않는 이유다. 재지 않았으니 말할 수 없다.

강세 도지 스타의 봉 배열 모식도

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

지표처럼 수식이 하나 있는 게 아니라 조건 네 개의 논리곱이다. 내가 구현한다면 이렇게 쓴다.

body(i)   = abs(close[i] - open[i])
range(i)  = high[i] - low[i]

조건 A  하락 맥락:  최근 N개 봉에서 종가가 내려오는 중
조건 B  긴 음봉:    close[1] < open[1]  그리고  body[1] >= k1 × (최근 몸통 평균)
조건 C  도지:       body[0] <= k2 × range[0]
조건 D  갭 다운:    max(open[0], close[0]) < close[1]
신호 = A 그리고 B 그리고 C 그리고 D

여기서 [1]은 직전 봉, [0]은 신호 확인 봉이다. 한 줄씩 뜯어 본다.

조건 B의 분모. “긴"은 절대 크기가 아니라 상대 크기다. 최근 몸통 평균과 비교해야 변동성이 큰 시기와 작은 시기에서 같은 의미를 갖는다. 평균 몸통 대신 ATR을 쓰는 방식도 가능하다. 어느 쪽이든 k1이라는 문턱이 하나 생긴다. 이 문턱은 정의에서 나오는 값이 아니라 구현자가 고르는 값이다. 그래서 내가 여기서 “기본값은 이거다"라고 못 박을 수 없다. 확실하지 않은 숫자는 쓰지 않는다.

조건 C의 비율. 도지는 몸통이 전체 범위에서 차지하는 비율이 아주 작은 봉이다. 분자는 시가와 종가의 차이이고, 분모는 그 봉의 고가와 저가의 차이다. 분모를 쓰는 이유는 크기를 정규화하기 위해서다. 아래 그림처럼 꼬리 모양이 같아도 몸통이 조금만 커지면 도지에서 팽이형으로 넘어간다. 문턱 k2를 0.05로 두는 사람과 0.1로 두는 사람은 같은 차트에서 다른 신호를 본다. 이것이 캔들 패턴의 첫 번째 약점이다. 눈으로 “대충 도지"라고 부르던 것이 숫자가 되는 순간 경계가 생기고, 경계 근처의 봉은 문턱 하나로 신호가 되었다 안 되었다 한다.

도지 판정은 몸통 비율 문턱의 문제

조건 D의 부등식. 도지의 몸통 전체가 직전 봉 종가보다 아래에 있어야 한다는 뜻이다. 꼬리가 아니라 몸통을 비교한다는 점에 주의한다. 꼬리까지 포함하면 조건이 훨씬 느슨해진다. 이 한 줄이 비트코인에서는 가장 큰 문제다. 아래에서 다룬다.

조건 A의 후행성. “하락 중"을 어떻게 정의해도 이 조건은 과거를 보고 판단한다. 종가가 N봉 연속 내려왔다는 식이면 N을 키울수록 확실해지는 대신 신호가 줄어든다. 게다가 반전 패턴은 정의상 이미 한참 내려온 뒤에 나온다. 바닥을 맞히는 게 아니라 “내려왔고 멈칫했다"를 확인하는 규칙이다. 확인 봉이 닫힌 뒤에야 신호가 확정되니, 진입은 그 다음 봉 시가에 이뤄진다. 신호 봉의 종가와 실제 체결가 사이의 거리는 이 규칙이 설계상 안고 있는 비용이다.

본론 3: 못 보는 것 — 코인 시장의 함정

갭이 거의 없다

주식은 장이 닫히고 다음 날 열린다. 그 사이 뉴스가 쌓이니 시가가 전일 종가에서 벌어지는 일이 흔하다. 조건 D는 이 구조를 전제로 만든 것이다. 비트코인은 24시간 365일 거래된다. 한 봉의 종가와 다음 봉의 시가는 사실상 같은 순간의 가격이고, 거래소 호가가 연속으로 이어진다. 그러니 일봉이든 시봉이든 시가가 직전 종가에서 의미 있게 벌어지는 일이 드물다. 완전히 없다고 단정하진 않는다. 거래소 점검이나 호가 공백으로 어긋날 수는 있다. 하지만 교과서가 말하는 “갭"은 아니다.

결과는 이렇다. 조건 D를 엄격하게 두면 신호가 거의 나지 않는다. 조건 D를 풀어서 “도지의 시가가 직전 종가 근처이면 된다"로 바꾸면, 그건 이미 도지 스타가 아니라 하락 뒤의 도지 규칙이 된다. 이름은 같은데 규칙이 다른 것이다. 아래 그림의 ①과 ②가 그 차이다.

신호가 나는 자리와 안 나는 자리

일봉 경계는 거래소 설정값일 뿐

24시간 시장에서는 “하루"가 자연스럽게 끊기지 않는다. 업비트는 한국시간 자정 기준이고, 해외 거래소는 UTC 자정 기준인 경우가 많다. 둘은 아홉 시간 차이다. 같은 시간 흐름에서 경계선만 옮겨도 일봉의 시가와 종가가 달라지고, 어떤 날은 음봉이 양봉으로, 도지가 아닌 봉이 도지로 바뀐다. 아래 그림이 그것을 보여 준다.

일봉 경계는 거래소 설정값일 뿐

이게 왜 봇에 치명적이냐면, 패턴이 두 봉의 관계에 의존하기 때문이다. 봉 하나의 판정이 흔들리면 쌍의 판정은 더 크게 흔들린다. 같은 규칙이 어느 거래소 데이터로 돌리느냐에 따라 다른 날 신호를 낸다. 백테스트를 한 곳과 실거래를 할 곳의 경계가 다르면, 검증이 아무 의미를 갖지 못할 수 있다.

숏 쪽을 못 쓴다

이 패턴은 강세 신호이니 숏이 필요 없다고 생각할 수 있다. 하지만 짝이 되는 약세 패턴을 같이 쓰려면 현물에는 공매도가 없다는 점이 걸린다. 약세 신호는 청산 신호로만 쓸 수 있고 진입으로는 못 쓴다. 그러면 규칙의 절반이 “나가는 쪽” 전용이 된다. 대칭이 깨진 규칙 세트라는 점은 알고 쓰자.

비트코인이라는 자산의 성격

비트코인은 시장 규모가 크고 거래가 연속적이라 호가가 얇은 알트코인보다는 도지가 “팽팽함"으로 읽힐 여지가 있다. 반대로 밈코인처럼 뉴스 한 줄에 방향이 뒤집히는 자산에서는 도지 한 개가 의미를 갖기 전에 다음 봉이 폭주해 버린다. 하지만 이건 어디까지나 성격 이야기이고, 측정한 사실이 아니다. 비트코인에서 이 패턴이 얼마나 자주 나는지, 나온 뒤 어떻게 움직였는지는 이 글에서 하나도 말하지 않는다.

파라미터를 바꾸면 무슨 일이 생기나

이 규칙은 숫자 문턱이 최소 세 개다. 긴 음봉의 길이 기준(k1), 도지의 몸통 비율(k2), 하락 맥락의 길이(N). 각각이 신호 수를 줄이거나 늘린다. 그런데 문턱이 많다는 건 과최적화의 문을 연다는 뜻이다. 데이터를 눈으로 보면서 신호가 “그럴듯하게” 나오는 조합을 찾기 시작하면, 그 조합은 과거에만 맞는 모양이 된다. 파라미터가 없는 규칙이 과최적화에서 자유로운 것과 정반대다. 캔들 패턴은 그림이 단순해 보여서 파라미터가 숨어 있다는 걸 잊기 쉽다.

그래서 내가 이 규칙을 쓴다면 문턱을 먼저 정의로 고정하고, 데이터는 그 다음에 본다. 순서를 뒤집으면 검증이 아니라 끼워 맞추기가 된다.

결론: 내 봇에 넣을 것인가

넣지 않기로 했다. 이유를 적어 둔다. 나중에 다시 판단할 때 근거가 되어야 하니까.

  1. 조건 D가 24시간 시장과 맞지 않는다. 갭이 전제인 규칙인데 비트코인에는 갭이 드물다. 조건을 느슨하게 풀면 다른 규칙이 된다.
  2. 일봉 경계 의존성. 같은 규칙이 거래소마다 다른 신호를 낸다. 신호가 데이터 출처에 의존하는 규칙은 검증 자체가 어렵다.
  3. 후행성. 하락 맥락과 확인 봉을 요구하는 만큼, 반전 패턴이라 해도 바닥을 알려 주지 않는다.
  4. 문턱이 세 개. 구현자가 고르는 숫자가 신호를 좌우한다.

내 봇에는 이미 진입 게이트가 따로 있다. 이 패턴을 거기에 하나 더 얹는다고 해서 새 정보가 생기는지, 아니면 같은 하락 뒤 반등을 다른 이름으로 다시 센 것인지부터 구분할 수 없다. 구분이 안 되는 신호는 게이트에 넣지 않는다.

다만 완전히 버리는 건 아니다. “하락 뒤 몸통이 작아진 봉"을 변동성 축소의 보조 단서로 쓰는 방향은 남겨 둔다. 그건 도지 스타가 아니라 몸통 비율 하나로 만든 별도의 조건이고, 이름을 달리 붙여 따로 다룰 것이다. RSI 같은 모멘텀 지표와 겹치는지도 그때 확인한다.

다시 말하지만 이번 편은 규칙을 해부했을 뿐 성과를 재지 않았다. 이 글은 투자 권유가 아니며, 어떤 매매 판단의 근거로도 쓰지 않길 바란다.

약어 풀이

  • BTC (Bitcoin) — 비트코인.
  • OHLC (Open High Low Close) — 시가·고가·저가·종가. 봉 하나를 이루는 네 값.
  • ATR (Average True Range) — 평균 실제 범위. 변동성 크기를 재는 지표.
  • RSI (Relative Strength Index) — 상대강도지수. 모멘텀 지표.
  • UTC (Coordinated Universal Time) — 협정 세계시. 해외 거래소의 일봉 경계로 흔히 쓰인다.
  • KST (Korea Standard Time) — 한국 표준시. UTC보다 9시간 빠르다.