밴드를 만든 사람이 밴드로 만든 지표
볼린저 밴드는 1980년대에 존 볼린저가 만들었다. 이동평균 위아래로 표준편차 두 배만큼 선을 긋는 그 지표 말이다. 그리고 40년쯤 지나 같은 사람이 후속작을 내놨다. 이름은 BBTrend. 재밌는 건 이게 밴드를 그리는 지표가 아니라 밴드 두 벌을 겹쳐놓고 그 어긋남을 숫자 하나로 뽑는 지표라는 점이다.
발상은 단순하다. 짧은 기간(20)으로 그린 밴드와 긴 기간(50)으로 그린 밴드를 동시에 놓는다. 시장이 한쪽으로 밀리기 시작하면 짧은 밴드가 긴 밴드보다 먼저 움직인다. 그 시차와 방향을 하나의 값으로 만든 것이다.
준비물: 밴드 두 벌 (짧은 기간 20, 긴 기간 50, 둘 다 2σ)
BBTrend = ( |하단20 − 하단50| − |상단20 − 상단50| ) / 중심20 × 100
값 > 0 하단끼리의 벌어짐이 더 크다 → 상승 쪽으로 밀리는 중
값 < 0 상단끼리의 벌어짐이 더 크다 → 하락 쪽으로 밀리는 중
|값| 이 커질수록 그 방향의 힘이 세다 (통상 1 을 강약의 눈금으로 본다)
중심20 으로 나누는 이유 — 가격 수준을 지워서 종목 간 비교가 가능해진다
4억짜리 BTC 와 200원짜리 코인의 BBTrend 를 같은 자로 잴 수 있다마지막 줄이 이 지표의 실용적 미덕이다. 절대 가격으로 만든 지표는 종목을 가로질러 비교할 수 없는데, BBTrend는 중심선으로 나눠서 백분율로 만들어 놓았다. 내 봇처럼 매 스캔마다 수십 종목을 한 줄에 세워 순위를 매기는 구조에서는 이 성질이 꽤 크다.
그 전에 — 볼린저 밴드부터 다시
BBTrend를 이해하려면 재료인 볼린저 밴드를 정확히 알아야 한다. 대충 아는 채로 넘어가면 뒤의 이야기가 다 흐려진다.
중심선 = 종가의 n봉 단순이동평균
상단 = 중심선 + k × 표준편차
하단 = 중심선 − k × 표준편차
기본값 n=20, k=2
여기서 표준편차가 하는 일
최근 n봉의 종가가 평균에서 얼마나 흩어져 있나를 재는 값
흩어짐이 크면 밴드가 벌어지고, 촘촘하면 좁아진다
즉 볼린저 밴드는 '평균 + 변동성' 을 한 그림에 담은 물건이다
흔한 오해: k=2 면 95% 가 밴드 안에 들어온다
정규분포 가정에서만 참이다. 실제 가격 분포는 꼬리가 두꺼워서
밴드 밖으로 나가는 빈도가 이론값보다 훨씬 높다마지막 항목을 짚고 가는 이유가 있다. “밴드 밖은 드물다"는 전제로 역추세 매매를 설계하면 실제보다 자주 틀린다. 코인처럼 급등락이 흔한 시장에서는 특히 그렇다. 밴드는 확률 구간이 아니라 변동성으로 그린 참고선으로 보는 게 안전하다.
왜 하단과 상단을 각각 비교하나
처음 공식을 봤을 때 걸린 게 이 부분이었다. 왜 그냥 중심선끼리 빼지 않고, 하단끼리 상단끼리 따로 비교한 다음 그 차이를 볼까.
이유는 밴드가 두 가지 정보를 동시에 들고 있기 때문이다. 위치(중심선이 어디냐)와 폭(변동성이 얼마냐). 중심선끼리만 비교하면 위치 정보만 남고 폭 정보가 사라진다. 그런데 하단과 상단을 각각 비교하면, 위치 이동과 폭 확장이 섞인 채로 잡힌다.
상단50 ─────────────
상단20 ───────── ← 간격 작다
가격 ────╱╲──╱▔▔▔▔
╱ 중심20 이 중심50 위로 올라감
─────────────────── 중심50
하단20 ──────────── ← 간격 크다
하단50 ───────
|하단 간격| 이 |상단 간격| 보다 크다 → BBTrend 양수
해석: 아래쪽이 확실히 들려 올라갔다 = 지지선 자체가 이동 중
상단은 아직 따라오지 못했다 = 위로 갈 여지가 남아 있다는 뜻으로도 읽힌다즉 BBTrend가 크게 양수라는 건 “바닥이 올라왔다"는 말에 가깝다. 고점이 갱신됐다가 아니라 저점이 갱신됐다를 본다는 게 이 지표의 성격이다. 눌림목 전략을 돌리는 입장에서 이건 흥미로운 각도다. 내 봇이 보는 저점근접 게이트는 “지금 가격이 24시간 저점에 얼마나 가까운가"인데, BBTrend는 “그 저점 자체가 어느 방향으로 움직이고 있는가"를 본다. 정적인 위치 대 동적인 이동. 서로 다른 질문이다.
코드로 옮기면
def bb(close, n, k=2.0):
mid = close.rolling(n).mean()
sd = close.rolling(n).std(ddof=0) # ddof 주의 — 아래 참조
return mid - k*sd, mid, mid + k*sd
lo20, mid20, up20 = bb(close, 20)
lo50, mid50, up50 = bb(close, 50)
bbtrend = ((lo20 - lo50).abs() - (up20 - up50).abs()) / mid20 * 100
# 함정 1: 표준편차의 자유도. 대부분의 차트 플랫폼은 모집단 표준편차(ddof=0)를
# 쓰는데 pandas 기본값은 표본(ddof=1)이다. 밴드 폭이 미세하게 달라진다
# 함정 2: 워밍업 — 긴 밴드가 50봉이므로 최소 50봉, 안전하게는 100봉 이상 채운 뒤 사용
# 함정 3: 완성봉. 진행봉을 넣으면 표준편차가 봉 안에서 계속 움직인다함정 1은 사소해 보이지만 짚어둘 만하다. 트레이딩뷰에서 본 값과 내 파이썬 값이 미세하게 다를 때, 대부분 이 자유도 차이다. BBTrend는 그 차이를 두 번(짧은 밴드, 긴 밴드) 겪고 뺄셈으로 증폭시키므로 특히 티가 난다. 지표를 이식할 때 원본 플랫폼과 숫자를 맞춰보는 절차를 건너뛰면, 나중에 “왜 백테스트랑 실전이 다르지"의 원인이 여기 숨는다.
값 하나보다 부호가 이어진 길이
BBTrend를 실제로 화면에 띄워놓고 며칠 보면 알게 되는 게 있다. 순간의 값보다 부호가 얼마나 오래 유지됐는가가 정보량이 더 많다는 것이다.
값 자체는 시끄럽다. 0 근처에서는 봉마다 부호가 뒤집힌다. 반면 진짜 추세가 붙으면 부호가 수십 봉씩 한쪽에 머문다. 그래서 이 지표를 쓸 때는 값을 임계와 비교하는 것보다, 부호가 유지된 봉 수를 세는 쪽이 안정적이다.
A 종목: −0.2 +0.3 −0.1 +0.4 −0.3 +0.2 현재값 +0.2
부호가 계속 뒤집힘 → 방향 없음. 이 +0.2 는 노이즈다
B 종목: +0.1 +0.2 +0.2 +0.3 +0.2 +0.2 현재값 +0.2
6봉 연속 양수 → 같은 +0.2 라도 의미가 다르다
코드로는 한 줄
streak = bbtrend.gt(0).groupby((bbtrend.gt(0) != bbtrend.gt(0).shift()).cumsum()).cumcount()+1
봇에 넣을 땐 (값, 부호지속봉수) 를 한 쌍으로 들고 다니는 게 맞다
이건 BBTrend 만의 얘기가 아니다 — 0 근처를 오가는 모든 오실레이터의 공통 처방지난 RSI 다이버전스 편에서 0선 근처의 톱니를 다루며 히스테리시스를 얘기했는데, 부호 지속 봉 수는 같은 문제에 대한 다른 처방이다. 히스테리시스는 진입선과 이탈선을 벌려서 톱니를 죽이고, 지속 봉 수는 톱니를 세어서 무시한다. 어느 쪽이 나은지는 재봐야 알지만, 후자가 파라미터가 하나 적어서 과적합 위험이 낮다는 점은 말할 수 있다.
사촌 지표들과의 관계
볼린저 계열에는 BBTrend 말고도 파생 지표가 몇 개 있다. 뭘 압축한 건지 나란히 놓고 보면 이 계열의 지형이 보인다.
%B (종가 − 하단) / (상단 − 하단)
잰다: 밴드 안에서의 위치. 0 이면 하단, 1 이면 상단
못 잰다: 밴드 자체가 어디로 가는지
밴드폭 (상단 − 하단) / 중심
잰다: 변동성의 크기. 스퀴즈(수축) 감지에 쓴다
못 잰다: 방향
BBTrend 밴드 두 벌의 어긋남
잰다: 방향 + 방향에 실린 힘
못 잰다: 현재 가격이 밴드 어디쯤인지
셋은 경쟁 관계가 아니라 보완 관계다 — 각각 다른 축을 담당한다
실전 조합 예: 밴드폭으로 스퀴즈 확인 → BBTrend 로 터질 방향 판정 → %B 로 진입 위치이 표를 만들면서 든 생각인데, 지표를 고를 때 “좋은 지표인가"를 묻는 대신 “무슨 축을 담당하는가“를 물으면 선택이 훨씬 쉬워진다. 내 게이트 목록에 이미 위치를 재는 축(저점근접)과 크기를 재는 축(낙폭, RSI)이 있으니, 새로 넣을 게 있다면 그 둘이 못 보는 축이어야 한다.
손으로 한 번 계산해보기
수식만 보면 감이 안 오니까 가상의 숫자로 한 번 돌려보자. 값이 어떤 크기로 나오는지 체감하는 게 목적이다.
어떤 종목, 현재가 1,000원 부근
짧은 밴드(20) 중심 1,000 · 상단 1,030 · 하단 970 (폭 60)
긴 밴드(50) 중심 980 · 상단 1,020 · 하단 940 (폭 80)
하단 차이 = |970 − 940| = 30
상단 차이 = |1,030 − 1,020| = 10
BBTrend = (30 − 10) / 1,000 × 100 = +2.0
해석: 하단이 30원 들려 올라간 반면 상단은 10원밖에 안 움직였다
→ 바닥이 확실히 올라오는 중, 상승 우세
같은 구조에서 하락 국면이라면 부호만 뒤집힌다
하단 차이 10 · 상단 차이 30 → BBTrend = −2.0
가격이 4억짜리 BTC 였어도 중심선으로 나누므로 값의 크기는 비슷하게 나온다계산해보면 +2.0 정도가 꽤 뚜렷한 신호라는 걸 알 수 있다. 짧은 밴드의 하단이 긴 밴드보다 3%나 위에 있다는 뜻이니까. 실제 차트에서 이 정도 값은 자주 안 나온다.
그래서 앞에서 “통상 1을 강약의 눈금으로 본다"고 적었는데, 이 계산을 해보면 왜 그런지 이해가 된다. 1이면 밴드 간격 차이가 가격의 1%라는 뜻이고, 15분봉 한두 시간 안에 그만큼 구조가 이동하는 건 흔한 일이 아니다.
이 지표의 진짜 약점
호의적으로만 쓰면 스터디가 아니다. BBTrend에는 구조적인 약점이 하나 있다.
중심20 으로 나누므로 분모는 안정적이다. 문제는 분자다.
변동성 폭발 구간 밴드 폭이 크다 → 간격 차이도 크다 → |BBTrend| 큼
저변동성 횡보 밴드 폭이 얇다 → 간격 차이도 작다 → |BBTrend| ≈ 0
즉 조용한 장에서는 방향이 있어도 값이 안 나온다.
"추세 없음" 과 "추세는 있는데 변동성이 낮음" 이 같은 0 으로 뭉개진다
대응: 값 자체가 아니라 값의 부호 지속 봉 수를 같이 본다
또는 ATR 로 정규화한 보조 축을 하나 더 두고 교차 확인이건 볼린저 계열 전체가 공유하는 성질이기도 하다. 표준편차 기반 지표는 변동성이 낮을 때 신호가 함께 죽는다. 스퀴즈(밴드 수축)를 별도로 감지하는 지표가 따로 존재하는 이유이기도 하다.
내 봇 이력에도 비슷한 계열의 흔적이 있다. 박스장에서 진입이 완전히 막혔을 때 볼린저 밴드 상단 돌파를 별도 게이트로 신설한 적이 있는데(BB_PERIOD 20 → 15 → 10, BB_STD 2.0 → 1.5 → 1.0 → 0.8), 임계를 계속 낮춰야 신호가 나왔다. 밴드가 얇아진 장에서 밴드 기준으로 뭔가를 판정하려니 기준을 계속 깎게 된 것이다. 결국 그 게이트는 눌림목 전환과 함께 사라졌다. 지표가 나빠서가 아니라 그 지표가 잘 작동하는 장이 아니었기 때문이다.
두 기간을 20과 50으로 잡은 이유
BBTrend는 밴드 두 벌을 쓰는데, 그 기간을 20과 50으로 둔다. 이 조합에도 따져볼 게 있다.
중요한 건 절대값이 아니라 두 기간의 비율이다
20 / 50 = 1 : 2.5 ← 원저자 기본값
10 / 50 = 1 : 5 ← 짧은 쪽이 훨씬 민감해짐
30 / 50 = 1 : 1.67 ← 두 밴드가 비슷해져 차이가 잘 안 벌어짐
비율이 1 에 가까워지면
두 밴드가 거의 겹친다 → BBTrend 가 항상 0 근처 → 신호 소멸
비율이 너무 커지면
짧은 밴드가 노이즈로 요동 → 값은 커지는데 방향성은 없음
15분봉 환산
20봉 = 5시간 · 50봉 = 12시간 30분
즉 '반나절 흐름 대비 다섯 시간 흐름' 의 어긋남을 재는 셈이다이 환산이 중요하다. 원저자는 일봉을 염두에 두고 20/50을 권했을 텐데, 일봉에서 20/50은 한 달 대 두 달 반이다. 15분봉에서는 다섯 시간 대 반나절이 된다. 같은 숫자인데 재는 시간 규모가 전혀 다르다.
이동평균 편에서도 같은 얘기를 했다. 20, 60, 120 같은 숫자는 주식 시장 달력에서 왔고, 코인 15분봉으로 옮기면 근거가 사라진다. 지표를 가져올 때 기간 숫자를 그대로 옮기는 건, 사실은 아무 근거 없는 값을 쓰는 것과 같다.
그럼 어떻게 정하느냐. 두 가지 방법이 있다. 하나는 스윕 — 후보를 늘어놓고 내 매매기록에서 재보는 것. 다른 하나는 내 시스템의 다른 부품과 시간 규모를 맞추는 것이다. 예컨대 내 봇의 저점근접 게이트는 24시간 창을 쓴다. 15분봉에서 24시간이면 96봉이다. BBTrend의 긴 밴드를 96으로 맞추면 두 지표가 같은 창을 보게 되고, 그러면 둘을 공정하게 비교할 수 있다.
봇에 넣는다면 어디에
BBTrend를 진입 트리거로 쓰는 건 별로다. 이건 상태를 재는 지표이지 순간을 잡는 지표가 아니다. 대신 두 자리가 어울린다.
① 레짐 판정 보조
BTC 4시간봉 BBTrend 가 음수 지속 → 시장 전체가 아래로 밀리는 중
현행 봇은 하락장이면 신규 진입을 아예 안 한다 — 그 판정의 두 번째 근거로
② 랭킹 가점
게이트를 통과한 후보가 여럿일 때 BBTrend 큰 쪽에 가점
진입 여부는 안 바꾸고 순서만 바꾸므로 실험 위험이 작다
✗ 진입 트리거로는 부적합 — 값이 커졌을 땐 이미 움직임이 진행된 뒤다
검증 설계: 축 3개 (짧은기간 10/20/30 · 긴기간 40/50/60 · 임계 0.5/1.0/1.5)
단변량 → 조합 → 기간 반분. 셋 다 통과해야 채택②번을 강조하고 싶다. 랭킹 가점은 진입 빈도를 건드리지 않으므로 가장 싸게 실험할 수 있는 자리다. 내 봇에서 랭킹 가중치를 만졌을 때 흥미로운 걸 배운 적이 있다. 과매도 가점과 압축 가점을 각각 3.0과 2.5로 주고 있었는데, 실제 결과와 대조해 보니 두 항목 모두 상관이 음수였다. 점수가 높을수록 오히려 나쁜 종목을 먼저 사고 있었던 것이다. 두 가중치를 0으로 내린 게 그때의 결론이었다.
그래서 새 지표를 랭킹에 넣을 때는 방향까지 의심해야 한다. “이 지표가 유용한가"만 묻지 말고 “부호가 내 생각과 같은가"를 물어야 한다. 그럴듯한 논리로 만든 가점이 반대로 작동하는 일은 생각보다 자주 일어난다.
내 봇의 볼린저 이력 — 임계를 계속 깎았던 시절
이 지표를 평가할 자격이 나에게 조금은 있다고 생각하는 이유가 있다. 볼린저 밴드를 게이트로 써봤고, 그게 어떻게 무너지는지 봤기 때문이다.
돌파 전략을 돌리던 시절, 박스장에서 진입이 완전히 막힌 적이 있다. 이틀째 매수가 하나도 없었다. 그때 대안으로 넣은 게 볼린저 밴드 상단 돌파 게이트였다. 고점 돌파가 안 나오니 밴드 돌파로라도 신호를 만들어보자는 발상이었다.
신설 BB 기간 20 · 2.0σ "박스장에서도 진입 신호 생성"
1차 조정 기간 15 · 1.5σ 더 빠른 반응, 더 좁은 밴드
2차 조정 기간 10 · 1.0σ "박스장돌파 통과율 18% → 40~50% 목표"
3차 조정 기간 8 · 0.8σ 세 개 게이트를 동시에 완화한 배포
결말 눌림목 전략 전환과 함께 게이트 자체가 사라짐
돌아보면 신호가 안 나올 때마다 기준을 깎고 있었다
2.0σ 에서 0.8σ 까지 — 통계적 의미가 남아 있었는지 의문이다
교훈: 임계를 반복해서 완화하고 있다면 지표가 아니라 전략을 의심할 때다마지막 줄이 이 이력에서 얻은 결론이다. 파라미터를 계속 깎아야 신호가 나온다면, 그건 그 지표가 지금 시장에서 작동하지 않는다는 신호일 가능성이 크다. 그때는 값을 더 깎을 게 아니라 전략 자체를 의심해야 한다.
실제로 그렇게 됐다. 돌파 조건을 조였다 풀었다 몇 주를 반복한 끝에 나온 결론이 “파라미터 문제가 아니라 전략 문제"였고, 진입 전략을 눌림목 반등으로 통째로 바꿨다. 그 전환과 함께 볼린저 게이트도 사라졌다.
그러니 BBTrend에 대한 내 태도는 조심스럽다. 볼린저 계열 지표가 나쁘다는 게 아니라, 그 계열이 잘 작동하는 장이 따로 있다는 걸 몸으로 배웠기 때문이다. 변동성이 살아 있고 방향이 잡히는 장에서는 좋고, 밴드가 얇아진 박스장에서는 무엇을 해도 안 된다.
지표를 만든 사람이 후속작을 낸다는 것
잠깐 옆길로 새는 이야기인데, 이 지표를 공부하면서 인상 깊었던 게 있다. 존 볼린저는 자기 지표가 세계 표준이 된 뒤에도 그걸 계속 손보고 있었다는 것이다.
밴드폭(밴드가 얼마나 벌어졌나), %B(가격이 밴드 안 어디쯤인가), 그리고 BBTrend까지. 전부 원본 밴드를 재료로 만든 파생물이다. 밖에서 보면 밴드 하나로 이미 충분해 보이는데, 만든 사람은 계속 부족한 지점을 발견하고 있었던 셈이다.
이게 내 상황과 겹쳐 보였다. 내 봇도 같은 뼈대 위에서 461번을 고쳤다. 밖에서 보면 “그냥 사고파는 프로그램"인데, 안에서는 매번 부족한 게 보였다. 손절을 넣고, 본전 사수를 붙이고, 레짐 차단을 세우고, 호가 게이트를 만들고.
볼린저 밴드 계열
원본 밴드 → 밴드폭(변동성) → %B(위치) → BBTrend(방향)
각 파생물은 원본이 못 답하던 질문 하나씩을 맡는다
내 봇의 방어 계열
손절 → 본전 사수 → 일일 한도 → 주간 한도 → 서킷브레이커 → 레짐 차단
역시 앞의 것이 못 막던 상황 하나씩을 맡는다
공통점: 처음부터 설계된 게 아니라 부족함이 발견될 때마다 붙었다
그래서 계보를 보면 그 사람이 무엇에 계속 데였는지가 보인다마지막 줄이 이 코너를 하면서 얻은 관점이다. 어떤 지표의 파생 계보를 따라가면, 만든 사람이 어디서 계속 아쉬웠는지가 드러난다. 밴드폭이 나온 건 “변동성을 숫자로 못 읽어서"였을 테고, BBTrend가 나온 건 “밴드 두 벌을 눈으로 비교하기 번거로워서"였을 것이다.
지표를 배울 때 수식만 외우면 이 맥락이 안 보인다. 왜 이게 만들어졌는지, 무엇이 부족해서 나왔는지를 알면 그 지표를 어디에 써야 하는지도 자연히 따라온다.
흔한 오해 셋
이 지표를 소개하는 글들에서 자주 보이는 설명 중 정확하지 않은 게 몇 개 있다.
“BBTrend가 1을 넘으면 강한 추세다.” 1이라는 눈금은 절대 기준이 아니다. 앞서 봤듯 종목마다 값의 범위 자체가 다르다. 어떤 종목은 평생 1을 못 넘고 어떤 종목은 하루에도 몇 번 넘는다. 임계값은 그 종목의 과거 분포 위에서 정해야 한다.
“양수면 매수 신호.” 이건 지표를 신호로 오해한 것이다. BBTrend는 이미 벌어진 일을 요약하는 값이지 앞을 가리키는 값이 아니다. 밴드가 어긋나려면 가격이 먼저 움직여야 하니 구조적으로 후행한다.
“짧은 기간을 더 짧게 하면 더 빨라진다.” 부분적으로만 맞다. 짧게 하면 반응은 빨라지지만 표준편차가 몇 개 안 되는 표본으로 계산돼서 값이 요동친다. 20 아래로 내리면 노이즈가 신호를 덮는 구간이 온다. 내 봇에서 볼린저 기간을 20에서 8까지 계속 줄여봤을 때도 같은 일이 있었다 — 민감해지긴 했는데 쓸 만한 신호가 늘지는 않았다.
며칠 켜놓고 본 소감
지표를 글로만 다루면 반쪽이라, 며칠 붙여놓고 봤다. 몇 가지 인상이 남는다.
첫째, 0 근처에 머무는 시간이 생각보다 길다. 명확한 신호가 나오는 구간은 하루 중 일부고 나머지는 계속 애매하다. 이건 결함이 아니라 시장이 원래 그렇다는 뜻에 가깝다. 지표가 항상 뭔가 말해주기를 기대하는 쪽이 잘못이다. 대부분의 시간에 아무 말도 안 하는 지표가 정직한 지표일 수 있다.
둘째, 부호가 바뀌는 순간보다 크기가 커지는 구간이 눈에 띈다. 0을 통과하는 시점은 이미 늦었고, +0.3에서 +0.9로 커지는 구간에서 가격이 실제로 움직였다. 이건 진입 트리거로 쓰기 어렵다는 앞의 판단과 일치한다.
셋째, 종목마다 값의 범위가 꽤 다르다. 어떤 종목은 ±0.5 안에서만 놀고 어떤 종목은 ±3까지 간다. 중심선으로 나눠 정규화했는데도 그렇다. 변동성 구조 자체가 다르기 때문인데, 이러면 모든 종목에 같은 임계값을 쓰는 설계가 위험해진다. 종목별 과거 분포의 상위 몇 퍼센타일을 임계로 쓰는 쪽이 나을 수 있다. 이건 스윕 설계에 반영해야 할 항목이다.
숏이 없는 계좌에서 음수 구간은 무엇에 쓰나
BBTrend는 -100에서 +100까지가 아니라 사실상 무한대 범위의 값인데, 부호가 양쪽으로 다 나온다. 그런데 나는 현물만 거래한다. 하락에 베팅할 수단이 없다는 뜻이다.
그럼 음수 구간은 쓸모없는가. 그렇지 않다. 오히려 이쪽이 더 중요할 수도 있다.
✗ 못 하는 것
숏 진입 — 수단이 없다
✓ 할 수 있는 것
① 신규 진입 차단
BTC 4시간봉 BBTrend 가 음수 지속 → 시장이 아래로 밀리는 중
이럴 땐 아무것도 안 사는 게 최선일 수 있다
② 보유 포지션의 경계 상향
시장 레짐이 나쁘면 수확 임계를 낮춰 빨리 털거나
새 진입 슬롯을 줄여 노출을 축소한다
③ 종목 랭킹에서 후순위
게이트는 통과했지만 BBTrend 가 음수인 종목은 순서를 뒤로
"안 사는 것도 포지션이다" — 현물 계좌에서 방향 지표의 절반은 여기에 쓰인다①번은 내 봇이 이미 다른 방식으로 하고 있는 일이다. 비트코인 4시간봉이 하락 추세면 신규 진입 자체를 막는다. 이 규칙이 생긴 배경이 7주 연속 마이너스였다. 개별 진입 조건을 아무리 다듬어도, 시장 전체가 흘러내리는 구간에서 계속 사고 있으면 답이 없었다.
그래서 BBTrend를 도입한다면 진입 트리거가 아니라 이 레짐 판정의 두 번째 근거로 넣는 게 자연스럽다. 지금은 판정 축이 하나뿐인데, 성격이 다른 축을 하나 더 두면 판정이 안정된다. 다만 둘이 자주 엇갈리면 그때는 어느 쪽을 따를지 규칙이 또 필요해진다. 조건을 늘리면 그 조건들을 조율하는 메타 규칙이 생기고, 그 메타 규칙도 결국 파라미터가 된다. 복잡성은 이렇게 늘어난다.
검증 설계를 구체적으로
앞에서 스윕 축을 대충 적었는데, 실제로 돌린다면 이런 순서가 된다. 이 절차는 BBTrend만이 아니라 새 지표를 들일 때 공통으로 쓰는 틀이다.
0단계 — 기록부터
진입할 때마다 그 시점의 BBTrend 값을 함께 저장한다
최소 2~3주. 이게 없으면 나머지 단계를 할 수 없다
1단계 — 사후 상관
이미 청산된 건들의 진입 시 BBTrend 와 결과(수익률)의 상관을 본다
익절 건과 손절 건의 BBTrend 분포가 실제로 갈리는가?
안 갈리면 여기서 끝. 게이트에 넣을 이유가 없다
2단계 — 단변량 스윕
임계를 후보값별로 걸어보고 평균수익·승률·손절권을 각각 기록
3단계 — 조합 검증
기존 게이트 통과분에만 적용했을 때도 개선이 남는가
여기서 대부분 죽는다 — 다른 게이트가 이미 같은 걸 걸러내고 있어서
4단계 — 기간 반분
표본을 앞뒤로 갈라 양쪽에서 모두 성립하는지
넷을 다 통과해야 배포 후보. 하나라도 실패하면 기각하고 기록만 남긴다3단계에서 대부분 죽는다는 게 경험적 사실이다. 단독으로는 성적이 좋았던 조건을 기존 게이트 위에 얹었더니 후보가 46건에서 6건으로 줄어든 적이 있다. 87%가 사라졌고 성과도 무너졌다. 다른 게이트들이 이미 비슷한 정보를 다른 각도로 보고 있었던 것이다.
그래서 나는 이제 새 지표를 볼 때 성능보다 독립성을 먼저 본다. 이 지표가 기존 조건들과 상관이 낮은가. 낮다면 정보를 늘리는 것이고, 높다면 중복 검문소를 하나 더 세우는 것이다. 검문소가 많다고 도시가 안전해지지는 않는다. 통행량만 죽는다.
BBTrend의 경우 기존 게이트와의 상관이 어떨지는 재봐야 안다. 다만 예상은 해볼 수 있다. 중기추세 게이트가 며칠 고점 대비 낙폭을 보고, 저점근접이 24시간 저점 대비 거리를 보는데, BBTrend는 밴드의 이동 방향을 본다. 재는 대상이 겹치는 부분이 분명 있다. 완전히 독립적이지는 않을 것이다.
정리
BBTrend는 새로운 정보를 만들어내는 지표가 아니다. 이미 있던 밴드 두 벌에서 비교 가능한 숫자 하나를 뽑아내는 압축 장치에 가깝다. 그 압축이 유용한 이유는 종목을 가로질러 줄 세울 수 있게 해주기 때문이고, 한계가 있는 이유도 같다 — 압축하면서 버린 정보(밴드 폭 자체, 가격의 밴드 내 위치)는 다시 꺼낼 수 없다.
지표를 고를 때 나는 이제 이 질문을 먼저 한다. 이 지표는 무엇을 압축했고, 그 과정에서 무엇을 버렸는가. 볼린저가 자기 지표 위에 또 지표를 얹은 건, 밴드 두 벌을 눈으로 비교하는 일이 실제로 번거로웠기 때문일 것이다. 좋은 지표는 대개 누군가의 반복 노동을 자동화한 결과물이다.
덧붙임 — 이 지표를 쓸 때의 체크리스트
혹시 직접 붙여보실 분을 위해 짧게 정리한다.
표준편차 자유도를 확인한다. pandas의 std() 기본값은 표본 표준편차(ddof=1)인데 대부분의 차트 플랫폼은 모집단(ddof=0)을 쓴다. BBTrend는 이 차이를 두 번 겪고 뺄셈으로 증폭하므로 특히 티가 난다.
워밍업을 넉넉히 잡는다. 긴 밴드가 50봉이면 최소 50봉이 필요하지만, 안정적인 값을 원하면 100봉 이상을 채운 뒤부터 쓴다. 앞부분 값은 버린다.
완성봉만 쓴다. 진행봉을 넣으면 표준편차가 봉 안에서 계속 변한다. 같은 시점을 두 번 계산하면 다른 값이 나오는 지표는 검증이 불가능하다.
종목별 분포를 먼저 본다. 임계값을 정하기 전에 그 종목의 BBTrend가 평소 어느 범위에서 노는지 확인한다. ±0.5 안에서만 노는 종목에 임계 1.0을 걸면 신호가 영영 안 나온다.
부호 지속 봉 수를 함께 들고 다닌다. 값 하나보다 방향이 유지된 길이가 정보량이 많다. 0 근처를 오가는 오실레이터 전반에 적용되는 처방이다.
다섯 개 중 앞의 세 개는 지표를 이식할 때 공통으로 해당되는 항목이고, 뒤의 둘은 이 지표에 특화된 것이다. 이 코너를 여러 편 쓰다 보니 앞의 세 항목은 거의 매번 반복된다. 지표마다 다른 건 수식이지 함정이 아니다.
마지막으로 하나 더. BBTrend를 켜두고 며칠 보다 보면 값이 커지는 순간에 눈이 간다. 그런데 그 순간을 잡아서 사고 싶어지는 충동이 들면, 이 글의 앞부분을 다시 읽는 게 좋다. 값이 커졌다는 건 이미 움직였다는 뜻이다. 지표가 알려주는 건 방금 일어난 일이지 앞으로 일어날 일이 아니다.
이 구분을 계속 상기해야 하는 이유는, 차트를 오래 보면 후행 지표가 선행 지표처럼 느껴지기 때문이다. 과거 차트에서는 신호와 상승이 나란히 보이니까 마치 신호가 상승을 예고한 것처럼 읽힌다. 실시간에서는 절대 그렇게 안 보인다. 이 착시를 이기는 방법은 하나뿐이다 — 백테스트를 정직하게 짜서, 신호 시점 이후의 결과만으로 판정하는 것.