오늘의 재료 — 지표가 아니라 세계관

이 코너에서 다룬 것들은 지금까지 전부 ‘계산’이었다. RSI는 함수고, 거래량은 원자료고, SMC와 피보나치도 결국 비교문 묶음이었다. 오늘의 재료는 급이 다르다. 엘리엇 파동은 계산이 아니라 세계관이다 — 시장의 모든 움직임이 집단 심리의 리듬에 따라 5개의 추진 파동과 3개의 조정 파동으로 진행된다는, 1930년대 랄프 넬슨 엘리엇의 이론. 그리고 미리 결론을 적어두면, 이 이론은 내 봇에 통째로 들어갈 수 없다. 그런데도 한 편을 쓰는 이유는 해부 과정에서 나오는 부산물 — 반증 가능성이라는 칼 — 이 지표 스터디 전체를 관통하는 주제이기 때문이다.

elliott wave — 5-3 기본 구조
        충격파 (Impulse, 추세 방향)          조정파 (Correction)
                        5
                   3   ╱╲                  ╲  B
                  ╱╲  ╱  ╲                A ╲ ╱╲
                 ╱  ╲╱    ╲                  ╲╱  ╲
            1   ╱   4      ╲                      ╲ C
           ╱╲  ╱             ╲                     ╲
          ╱  ╲╱               ─ 이후 한 단계 큰 파동의 부품이 됨
         ╱   2
  프랙탈: 파동 1 안에도 다섯 파동이, 그 안에도 다섯 파동이 — 전 시간축 자기유사
  피보나치 결합: 파동 목표·되돌림 깊이를 φ 비율로 잰다 (지난 편과 직결)

뼈대: 절대 규칙 3개 — 이론에서 유일하게 단단한 부분

엘리엇 이론의 방대한 서사 속에서 예외 없는 규칙은 딱 3개다. 나머지(연장, 절단, 교대 지침 등)는 전부 ‘경향’이고, 이 셋만이 위반되면 카운팅 자체가 무효가 되는 절대 규칙이다. 그리고 흥미롭게도 — 이 3개는 완벽하게 코드로 옮겨진다.

three hard rules — 이론에서 코드로 넘어올 수 있는 전부
규칙 1   파동 2는 파동 1의 시작점 아래로 내려갈 수 없다
         wave2_low > wave1_start          # 위반 시 카운팅 무효
규칙 2   파동 3은 1·3·5 중 가장 짧을 수 없다
         len(w3) > min(len(w1), len(w5))  # 대개 3파가 최장
규칙 3   파동 4는 파동 1의 가격 영역을 침범할 수 없다
         wave4_low > wave1_high           # (현물 기준 고전 규칙)
이 세 줄이 '무효화 라인' 이다 — 가설이 틀렸음을 아는 지점.
나머지 지침들: 교대(2파와 4파는 형태가 다르다), 연장(한 파동이 길어진다),
채널링, 파동 균등 … 전부 '경향' — 판정식이 아니라 서사

여기서 이 이론의 실용적 core가 보인다. 엘리엇 파동의 진짜 기여는 “다음에 5파가 온다"는 예언이 아니라, “내 시나리오가 틀렸다는 것을 어느 가격에서 인정할 것인가"를 강제하는 구조다. 파동 2 시나리오로 샀다면 파동 1 시작점이 무효화 라인이고, 무효화 라인은 봇의 언어로 번역하면 정확히 손절선이다. 서사는 못 가져와도 이 구조는 가져올 수 있다.

파동을 세려면 먼저 스윙을 세야 한다 — ZigZag

파동 카운팅의 입력은 캔들이 아니라 스윙이다. 그래서 어떤 엘리엇 자동화 시도든 첫 공정은 ZigZag — 일정 임계 이상 움직였을 때만 방향 전환을 인정해 지그재그 선분으로 압축하는 알고리즘이다.

python — ZigZag: 파동 카운팅의 전처리기
# 반전 임계 pct 이상 움직일 때만 방향 전환을 인정
def zigzag(price, pct=0.05):
    piv, direction, last = [], 0, price.iloc[0]
    for i, p in enumerate(price):
        chg = (p - last) / last
        if direction >= 0 and chg <= -pct:   piv.append((i,'H',last)); direction, last = -1, p
        elif direction <= 0 and chg >= pct:  piv.append((i,'L',last)); direction, last =  1, p
        elif (direction >= 0 and p > last) or (direction <= 0 and p < last): last = p
    return piv
# 함정: 마지막 선분은 항상 미확정이다 — 임계를 넘기 전엔 전환인지 알 수 없다
#       차트의 ZigZag 가 '리페인트' 한다는 말이 이것. 봇은 확정분만 써야 한다
# 함정: pct 는 하이퍼파라미터다. 이 값 하나가 파동의 개수를 통째로 바꾼다

두 번째 함정이 다음 절의 주제로 이어진다. 파동 이론은 “시장은 5-3 구조로 움직인다"고 말하지만, 정작 그 5와 3을 세기 위한 스윙의 정의는 이론이 제공하지 않는다. 임계값은 분석가가 고른다 — 그리고 고른 순간, 결론의 절반이 정해진다.

문제: 카운팅의 조합 폭발 — 같은 차트, 열 개의 진실

그럼 왜 통째로는 못 넣는가. 파동을 ‘세는’ 작업이 알고리즘이 아니기 때문이다. 파동의 최소 단위인 스윙부터가 임계값의 함수다 — ZigZag 지표로 스윙을 뽑을 때 반전 임계를 3%로 주면 파동이 수십 개, 7%로 주면 몇 개가 된다. 임계마다 다른 파동 세계가 열리고, 그 각각 위에서 규칙 3개를 만족하는 카운팅이 또 여러 개 존재한다.

the counting problem — 임계값이 세계를 바꾼다
같은 가격 데이터, ZigZag 반전 임계만 변경:
  임계 3%   ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲    스윙 16개 → 가능한 카운팅 다수
  임계 5%   ╱╲  ╱╲  ╱╲  ╱╲      스윙  8개 → 다른 카운팅 다수
  임계 7%   ╱ ╲╱  ╲ ╱ ╲         스윙  5개 → 또 다른 카운팅
  어느 임계가 '진짜 파동' 인가? — 이론은 답을 주지 않는다
  실무 격언: "엘리엇 분석가 열 명 = 카운팅 열한 개"
  그리고 결정타 — 사후 재라벨링:
  가격이 예상을 깨면 카운팅을 소급 수정한다. "그건 3파가 아니라 C파였다"
  이론은 영원히 옳고, 틀리는 것은 항상 카운팅이다 → 반증 불가능

마지막 두 줄이 핵심이다. 피보나치 편에서 “틀리면 스윙을 잘못 그은 것"이라는 도피처를 봤는데, 엘리엇은 그 도피처가 이론의 공식 문법에 내장돼 있다. 예측이 빗나가면 카운팅을 다시 세면 되고, 다시 센 카운팅은 언제나 지나간 가격과 정합한다. 사후적으로는 항상 옳고 사전적으로는 거의 아무것도 확정하지 않는 이론 — 과학철학의 언어로는 반증 불가능이다. 그리고 반증 불가능한 것은 백테스트도 불가능하다. 백테스트란 조직적 반증 시도의 다른 이름이니까.

봇 번역 실험 — 절반은 담긴다

그래도 번역을 시도해 보면 어디까지 되는지가 보인다. 되는 것과 안 되는 것의 경계가 이 글의 수확이다.

translation — 엘리엇을 봇에 넣으려는 시도의 결산
번역 가능 (판정식이 존재)
  ① 스윙 추출          ZigZag(임계 고정) — 단, 확정 지연 명시 (SMC 편과 동일)
  ② 규칙 3개 검사      스윙 5개 조합마다 규칙 1·2·3 통과 여부 → 유효 카운팅 목록
  ③ 무효화 라인        시나리오별 '여기 깨지면 포기' 가격 → 손절선으로 직역
  ④ 보조 통계          "3파 최장" 경향의 실측 — 추세 구간 길이 분포 측정
번역 불가능 (판정식이 없음)
  ⑤ 유일 카운팅 선택   유효 카운팅 여러 개 중 '진짜' 고르기 — 기준 부재
  ⑥ 파동 등급 판정     지금이 3파인지 C파인지 — 사후에만 확정
  ⑦ 예측              "다음은 5파" — ⑤⑥이 안 되므로 연쇄 붕괴
결산: 서사(⑤⑥⑦)는 버리고 구조(①②③④)만 수입한다

번역 가능 목록을 다시 보면 낯익다. ①은 SMC의 스윙 구조 감지이고, ③은 손절선이고, ④는 추세 지속 길이의 통계다 — 전부 엘리엇이라는 이름 없이도 성립하는 부품들이다. 결국 엘리엇 파동에서 봇으로 수입되는 것은 이론의 고유 주장(시장은 5-3 리듬으로 움직인다)이 아니라, 이론이 강제하는 규율의 형식(시나리오에는 무효화 지점이 있어야 한다)이다. 내 봇은 이 형식을 이미 다른 경로로 갖고 있다. 진입마다 손절선이 계산되고(-5%), 본전 사수 무장선이 있고(+0.8/+0.4), 레짐이 깨지면 신규 진입이 서고(BTC 4시간봉 차단), 자산 서킷브레이커가 최후 방어선(300만원)을 지킨다 — 전부 “여기가 깨지면 내 가설이 틀린 것"의 코드화다. 엘리엇 분석가의 무효화 라인과 내 봇의 손절선은 같은 철학의 두 방언이다.

그래도 측정할 것 — 서사를 뺀 통계 가설

이론을 반납한다고 해서 배울 게 없는 것은 아니다. 엘리엇의 주장들 중 몇 개는 서사를 벗기면 측정 가능한 통계 가설로 번역된다. 파동 등급을 알아맞힐 필요 없이, 분포만 보면 되는 것들이다.

testable claims — 파동 서사에서 뽑아낸 통계 가설
가설 A  "3파가 가장 길다"  →  추세 구간 길이 분포의 검정
        ZigZag 선분을 방향별로 나열, 연속 상승 선분 중 2번째가
        1·3번째보다 긴 빈도가 무작위 기대치를 넘는가
가설 B  "2파와 4파는 형태가 다르다(교대)"  →  되돌림 깊이의 자기상관
        직전 조정이 얕았으면 다음 조정은 깊은 경향이 있는가 (상관계수)
가설 C  "5파 완성 후 3파 조정"  →  N연속 추세 후의 조건부 수익률
        상승 선분 3개 연속 뒤 진입 시 기대값 vs 무조건 진입 기대값
공통 절차: ZigZag 임계 3종(3%·5%·7%) 각각에서 독립 측정
          한 임계에서만 성립하면 그것은 발견이 아니라 우연이다
결과 칸은 비어 있다 — 측정 전이므로.

이 세 가설의 공통점은 파동에 이름표를 붙이지 않아도 검정된다는 것이다. “지금이 3파인가"를 묻지 않고 “연속 상승 선분 중 두 번째가 긴 경향이 있는가"를 묻는다. 질문을 이렇게 바꾸는 순간 반증 가능해지고, 반증 가능해지는 순간 백테스트에 올릴 수 있다. 이론을 통째로 수입하는 대신 이론이 낳은 가설만 골라 수입하는 것 — 이것이 내가 찾은 타협점이다.

개발자의 눈 — 반증 가능성이라는 단 하나의 심사 기준

지표 스터디 여섯 편째, 심사 기준이 하나로 수렴했다. RSI와 거래량은 함수라서 통과. SMC는 서사를 벗기면 비교문이라서 통과. 피보나치는 스윙 정의를 고정하고 대조군을 세우면 가설로 승격되어 조건부 통과. 엘리엇은 — 규칙 3개와 무효화 구조만 통과, 나머지는 반증 불가능이라 탈락. 심사 기준은 시종일관 하나였다. 이것이 틀렸다면, 틀렸다는 것을 어떻게 알 수 있는가?

이 기준은 지표만이 아니라 개발 규율 전체에 적용된다. 커밋마다 근거 수치를 요구하는 것(검증 없이 배포 없다), 예상이 빗나가면 왜 빗나갔는지 추적 가능하게 근거를 기록해 두는 것, 파라미터마다 측정 조합의 전제조건을 남기는 것 — 461개 버전의 규율은 전부 “내가 틀렸음을 빨리, 정확하게 알기 위한” 장치들이다. 시장에서 오래 살아남는 것은 옳은 사람이 아니라 자기가 틀렸음을 빨리 아는 사람이라는 게, 수업료를 내고 배운 내 결론이다.

프랙탈이라는 진짜 통찰 — 그리고 그 대가

이론에서 서사를 걷어내고도 살아남는 통찰이 하나 더 있다. 프랙탈 구조다. 파동 1 안에 다섯 파동이 있고 그 안에 또 다섯이 있다는 주장 — 즉 시장의 움직임은 시간축을 바꿔도 비슷하게 생겼다는 것. 이건 엘리엇의 독창적 관찰이었고, 훗날 만델브로가 수학적으로 파고든 주제이기도 하다. 15분봉을 확대하면 1분봉처럼 보이고, 축소하면 4시간봉처럼 보이는 경험은 차트를 오래 본 사람이면 누구나 안다.

fractal — 자기유사성이 봇에 주는 것과 뺏는 것
주는 것 — 다중 시간축 설계의 근거
  같은 판정 로직을 여러 TF 에 재사용할 수 있다
  내 봇의 사례: 진입 판정은 15분봉, 레짐 판정은 BTC 4시간봉 (VV202)
  하위 TF 는 타이밍, 상위 TF 는 허가 — 역할 분리가 프랙탈 위에서 성립
뺏는 것 — 시간축 특권의 부재
  "어느 TF 가 진짜인가" 에 이론은 답하지 않는다
  15분 기준 3파가 4시간 기준으로는 1파의 일부일 수 있다
  → 카운팅의 조합 폭발(앞 절)이 시간축 방향으로 한 번 더 일어난다
봇의 타협: TF 를 이론이 아니라 운용 목적으로 고정한다
  "슬롯 회전이 하루 단위이므로 진입은 15분, 레짐은 4시간" — 근거가 실무에 있다

프랙탈은 봇에 다중 시간축 설계의 정당성을 준다. 실제로 내 봇의 구조가 그렇다 — 종목 진입은 15분봉으로 보고, 시장 전체의 허가 여부는 BTC 4시간봉 레짐으로 판정한다(VV202). 하위 TF는 타이밍을, 상위 TF는 허가를 담당하는 이 역할 분리는 시장이 시간축을 넘나들며 비슷하게 생겼다는 전제 위에서 성립한다. 그런데 같은 프랙탈이 대가도 청구한다 — 어느 시간축이 ‘진짜’인지 이론은 알려주지 않는다. 그래서 나는 시간축을 이론이 아니라 운용 목적으로 고른다. 슬롯 회전 주기가 하루 단위라서 15분봉을 쓰는 것이지, 15분봉이 시장의 참된 리듬이라서가 아니다. 근거를 이론이 아니라 내 운용 조건에 두면, 적어도 왜 그 값인지에는 언제나 답할 수 있다.

소회

엘리엇 파동을 공부하고 나면 이상한 존경심이 남는다. 1930년대에, 컴퓨터도 없이, 시장의 프랙탈 구조와 집단 심리의 리듬을 통찰한 사람의 눈은 진짜였다고 생각한다. 문제는 그 통찰이 판정식이 아니라 해석의 예술로 전승됐다는 것이다. 예술은 대가를 만들지만 봇을 만들지는 못한다.

한 가지 덧붙이자면, 이 이론이 오래 살아남은 진짜 이유는 적중률이 아니라 설명력이라고 생각한다. 사람은 무작위 속에서도 이야기를 찾도록 만들어져 있고, 엘리엇은 시장에 붙일 수 있는 가장 정교한 이야기 문법을 제공했다. 지나간 차트를 파동으로 설명하면 모든 급등과 급락에 이름이 붙고, 이름이 붙으면 이해했다는 감각이 온다. 그 감각이 진짜 이해인지 아닌지를 가르는 것이 다음 봉에서의 예측력인데 — 바로 그 지점에서 이론은 카운팅 수정이라는 뒷문으로 빠져나간다. 매혹적인 이야기와 검증 가능한 모델 사이의 거리를, 나는 이 이론을 공부하면서 가장 선명하게 배웠다.

그래서 이 글은 엘리엇 파동의 부고가 아니라 분해 보고서다. 세계관은 정중히 반납하고, 규칙 3개와 무효화의 형식은 수입한다. 시나리오를 세우되 그 시나리오가 죽는 가격을 먼저 적는 것 — 이 습관 하나가 이론 전체에서 살아남은 알맹이고, 그 알맹이는 이미 내 봇의 손절선 안에서 일하고 있다. 파동을 세는 일은 앞으로도 사람의 예술로 남겨두려 한다. 내 봇은 세지 않는다. 대신 측정한다.

칼 포퍼는 과학과 비과학을 가르는 기준으로 반증 가능성을 제시했다 — 어떤 관찰로도 부정될 수 없는 이론은 모든 것을 설명하는 대신 아무것도 예측하지 못한다고. 트레이딩 시스템의 심사 기준으로 이보다 나은 문장을 나는 아직 찾지 못했다. 전략을 사기 전에 물어라. 이 전략은 어떤 데이터가 나오면 틀린 것으로 판정되는가. 그 답이 없는 전략은 전략이 아니라 신앙이다.