모든 사람이 처음 배우는 규칙

이 글은 지표를 소개하는 글이라기보다 왜 버렸는지에 대한 기록에 가깝다. 그래서 다른 편들과 결이 조금 다르다. 새로 도입할 지표를 검토하는 게 아니라, 실제로 써봤다가 접은 물건의 부검 보고서다.

차트를 처음 열면 누구나 만나는 게 이동평균선이다. 그리고 처음 배우는 매매 규칙은 대개 이것이다. 짧은 이동평균이 긴 이동평균을 아래에서 위로 뚫으면 사고(골든크로스), 반대면 판다(데드크로스).

내 봇도 여기서 시작했다. 빗썸에서 업비트로 옮긴 직후의 시대를 나는 MA봇 시절이라고 부르는데, 진입 판단이 통째로 이동평균 교차였기 때문이다. 지금 봇에는 이 규칙이 한 줄도 안 남아 있다. 왜 버렸는지가 이 글의 주제다.

평균의 종류부터

이동평균은 하나가 아니다. 실무에서 부딪히는 건 대개 세 가지다.

같은 이름, 다른 계산
SMA  단순이동평균   최근 n봉을 똑같은 무게로 평균
     close.rolling(n).mean()
     성질: n봉 전 값이 빠질 때 튄다 (드롭오프 효과)
EMA  지수이동평균   최근 값에 더 큰 무게, 과거는 지수적으로 감쇠
     close.ewm(span=n, adjust=False).mean()
     성질: 반응이 빠르다. 대신 노이즈도 빨리 받는다
RMA  와일더 평활   EMA 의 일종이지만 alpha = 1/n (더 무겁다)
     close.ewm(alpha=1/n, adjust=False).mean()
     성질: RSI·ATR 내부에서 쓰는 그 평균. EMA(n) 보다 느리다
주의: EMA(14) 와 RMA(14) 는 다른 값이다. alpha 가 2/15 대 1/14 로 다르다
교차 전략에서 SMA→EMA 로 바꾸면 신호 시점이 통째로 이동한다.
즉 '어떤 평균이냐' 는 파라미터가 아니라 전략의 일부다

이걸 먼저 정리하는 이유는, 백테스트 결과를 비교할 때 사람들이 기간(20/60)만 적고 종류(SMA/EMA)를 안 적는 일이 흔하기 때문이다. 같은 20/60 교차라도 SMA와 EMA는 전혀 다른 매매를 한다.

이동평균이 실제로 하는 일

교차 얘기로 넘어가기 전에 평균 자체가 무엇인지 한 번 짚자. 이동평균은 흔히 “추세선"이라고 불리지만, 신호처리의 언어로 보면 저역 통과 필터다. 빠른 진동을 걷어내고 느린 흐름만 남기는 장치.

평균이 걸러내는 것과 남기는 것
원본 가격 = 느린 흐름 + 빠른 진동(노이즈)
이동평균 통과 후 = 느린 흐름만 (거의)
기간 n 이 커질수록
  더 많은 진동을 제거한다 → 선이 매끈해진다
  동시에 더 느려진다 → 실제 변화를 늦게 반영한다
이건 트레이드오프가 아니라 물리적 제약이다
  노이즈를 지우려면 정보를 평균 내야 하고, 평균을 내려면 시간이 필요하다
"부드러우면서 빠른 이동평균" 같은 건 존재하지 않는다
HMA·ZLEMA 같은 변형들이 이 제약을 우회하려 시도하지만,
대개 과거를 외삽하는 방식이라 반전 구간에서 오버슈팅한다

마지막 항목을 짚는 이유는, “지연 없는 이동평균"을 표방하는 지표를 종종 보기 때문이다. 대부분은 과거 값의 기울기를 이용해 앞을 조금 내다보는 방식인데, 방향이 바뀌는 순간에는 그 외삽이 반대로 작동한다. 공짜로 얻어지는 건 없다는 원칙이 여기서도 성립한다.

핵심 문제 — 지연

이동평균은 정의상 과거의 평균이다. 그러니 현재 가격보다 늦다. 얼마나 늦느냐를 대충이 아니라 수치로 보면 이렇다.

지연의 크기
SMA(n) 의 무게중심은 n봉의 한가운데 → 이론적 지연 ≈ (n−1)/2 봉
  SMA(20)  ≈  9.5봉 지연
  SMA(60)  ≈  29.5봉 지연
15분봉 기준으로 환산하면
  SMA(20)  ≈  2시간 22분 전의 평균을 보고 있는 셈
  SMA(60)  ≈  7시간 22분 전
교차는 두 지연선이 만나는 시점이다 — 사건이 아니라 사건의 그림자
EMA 는 이보다 빠르지만 (span n 의 지연 ≈ (n−1)/2 를 넘지는 않음)
빨라진 만큼 가짜 교차도 늘어난다. 공짜는 없다

여기서 골든크로스의 정체가 드러난다. 골든크로스는 “지금부터 오른다"는 신호가 아니라 “이미 한동안 올랐다"는 사후 확인이다. 상승이 시작되고 짧은 평균이 따라 올라오고, 그게 긴 평균을 넘을 때까지 걸리는 시간만큼 가격은 이미 움직인 뒤다.

추세가 길게 이어지는 시장이라면 그래도 괜찮다. 남은 구간이 충분하니까. 문제는 그렇지 않은 시장이다.

휩쏘 — 교차 전략의 사망 원인

가격이 옆으로 기면 두 평균선이 서로 얽힌다. 그러면 교차가 연달아 터진다.

횡보장에서 벌어지는 일
가격 ──╲─╱─╲──╱╲──╱─╲──╱   (방향 없이 진동)
단기  ───╲╱───╲╱───╲╱───     긴 평균 근처에서 계속 교차
장기  ─────────────────
  ↑골든  ↓데드  ↑골든  ↓데드  ↑골든  …
  매수  손절   매수  손절   매수
비용 계산 (업비트 기준, 왕복 수수료 0.1% 가정)
  휩쏘 10회 = 수수료만 1.0% + 스프레드·호가 관통 별도
  저가 코인은 호가 한 칸이 0.2% 를 넘기도 한다 — 실측 사례 있음
즉 방향이 맞아도 자주 틀리면 수수료가 먼저 계좌를 비운다

호가 한 칸 이야기는 실제로 겪은 것이다. 본전 보호선을 +0.2%에 뒀는데 27건을 실측해 보니 평균 실현이 +0.017%였고 합계로는 마이너스였다. 원인은 슬리피지가 아니라 호가 관통이었다. 443원짜리 코인에서 호가 한 칸이 0.226%였으니, 0.2%짜리 선은 호가와 호가 사이 허공에 떠 있었던 셈이다. 관통 손실에 왕복 수수료를 더하면 손익분기가 0.283%였고, 그래서 바닥을 0.4%로 올렸다.

이 계산이 교차 전략에도 그대로 적용된다. 교차 한 번에 왕복 0.1%가 나가고, 호가가 넓은 종목이면 거기에 0.2%가 더 붙는다. 하루에 몇 번씩 교차가 뜨는 종목에서 이 전략을 돌리면 방향 예측의 정확도와 무관하게 진다.

골든크로스는 정말 통계적으로 유효한가

이 질문에 대해 내가 확답할 수는 없다. 내 매매기록으로 교차 전략을 제대로 스윕해본 적이 없기 때문이다. 다만 어떻게 확인해야 하는지는 말할 수 있다.

교차의 유효성을 재는 절차
가설: "골든크로스 이후 k봉 동안의 수익률이 무작위 시점보다 높다"
  ① 실험군  교차 발생 시점 이후 k봉 수익률을 전부 수집
  ② 대조군  같은 기간에서 무작위로 뽑은 시점의 k봉 수익률
  ③ 비교    실험군 평균이 대조군 분포의 바깥에 있는가
k 를 여러 값으로 (4, 16, 96봉 = 1시간·4시간·24시간) 각각 측정
추가로 봐야 할 것
  · 교차 직후 되돌림의 크기 (손절에 걸릴 확률)
  · 신호 빈도 (비용 계산의 분모)
주의: 상승장 구간만 뽑아 재면 무엇을 해도 이긴다
      상승·하락·횡보 구간을 각각 나눠서 봐야 한다

마지막 주의사항이 교차 전략 백테스트에서 특히 중요하다. 코인 시장은 큰 상승 구간이 몇 번 있었고, 그 구간을 포함해서 재면 추세추종 전략은 대부분 좋아 보인다. 문제는 그 구간이 아닐 때인데, 실전에서는 그런 시기가 훨씬 길다.

내가 이걸 안 재본 이유는 솔직하게 말하면 우선순위에서 밀렸기 때문이다. 이미 전략을 눌림목으로 바꿨고, 표본은 한정돼 있고, 재봐야 할 후보는 줄을 서 있다. 이미 버린 전략을 검증하는 데 표본을 쓰는 것보다 지금 쓰는 게이트를 다듬는 게 우선이었다.

다만 언젠가는 재보고 싶다. “교차를 버린 게 옳았나"를 감이 아니라 숫자로 확인하고 싶어서다. 지금은 “박스장에서 돌파가 대부분 가짜였다"는 관찰에 근거해 버렸는데, 그건 인상이지 측정이 아니다.

선을 여러 개 깔면 나아지나

교차의 휩쏘 문제를 겪은 사람들이 흔히 시도하는 게 이동평균을 여러 개 까는 것이다. 5, 10, 20, 60, 120을 동시에 그려놓고 순서가 가지런한지 보는 방식. 정배열이니 역배열이니 하는 말이 여기서 나온다.

여러 선을 쓰는 방식과 그 정체
정배열   5 > 10 > 20 > 60 > 120   (짧은 게 위)
역배열   5 < 10 < 20 < 60 < 120   (긴 게 위)
판정: 순서가 가지런한 봉 수를 세거나, 선들 사이 간격의 합을 본다
좋아지는 점
  교차 하나가 아니라 다섯 선의 합의를 요구 → 휩쏘가 확실히 줄어든다
나빠지는 점
  다섯 선이 다 정렬되려면 시간이 더 걸린다 → 지연이 더 커진다
  교차 1회의 지연이 SMA(60) 기준 30봉이라면, 정배열 완성은 그보다 늦다
즉 휩쏘와 지연을 맞바꾼 것이지 문제를 푼 게 아니다
이 교환이 이득인지는 그 시장의 추세 지속 길이에 달렸다 — 다시 측정 문제로 돌아온다

여기서 짚고 싶은 건 “조건을 더 붙이면 좋아진다"는 직관이 자주 틀린다는 점이다. 조건을 더하면 오탐은 줄지만 미탐은 늘고, 무엇보다 신호 빈도가 줄어 표본이 마른다. 표본이 마르면 그 조건이 실제로 좋은지 검증할 수도 없게 된다.

내 봇에서 이걸 정면으로 겪은 적이 있다. 단독으로는 성적이 좋았던 거래량 조건을 다른 게이트들 위에 얹었더니 후보가 46건에서 6건으로 줄었다. 87%가 사라진 것이다. 좋은 필터를 얻은 게 아니라 통행량을 죽인 결과였다.

승률이 낮아도 되는 전략, 그렇지 않은 전략

교차 전략을 옹호하는 흔한 논리가 있다. “승률은 낮지만 이길 때 크게 이기니까 괜찮다"는 것. 추세추종의 표준 서사다.

이 논리 자체는 건전하다. 문제는 그게 성립하려면 조건이 필요하다는 것이다.

낮은 승률이 감당되는 조건
기대값 = 승률 × 평균이익 − 패률 × 평균손실 − 비용
승률 30% 로 흑자를 내려면
  평균이익 / 평균손실 비율이 최소 2.34 이상이어야 한다 (비용 제외)
  비용까지 넣으면 3 이상은 필요하다
그 비율이 나오려면
  · 이익 분포에 긴 꼬리가 실제로 존재해야 한다
  · 그 꼬리를 끝까지 탈 수 있어야 한다 (오래 보유 가능)
  · 손실은 짧게 자를 수 있어야 한다 (슬리피지 작아야)
내 봇의 실측은 이 조건과 거리가 있었다
  눌림목 진입 18건 재현 — 최대 평가이익 중앙값 +3.09%
  이익 구간 체류시간 중앙값 0분
  긴 꼬리가 없고, 있어도 탈 시간이 없다

여기서 중요한 건 “추세추종이 나쁘다"가 아니라 내 시장과 내 시간축에서는 그 전제가 안 맞았다는 것이다. 일봉으로 몇 주씩 들고 가는 전략이라면 얘기가 완전히 달라진다.

이 판단은 손절 설계에서도 확인됐다. 실제 매매 58건을 손절선별로 재현했을 때, 손절이 아예 없으면 기대값이 −0.072%였고 −2.5%로 자르면 +0.209%로 뒤집혔다. 반대로 익절에 상한을 씌우면 기대값이 다시 음수가 됐다. 손실은 자르고 이익은 풀어주라는 격언이 내 계좌의 숫자로 확인된 셈이다.

그런데 같은 데이터가 다른 것도 말해줬다. 어떤 익절 수준을 골라도 결과의 중앙값이 −2.100%로 고정됐다는 것. 즉 이익 쪽을 아무리 잘 설계해도 손실 11건(61%)이 결과를 좌우하고 있었다. 이익을 늘리는 것보다 손실을 줄이는 게 훨씬 큰 지렛대였다.

교차 전략의 문제도 결국 여기로 모인다. 휩쏘가 만드는 잦은 작은 손실이 전체를 갉아먹는데, 그 손실은 방향 예측을 잘한다고 줄어들지 않는다. 신호 빈도 자체가 만드는 구조적 비용이기 때문이다.

그럼 왜 아직도 쓰이나

그런데 이동평균은 여전히 거의 모든 차트에 깔려 있다. 이유가 있다.

첫째, 추세 필터로서는 훌륭하다. 진입 신호로 쓰지 않고 “지금 이 종목이 장기 평균 위에 있나 아래에 있나"만 보면, 느린 게 오히려 장점이 된다. 느리다는 건 잘 안 바뀐다는 뜻이고, 잘 안 바뀌는 기준선은 필터로 좋다.

둘째, 모두가 본다. 60일선, 120일선 같은 숫자는 실제로 많은 사람이 주문을 걸어두는 자리다. 피보나치 편에서 다뤘던 자기실현 구조와 같은 논리다. 근거가 약해도 참여자가 많으면 실재가 된다.

내 봇에서 이동평균의 최후
MA봇 시절     진입 판단 = 이동평균 교차 (전략의 전부)
단일파일 시절  교차 + 게이트 여러 개로 보강 → 교차의 비중이 줄어듦
돌파 전략기    교차 대신 고점 돌파가 트리거 자리를 가져감
눌림목 전환    교차 완전 제거 — 방향이 정반대인 전략으로 갈아탐
현재          진입 판정에 이동평균 교차 없음
              대신 중기추세 게이트가 그 역할의 일부를 대신한다
              (며칠 고점 대비 낙폭 상한 — '너무 안 빠진 것' 을 거른다)

마지막 줄이 재밌는 대목이다. 중기추세 게이트를 처음 넣었을 때 값을 -12%로 뒀다가 나중에 -30%로 크게 풀었는데, 그 커밋 제목이 “게이트가 전략과 반대로 작동"이었다. 눌림목 전략은 빠진 걸 사는 전략인데, 고점 대비 -12% 이내만 통과시키는 게이트는 안 빠진 것만 통과시키고 있었다. 게이트 하나하나는 그럴듯한데 전략과 방향이 어긋나 있던 것이다.

이동평균 교차도 같은 종류의 문제였다. 교차는 “오르기 시작한 것을 따라 타는” 논리인데, 눌림목은 “빠진 것을 미리 줍는” 논리다. 두 문법은 같은 봇 안에서 공존하기 어렵다.

그래도 살릴 자리

버렸다고 해서 쓸모가 없다는 뜻은 아니다. 지금의 내 봇에 이동평균을 다시 넣는다면 세 곳이 후보다.

재도입 후보와 검증 설계
① 시장 레짐 보조   BTC 4시간봉이 장기 평균 아래면 신규 진입 금지
   현행은 다른 방식으로 같은 판정을 이미 하고 있다 — 대체가 아니라 대조군
② 이격도 게이트     가격이 평균에서 얼마나 떨어졌나 (%)
   눌림목 전략과 문법이 맞는다. 많이 떨어진 것을 찾는 지표이므로
③ 청산 기준선       진입 후 단기 평균 하향 이탈 시 청산
   현행 손절은 고정 -5%. 평균 기반 동적 손절과 비교해볼 가치 있음
검증: ②를 먼저. 축은 기간(10/20/60) × 이격 임계(-3%/-5%/-8%) × 평균종류(SMA/EMA)
      기존 저점근접·낙폭 게이트와 상관이 높을 것으로 예상 —
      독립적인 정보를 주는지가 채택의 관건이다

마지막 줄이 핵심이다. 게이트가 이미 열 개 서 있는 시스템에 열한 번째를 넣을 때 물어야 할 건 “이게 좋은 지표인가"가 아니라 “이게 나머지 열 개가 못 보는 걸 보는가“다. 이격도는 낙폭 게이트와 재는 대상이 거의 같아서, 새 정보를 못 줄 가능성이 크다. 그러면 통과 후보만 깎고 성과는 그대로인 중복 검문소가 된다.

MA봇 시절에 실제로 있었던 일

이 시대를 좀 더 구체적으로 적어두는 게 이 글에 도움이 될 것 같다. 이동평균 교차로 봇을 돌린다는 게 실제로 어떤 모습이었는지.

MA봇 시절의 구조
진입 판단   이동평균 교차 (그게 전부였다)
종목 선정   초기엔 내가 지정 → 이후 전 종목 스캔으로 전환
슬롯        동시 보유 개수 제한 — 이 개념이 이때 생겼다
상태 저장   봇이 죽었다 살아나도 포지션을 기억
블랙리스트  건드리지 않을 종목 목록
이때 만들어져 461개 버전을 지나 지금도 살아 있는 것들이다
반면 진입 로직(교차)만 통째로 사라졌다
뼈대는 남고 전략은 갈린다 — 아키텍처와 전략의 수명이 다르다는 얘기

마지막 줄이 이 시절을 돌아보며 가장 크게 느끼는 부분이다. 그때 만든 것 중 전략은 하나도 안 남았는데 구조는 거의 다 남았다. 슬롯이라는 개념, 상태를 파일로 저장하는 습관, 종목을 스캔해서 후보를 만드는 파이프라인.

특히 상태 저장이 중요했다. 봇이 죽는 건 언제든 일어나는 일이고, 죽었다 살아났을 때 자기가 뭘 들고 있는지 모르면 그때부터 사고가 시작된다. 이건 전략과 무관하게 필요한 기반이었다.

교차 로직 자체는 이후 여러 번 형태를 바꾸다 사라졌다. 처음엔 교차 하나로 샀고, 그다음엔 교차에 다른 조건을 붙였고, 돌파 전략기에는 트리거 자리를 고점 돌파에 내줬고, 눌림목 전환에서는 아예 제거됐다.

통신 문제 — 지표보다 먼저 겪은 것

MA봇 시절 얘기를 하면 빼놓을 수 없는 게 하나 더 있다. 지표가 아니라 데이터를 받아오는 문제였다.

종목을 몇백 개씩 스캔하기 시작하니 REST로 하나씩 조회하는 방식이 감당이 안 됐다. API 호출 제한에 걸리고, 응답이 느려지고, 어떤 종목은 데이터가 비어서 돌아왔다. 그래서 웹소켓을 도입했는데 이번엔 연결이 끊기는 문제가 생겼다.

통신 안정성이 밟아온 계단
REST 폴링         종목 수가 늘자 한계
웹소켓 도입       실시간 수신, 대신 연결 끊김 문제
3회 재시도        끊기면 세 번까지 다시
지수 백오프       재시도 간격을 1초 → 2 → 4 → … 최대 60초까지
연결 상태 추적    끊긴 횟수·마지막 수신 시각을 상태로 관리
요청 ID 부여      어떤 호출이 실패했는지 추적 가능하게
지표를 아무리 잘 만들어도 데이터가 안 들어오면 소용없다
자동매매에서 통신 안정성은 전략만큼 중요한 축이다

지표 스터디 글에 통신 얘기를 넣는 게 이상해 보일 수 있는데, 실제로 봇을 만들면 이쪽이 시간을 훨씬 많이 잡아먹는다. RSI 계산은 다섯 줄이면 되지만, 그 계산에 넣을 캔들을 안정적으로 받아오는 일은 훨씬 어렵다.

지난 편에서 “지표는 봇의 10%“라고 썼는데, 나머지 90% 중 상당 부분이 이런 것들이다. 데이터 수집, 완성봉 확정, 체결 확인, 원장 대조. 화려하지 않고 블로그 글감으로도 재미없지만, 이게 안 되면 아무리 좋은 지표도 무의미하다.

교차 전략을 정직하게 백테스트하는 법

혹시 직접 검증해볼 분을 위해, 이 전략을 재는 데 필요한 최소 절차를 적어둔다. 교차 전략은 백테스트가 특히 잘 속는 종류라서 그렇다.

교차 백테스트에서 반드시 넣어야 할 것
① 비용을 넣는다
   왕복 수수료 + 스프레드 + 호가 관통. 비용 없는 백테스트는 전부 이긴다
   신호 빈도가 높은 전략일수록 이 항목 하나로 결과가 뒤집힌다
② 완성봉으로 판정한다
   진행봉 종가로 교차를 판정하면 봉 안에서 신호가 생겼다 사라진다
   실전에서 재현 불가능한 매매를 백테스트가 만들어낸다
③ 체결 가격을 현실적으로 잡는다
   교차 봉의 종가에 체결됐다고 가정하면 안 된다 — 그건 판정 시점이지 주문 시점이 아니다
   최소한 다음 봉 시가, 보수적으로는 거기에 슬리피지를 더한다
④ 종목을 여러 개 돌린다
   한 종목에서 잘 나온 20/60 은 그 종목의 그 기간에 맞춘 값일 뿐이다
⑤ 기간을 반으로 갈라 앞뒤에서 각각 성립하는지 본다
   전체 기간에서만 좋은 값은 과적합일 확률이 높다
이 다섯을 다 넣고도 이기면, 그때는 진짜일 가능성이 있다

⑤번은 내가 파라미터를 확정할 때 쓰는 절차이기도 하다. 게이트 열한 개 축을 전수 스윕하면서 조합 검증과 기간 반분 안정성 체크를 함께 돌렸고, 수익·승률·손절권 진입률이 동시에 개선되는 값만 채택했다. 한 축만 좋아지고 다른 게 나빠지는 값은 아무리 수익률이 높아도 버렸다.

한 가지 더 — 기간 숫자의 출처

20, 60, 120 같은 숫자가 어디서 왔는지 아는 사람은 의외로 적다. 대부분 주식 시장의 달력에서 왔다. 한 달 거래일이 대략 20일, 분기가 60일, 반년이 120일이다.

코인 시장에는 이 달력이 없다. 주말도 없고 폐장도 없다. 그러니 20일선이 “한 달 평균"이라는 의미가 성립하지 않는다. 그럼에도 다들 20/60/120을 쓴다.

기간 숫자를 다시 정한다면
주식에서 온 숫자        코인 15분봉으로 환산
  20일  = 한 달        20봉  = 5시간
  60일  = 분기         60봉  = 15시간
  120일 = 반년         120봉 = 30시간
환산해 보면 의미가 전혀 다르다 — 같은 숫자를 쓸 이유가 없다
코인 시장의 자연스러운 주기라면
  96봉  = 24시간   (하루)
  672봉 = 7일      (일주일)
그런데도 20/60 을 쓰는 게 완전히 틀렸다고 하기도 어렵다 —
많은 사람이 그 선을 보고 있다면, 그 선이 실제로 작동하기 때문이다

이 딜레마는 피보나치 편에서 다룬 자기실현 문제와 정확히 같다. 근거가 없는 기준선도 참여자가 충분하면 실재가 된다. 그래서 답은 “어느 쪽이 맞나"가 아니라 “둘 다 후보로 놓고 재본다“가 된다. 20/60과 96/672를 나란히 스윕해서 어느 쪽이 내 매매기록에서 나은지 보는 것. 이론으로 못 정하는 건 측정으로 정한다.

교차 대신 쓰는 것들

교차를 버린 자리에 무엇이 들어왔는지도 적어두는 게 공평하겠다. 같은 질문 — “지금 이 종목을 살 만한가” — 에 다른 방식으로 답하는 조건들이다.

교차가 있던 자리를 채운 것들
교차가 하던 일: "방향이 바뀌었나" 를 판정
현행에서 그 질문을 나눠 맡은 조건들
  RSI 45 이하        충분히 빠졌나 (에너지 배분)
  저점근접 3.0       지금 바닥 근처인가 (위치)
  반등 확인          저점에서 살짝 올라왔나 (돌기 시작했나)
  중기추세 게이트     며칠째 흘러내리는 중은 아닌가
  거량 0.6x          죽은 종목은 아닌가
  BTC 4시간봉 레짐    시장 전체가 무너지는 중은 아닌가
교차 하나가 하던 판정을 여섯 개가 나눠 맡는 구조
각각은 교차보다 단순하다. 대신 겹쳐서 본다
대가: 조건이 늘수록 신호가 줄고, 튜닝할 파라미터도 늘어난다

이 구조의 장점은 어디가 문제인지 알 수 있다는 것이다. 교차 하나로 판정할 때는 신호가 안 나오면 그냥 안 나오는 것이었다. 지금은 게이트별 통과율이 찍히니 어느 관문이 병목인지 바로 보인다.

단점도 분명하다. 파라미터가 여섯 개면 조합의 수가 폭발한다. 각각을 독립적으로 튜닝하면 조합에서 무너지고, 조합까지 다 훑으면 계산량이 감당이 안 된다. 그래서 축별 스윕 → 상위 조합 재검증이라는 두 단계 절차를 쓴다.

그리고 조건이 늘수록 과적합 위험이 커진다는 점도 인정해야 한다. 파라미터 여섯 개를 8.9일치 기록에 맞추면, 그 기록에만 잘 맞는 값이 나올 확률이 높다. 기간을 반으로 갈라 앞뒤에서 모두 성립하는지 확인하는 절차를 넣은 게 그래서인데, 그것도 위험을 줄일 뿐 없애지는 못한다.

한 줄 요약을 굳이 남긴다면

이동평균 교차를 쓰려는 사람에게 딱 세 가지만 확인시키고 싶다.

첫째, 내가 쓰는 게 SMA인지 EMA인지 알고 있는가. 같은 20/60이라도 다른 전략이다. 둘째, 신호 한 번당 왕복 비용이 얼마인지 계산해봤는가. 하루 몇 번 신호가 나는지와 곱해보면 수익률 얘기를 꺼내기 전에 답이 나오는 경우가 많다. 셋째, 이 전략이 잘 통하려면 추세가 얼마나 길게 이어져야 하는지 아는가. 지연이 30봉이면 최소한 그보다 긴 추세가 필요하다.

세 질문 다 지표에 관한 게 아니라 내 시장과 내 비용 구조에 관한 것이다. 지표는 어디서 가져와도 되지만 이 답은 내가 직접 재야 한다. 나는 그걸 몰라서 MA봇 시절을 한 달 가까이 보냈고, 그 시간이 아깝지는 않지만 다시 하고 싶지도 않다.

버린 전략을 기록으로 남기는 이유

블로그에 실패한 전략 이야기를 쓰는 게 이상해 보일 수 있다. 보통은 잘된 것만 쓰니까.

그런데 나한테는 이쪽이 더 중요하다. 이유가 둘 있다.

첫째, 같은 실수를 반복하지 않기 위해서다. 몇 달 뒤에 다시 이동평균 교차가 좋아 보이는 순간이 올 수 있다. 그때 이 글이 있으면 “아, 이래서 버렸지"를 기억할 수 있다. 없으면 다시 시도하고 다시 같은 곳에서 막힌다.

둘째, 잘된 것만 남기면 기록이 아니라 광고가 되기 때문이다. 461개 버전 중 성공한 건 소수고, 나머지는 전부 이런 종류의 시행착오였다. 그 비율을 감추면 봇 개발이 실제보다 쉬워 보이고, 그건 읽는 사람에게 도움이 안 된다.

이 봇에서 붙였다 뗀 것들 (일부)
이동평균 교차       진입 판정 → 완전 제거
돌파 게이트         진입 트리거 → 박스장 무력화로 폐지
거래량 게이트       두 번 제거, 한 번 부활 (설계를 바꿔서)
분할익절 (TP 사다리)  큰 상승을 놓치는 구조로 판정 → 비활성화
포지션 이분할       하루 만에 철회
시간대 진입 차단     실측으로 도입 → 매수 가뭄으로 해제
개별 손절 제거       위험한 실험 → 13버전 뒤 복원
C++ 포팅            완성 전 중단
살아남은 것: 슬롯 · 상태 저장 · 손절 · 본전 사수 · 원장 대조 · 레짐 차단
지운 목록이 남긴 목록보다 길다. 그게 정상이라고 생각한다

이 목록을 보면 공통점이 하나 보인다. 살아남은 건 대부분 방어 장치이고, 사라진 건 대부분 진입 아이디어다.

우연이 아니라고 생각한다. 진입 조건은 시장 상황에 따라 유효성이 바뀌지만, 잃지 않는 구조는 어떤 장에서도 필요하다. 7주 연속 마이너스를 겪고 나서야 이 순서를 받아들였다 — 잃지 않는 구조를 먼저 만들고, 버는 건 그다음이라는 것.

마무리

이동평균 교차는 내 봇이 처음 배운 규칙이고, 가장 먼저 버린 규칙이다. 그런데 버리는 과정에서 배운 게 지표 자체보다 값졌다. 신호의 지연을 봉 수로 환산해보는 습관, 왕복 비용을 신호 빈도와 곱해보는 습관, 그리고 새 조건을 넣기 전에 기존 조건과의 중복부터 의심하는 습관.

교차 전략을 폄하할 생각은 없다. 다만 그게 잘 통하는 시장 — 추세가 길고, 수수료 비중이 작고, 호가가 촘촘한 시장 — 이 따로 있다는 것을 알고 쓰는 것과 모르고 쓰는 것은 완전히 다른 일이다. 나는 모르고 썼고, 그 수업료를 계좌로 냈다.

덧붙임 — 이동평균을 쓰는 다른 방법 하나

버린 전략을 소개하고 끝내면 아쉬우니, 지금도 유효하다고 생각하는 쓰임 하나를 남긴다. 이격도다.

이격도는 가격이 이동평균에서 얼마나 떨어져 있는지를 백분율로 재는 값이다. 계산은 간단하다.

이격도 — 교차보다 눌림목 전략에 맞는 쓰임
이격도 = (현재가 − 이동평균) / 이동평균 × 100
  양수  평균 위에 있다
  음수  평균 아래로 떨어져 있다
왜 눌림목 전략과 문법이 맞나
  교차는 '오르기 시작한 것' 을 찾는다 — 내 전략과 방향이 반대
  이격도는 '많이 떨어진 것' 을 찾는다 — 방향이 같다
다만 예상되는 문제: 기존 낙폭 게이트와 재는 게 거의 같다
  낙폭 게이트  = 며칠 고점 대비 얼마나 빠졌나
  이격도       = 평균 대비 얼마나 빠졌나
  기준점만 다를 뿐 '얼마나 빠졌나' 라는 질문은 동일하다
  → 상관이 높으면 중복 검문소가 된다. 검증 1순위 확인 항목

이 후보를 아직 안 넣은 이유가 마지막 항목이다. 새 조건을 넣기 전에 기존 조건과의 상관부터 봐야 하는데, 이격도는 낙폭 게이트와 상관이 높을 가능성이 크다. 그러면 통과 후보만 깎고 성과는 그대로인 결과가 나온다.

그럼에도 재볼 가치는 있다고 본다. 기준점이 다르다는 건 미묘하지만 실제 차이를 만들 수 있다. 고점 대비 낙폭은 한 지점(고점)을 기준으로 하고, 이격도는 여러 봉의 평균을 기준으로 한다. 고점이 이상치였다면 두 값이 크게 갈린다.

이런 식으로 후보 목록에 올려두고 순서를 기다리는 아이디어가 여러 개 있다. 전부 재보면 좋겠지만 표본이 한정돼 있어서, 기대 효과가 큰 것부터 차례로 가는 수밖에 없다. 검증할 수 있는 양이 개발 속도의 상한을 정한다는 게 이 시기에 배운 또 하나의 사실이다.