서론: 눈에는 쉬운데 코드로는 어려운 모양
이번 편은 시세를 받아 성과를 검증한 글이 아니라 규칙 자체를 해부한 글이다. 승률을 적지 않은 이유도 그래서다. 아래 그림은 전부 손으로 만든 상대값이고, 실제 시세가 아니라 규칙을 설명하기 위한 모식도다.
강세 페넌트는 차트 패턴 책에서 거의 첫 장에 나온다. 가파르게 오른 뒤 작은 삼각형 모양으로 숨을 고르고, 위쪽 선을 뚫으면 한 번 더 간다는 이야기다. 그림으로 보면 누구나 “아, 저거” 하고 알아본다. 그런데 봇을 만드는 입장에서는 이 “아, 저거"가 가장 골치 아프다. 사람이 한눈에 알아보는 것은 규칙으로 옮기려는 순간 갑자기 정의가 하나도 없는 것이 되기 때문이다.
그래서 이번에는 패턴 자체의 성과를 따지지 않고, 이 패턴을 코드로 정의하려면 어떤 결정을 몇 개나 내려야 하는지를 센다. 무대는 맨틀(MNT)이다. 맨틀은 이더리움 위에서 돌아가는 레이어2 네트워크의 토큰으로 알려져 있다. 이 사실 말고는 이 코인에 대해 더 아는 척하지 않겠다. 가격을 보지 않았으니 맨틀에서 이 패턴이 잘 맞았는지는 말할 수 없고, 말하지도 않는다.
본론 1: 무엇을 재는가

강세 페넌트는 세 부분으로 나뉜다.
- 깃대(pole) — 짧은 시간에 한 방향으로 크게 오른 구간.
- 페넌트 본체 — 깃대 끝에서 시작해 고점은 낮아지고 저점은 높아지는 수렴 구간. 봉의 크기와 거래량이 같이 줄어든다.
- 돌파(breakout) — 윗선을 위로 뚫는 순간.
패턴이 가정하는 심리는 단순하다. 급등으로 이익을 챙기려는 쪽과 뒤늦게 따라붙으려는 쪽이 팽팽하게 맞서 변동폭이 줄어든다. 이 균형이 위로 깨지면 깃대의 힘이 이어진다는 것이다. 흔히 깃대 길이만큼 더 간다는 목표가 공식이 같이 붙는다. 이건 관습일 뿐 계산으로 증명된 수치가 아니다. 나는 목표가 공식도 쓰지 않는다. 근거를 확인한 적이 없기 때문이다.
여기서 재려는 것은 사실 “변동성이 줄어든다"는 하나의 현상이다. 방향 정보는 깃대에서 오고, 타이밍 정보는 돌파에서 온다. 본체는 그 사이의 공백이다. 이 공백이 얼마나 길고 얼마나 좁아야 하는지를 정하는 순간부터 임의의 숫자가 끼어든다.

비슷한 모양과의 경계도 문제다. 깃발은 두 선이 평행하게 아래로 기울고, 페넌트는 두 선이 한 점으로 모이고, 상승 삼각형은 윗선이 수평이다. 눈으로는 구분되지만 규칙으로는 선 기울기의 부호와 크기를 비교하는 문제로 바뀐다. 윗선이 아주 조금만 내려가면 상승 삼각형인지 페넌트인지 어디서 끊을까. 이 경계값을 내가 정해야 한다.
본론 2: 어떻게 계산하나
이 패턴에는 TradingView 의 RSI 14 나 MACD 12·26·9 같은 “기본 파라미터"가 없다. 널리 합의된 표준 숫자가 없다는 뜻이다. 그래서 정의를 굳이 조건문으로 옮기면 이렇게 된다.
깃대: 최근 N봉 안에서 (끝 종가 - 시작 종가) / ATR >= K1
본체: 깃대 직후 M봉 동안
고점 회귀선 기울기 < 0
저점 회귀선 기울기 > 0
평균 봉 범위 / 깃대 평균 봉 범위 <= K2
평균 거래량 / 깃대 평균 거래량 <= K3
돌파: 종가 > 윗선(현재 봉 위치에서의 값)
한 줄씩 뜯어 보자.
- 깃대 조건의 분모에 ATR 를 쓴 이유. ATR 은 평균 실제 범위, 즉 봉 하나가 보통 움직이는 폭이다. 절대 상승폭이 아니라 “평소 봉 몇 개 분만큼 올랐나"로 재면 코인이 달라져도 같은 기준을 쓸 수 있다. 가격 자릿수가 다른 코인끼리 규칙을 공유하려면 이렇게 정규화하는 수밖에 없다.
- 기울기 부호 조건. 고점이 내려가고 저점이 올라야 수렴이다. 그런데 어느 값으로 선을 그을까. 이게 다음 절의 핵심이다.
- K1, K2, K3. 전부 내가 정해야 하는 숫자다. 이 숫자들은 데이터에 맞춰 고르는 순간 과최적화의 입구가 된다. 시세를 안 보고 정하면 근거가 없고, 시세를 보고 정하면 과거에 맞춘 것이다. 어느 쪽이든 찜찜하다. 이 패턴이 파라미터가 많은 규칙이라는 사실 자체가 단점이다.
- N 과 M. 깃대가 몇 봉이고 본체가 몇 봉일 때까지를 페넌트로 칠지. 길어지면 페넌트가 아니라 그냥 횡보 박스다.
그리고 청산 규칙은 이 정의 어디에도 없다. 돌파에서 진입하는 것까지만 패턴이 말해 준다. 패턴이 청산을 말하지 않는다는 건, 청산을 내가 따로 만들어야 하고 그 청산 규칙이 결과의 대부분을 결정한다는 뜻이다. 목표가 공식을 안 쓰기로 했으니 손절선도 직접 정해야 한다. 아랫선 이탈을 무효로 보는 정도가 가장 자연스럽다.
본론 3: 사람의 눈과 규칙의 차이

그림 3은 같은 봉 배열에 선을 두 가지로 그은 것이다. 왼쪽은 꼬리 끝(고가·저가)을 이었고 오른쪽은 몸통 끝(종가)을 이었다. 같은 봉인데 왼쪽은 크게 수렴하는 삼각형이고, 오른쪽은 거의 평행한 박스다. 둘 다 “맞는 선"이다. 사람은 이 중 하나를 그 자리에서 고른다. 보통은 “그럴듯해 보이는” 쪽을 고른다. 그리고 그럴듯함의 기준이 이미 돌파가 났다는 사실에 영향을 받는다. 돌파 뒤에 보면 선이 선명하게 보이는데, 돌파 전에는 어디가 윗선인지 불분명하다.
규칙으로 검출할 때 부딪히는 어려움은 구체적으로 이렇다.
- 기준 봉 선택. 꼬리를 쓰면 한 번의 튄 꼬리가 선 전체를 바꾼다. 종가를 쓰면 선이 덜 흔들리지만 장중 돌파가 안 보인다.
- 되돌림 허용폭. 선에 닿지 않고 밖으로 살짝 삐져나온 봉을 허용할지 말지. 허용폭을 0으로 하면 거의 아무 데서도 패턴이 안 잡히고, 넓히면 아무 데서나 잡힌다.
- 선의 기울기와 길이. 깃대 직후 바로 시작해야 하는지, 이틀쯤 비워도 되는지.
- 재그리기 문제. 봉이 하나 생길 때마다 회귀선이 바뀐다. 어제 그은 윗선이 오늘은 다른 선이다. 실시간으로 돌릴 때 신호가 사후에 사라지거나 생기는 일이 일어난다.
마지막 항목이 가장 위험하다. 회귀선을 매 봉 다시 계산하는 구현은 백테스트에서 조용히 미래 정보를 쓰게 되기 쉽다. 이 글은 백테스트를 하지 않았지만, 만약 한다면 선을 확정하는 시점과 신호를 내는 시점이 분리됐는지부터 확인해야 한다.
본론 4: 못 보는 것과 코인 시장의 함정

그림 4는 같은 본체에서 윗선을 종가로 뚫으면 신호가 나고, 아랫선을 뚫으면 패턴이 무효가 되는 모습을 거래량과 함께 그린 것이다. 이 역시 모식도다. 규칙이 못 보는 것을 정리한다.
1) 왜 깃대가 생겼는가. 패턴은 상승 모양만 본다. 오른 이유가 지속될 재료였는지 일회성 이벤트였는지는 모른다. 맨틀 같은 레이어2 토큰이라면 네트워크 활동이나 토큰 수급 같은 별도의 지표가 있는데, 차트만으로는 이게 안 보인다. 안 보이는 만큼 이 패턴이 하는 약속은 “모양이 같으면 결과도 비슷하다"는 가정 위에 있다.
2) 24시간 시장의 일봉 경계. 주식판이라면 장이 열리고 닫히니 봉이 자연스럽게 끊긴다. 코인은 쉬지 않는다. 일봉을 어디서 끊느냐는 거래소 설정값일 뿐이다. 국내 거래소는 KST 자정에서 끊고, 해외는 UTC 자정에서 끊는 경우가 많아 아홉 시간 어긋난다. 이 어긋남 때문에 같은 하루가 어떤 곳에서는 상승봉이고 다른 곳에서는 하락봉이 되는 날이 나온다. 페넌트는 봉 몇 개의 고점·저점으로 선을 긋는 규칙이니 이 영향이 크다. 윗선을 간신히 넘은 봉이 한쪽 기준에서는 돌파고 다른 기준에서는 아닐 수 있다. 어느 경계 기준의 봉으로 규칙을 돌릴지 먼저 못 박아야 한다.
3) 갭이 드물다. 주식은 휴장 뒤 갭이 자주 생겨서 돌파가 갭으로 나타나기도 한다. 코인은 휴장이 없어 갭이 드물고, 돌파가 연속된 봉으로 이어진다. 돌파 봉을 종가로 확인하려는 규칙은 코인에서 오히려 더 자연스럽다. 이점이다.
4) 숏 신호의 쓸모. 강세 페넌트의 반대 모양인 약세 페넌트는 하락 신호다. 현물에는 공매도가 없어서, 하락 신호는 진입이 아니라 “있는 걸 정리하라"는 청산 신호로만 쓸 수 있다. 그래서 강세 쪽만 구현하고 약세는 청산 보조로만 쓰는 것이 현실적이다.
5) 거래량의 신뢰. 본체에서 거래량이 줄어야 한다는 조건을 달았지만, 코인 거래소의 거래량은 거래소마다 집계가 다르다. 어느 거래소의 거래량을 기준으로 삼을지 정하지 않으면 이 조건은 허공에 뜬다.
결론: 내 봇에 넣을 것인가
지금 내 봇에는 이 패턴을 넣지 않기로 했다. 버린 이유를 적어 둔다.
- 정의에 결정해야 할 숫자가 너무 많다. 깃대 기준, 본체 길이, 수렴 정도, 거래량 비율, 선 그리는 방식, 허용폭. 이 숫자가 하나씩 늘 때마다 과최적화의 자유도가 늘어난다. 내 봇의 다른 게이트는 숫자가 한두 개로 끝나서 이유를 설명할 수 있다. 이건 설명이 안 된다.
- 눈으로 보는 것을 코드가 재현하지 못한다. 그림 3처럼 같은 봉에서 선이 두 가지로 그려진다. 검출기가 어느 쪽이 “맞다"고 말할 근거를 내가 갖고 있지 않다.
- 청산이 없다. 패턴은 진입만 말한다. 청산을 새로 설계하면 그 설계가 결과를 좌우하고, 그러면 패턴의 기여가 얼마인지 분리가 안 된다.
- 회귀선 재그리기. 실시간 신호가 사라질 수 있는 구현은 실계좌에서 검증하기 가장 나쁘다.
다시 판단할 조건도 남긴다. 윗선을 “직전 N봉 종가의 최고값” 같은 한 줄짜리 수평선으로 단순화하고, 깃대 조건을 ATR 배수 하나로만 두는 축소판이라면 시도해 볼 수 있다. 사실상 변동성 수축 뒤 돌파 규칙이다. 이건 따로 한 편으로 다룰 일이다.
이번 편은 시세를 받지 않았으므로 맨틀에서 이 패턴이 통했는지 아닌지에 대해서는 아무것도 주장하지 않는다. 이 글은 투자 권유가 아니다.
약어 풀이
- MNT (Mantle) — 맨틀 네트워크의 토큰 심볼.
- ATR (Average True Range) — 평균 실제 범위. 봉 하나가 보통 움직이는 폭, 변동성 크기를 재는 지표.
- RSI (Relative Strength Index) — 상대강도지수. 최근 상승·하락 폭의 비율로 과열을 재는 지표.
- MACD (Moving Average Convergence Divergence) — 이동평균 수렴·확산. 두 이동평균의 차이로 추세를 보는 지표.
- KST (Korea Standard Time) — 한국 표준시.
- UTC (Coordinated Universal Time) — 협정 세계시.