계산이 아닌 것을 다루게 됐다
이 편은 세 번 갈아엎었다.
지금까지 다룬 재료는 전부 ‘계산’이었다. RSI는 함수고, 거래량은 원자료고, SMC와 피보나치도 결국 비교문 묶음이었다. 엘리엇은 급이 다르다. 계산이 아니고 세계관이다. 시장의 모든 움직임이 집단 심리의 리듬을 따라 5개의 추진 파동과 3개의 조정 파동으로 진행된다는, 1930년대 랄프 넬슨 엘리엇의 이론.
결론을 미리 적어두면, 이건 내 봇에 통째로 못 들어간다. 그런데도 한 편을 쓰는 건 해부하다 나오는 부산물 때문이다. 반증 가능성이라는 칼. 그게 이 스터디 전체를 관통한다.
충격파 (Impulse, 추세 방향) 조정파 (Correction)
5
3 ╱╲ ╲ B
╱╲ ╱ ╲ A ╲ ╱╲
╱ ╲╱ ╲ ╲╱ ╲
1 ╱ 4 ╲ ╲ C
╱╲ ╱ ╲ ╲
╱ ╲╱ ─ 이후 한 단계 큰 파동의 부품이 됨
╱ 2
프랙탈: 파동 1 안에도 다섯 파동이, 그 안에도 다섯 파동이 — 전 시간축 자기유사
피보나치 결합: 파동 목표·되돌림 깊이를 φ 비율로 잰다 (지난 편과 직결)단단한 부분은 규칙 3개뿐
방대한 서사 중에 예외 없는 규칙은 딱 3개다. 나머지(연장, 절단, 교대 지침 등)는 전부 ‘경향’이고, 이 셋만이 위반되면 카운팅 자체가 무효가 되는 절대 규칙이다. 그리고 이 3개는 신기하게도 코드로 깔끔하게 옮겨진다.
규칙 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다. 일정 임계 이상 움직였을 때만 방향 전환을 인정해서 지그재그 선분으로 압축하는 알고리즘.
# 반전 임계 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개를 만족하는 카운팅이 또 여러 개 존재한다.
같은 가격 데이터, ZigZag 반전 임계만 변경:
임계 3% ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲ 스윙 16개 → 가능한 카운팅 다수
임계 5% ╱╲ ╱╲ ╱╲ ╱╲ 스윙 8개 → 다른 카운팅 다수
임계 7% ╱ ╲╱ ╲ ╱ ╲ 스윙 5개 → 또 다른 카운팅
어느 임계가 '진짜 파동' 인가? — 이론은 답을 주지 않는다
실무 격언: "엘리엇 분석가 열 명 = 카운팅 열한 개"
그리고 결정타 — 사후 재라벨링:
가격이 예상을 깨면 카운팅을 소급 수정한다. "그건 3파가 아니라 C파였다"
이론은 영원히 옳고, 틀리는 것은 항상 카운팅이다 → 반증 불가능마지막 두 줄이 핵심이다. 피보나치 편에서 “틀리면 스윙을 잘못 그은 것"이라는 도피처를 봤는데, 엘리엇은 그 도피처가 이론의 공식 문법에 아예 내장돼 있다. 예측이 빗나가면 카운팅을 다시 세면 되고, 다시 센 카운팅은 언제나 지나간 가격과 정합한다. 사후적으로는 늘 옳고 사전적으로는 거의 아무것도 확정하지 않는다. 과학철학 용어로는 반증 불가능. 그리고 반증 불가능한 것은 백테스트도 불가능하다. 백테스트란 조직적 반증 시도의 다른 이름이니까.
여기서 며칠 붙들려 있었다. 반증 불가능하다는 판정이 나오면 그걸로 끝이어야 하는데, 그런데도 뭔가 남아 있다는 감각이 자꾸 들었다.
절반은 번역된다
그래도 번역을 시도해 보면 어디까지 되는지가 보인다. 되는 것과 안 되는 것의 경계, 그게 이 글의 수확이다.
번역 가능 (판정식이 존재)
① 스윙 추출 ZigZag(임계 고정) — 단, 확정 지연 명시 (SMC 편과 동일)
② 규칙 3개 검사 스윙 5개 조합마다 규칙 1·2·3 통과 여부 → 유효 카운팅 목록
③ 무효화 라인 시나리오별 '여기 깨지면 포기' 가격 → 손절선으로 직역
④ 보조 통계 "3파 최장" 경향의 실측 — 추세 구간 길이 분포 측정
번역 불가능 (판정식이 없음)
⑤ 유일 카운팅 선택 유효 카운팅 여러 개 중 '진짜' 고르기 — 기준 부재
⑥ 파동 등급 판정 지금이 3파인지 C파인지 — 사후에만 확정
⑦ 예측 "다음은 5파" — ⑤⑥이 안 되므로 연쇄 붕괴
결산: 서사(⑤⑥⑦)는 버리고 구조(①②③④)만 수입한다번역 가능 목록을 다시 보면 낯익다. ①은 SMC의 스윙 구조 감지고, ③은 손절선이고, ④는 추세 지속 길이의 통계다. 전부 엘리엇이라는 이름 없이도 성립하는 부품들이다. 결국 봇으로 수입되는 건 이론의 고유 주장(시장은 5-3 리듬으로 움직인다) 쪽이 아니라 이론이 강제하는 규율의 형식(시나리오에는 무효화 지점이 있어야 한다)이다.
내 봇은 이 형식을 이미 다른 경로로 갖고 있다. 진입마다 손절선이 계산되고(-5%), 본전 사수 무장선이 있고(+0.8/+0.4), 레짐이 깨지면 신규 진입이 서고(BTC 4시간봉 차단), 자산 서킷브레이커가 최후 방어선(300만원)을 지킨다. 전부 “여기가 깨지면 내 가설이 틀린 것"의 코드화다. 엘리엇 분석가의 무효화 라인과 내 봇의 손절선은 같은 철학의 두 방언이다.
서사를 뺀 통계 가설
이론을 반납한다고 배울 게 없어지는 건 아니다. 엘리엇의 주장 중 몇 개는 서사를 벗기면 측정 가능한 통계 가설로 번역된다. 파동 등급을 알아맞힐 필요 없이 분포만 보면 되는 것들이다.
가설 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시간봉처럼 보이는 경험은 차트를 오래 본 사람이면 다 안다.
주는 것 — 다중 시간축 설계의 근거
같은 판정 로직을 여러 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개와 무효화의 형식은 수입한다. 시나리오를 세우되 그 시나리오가 죽는 가격을 먼저 적어두는 습관, 그게 이론 전체에서 살아남은 알맹이고 이미 내 봇의 손절선 안에서 일하고 있다. 파동을 세는 일은 앞으로도 사람의 예술로 남겨두려 한다.
칼 포퍼는 과학과 비과학을 가르는 기준으로 반증 가능성을 제시했다. 어떤 관찰로도 부정될 수 없는 이론은 모든 것을 설명하는 대신 아무것도 예측하지 못한다고. 트레이딩 시스템의 심사 기준으로 이보다 나은 문장을 아직 못 찾았다. 그런데 요즘 걸리는 게 있다. 내 봇의 게이트들도 하나씩 떼어놓고 보면, “어떤 데이터가 나오면 이 게이트가 틀린 것인가"에 바로 답이 안 나오는 것들이 있다. 남을 심사하던 기준으로 내 것부터 다시 훑어야 할 텐데, 아직 손을 못 댔다.
약어 풀이
* 이 글에 나온 영어 약어를 풀어 둔다.
- RSI (Relative Strength Index): 상대강도지수. 일정 기간 평균 상승폭과 평균 하락폭의 비율을 0~100 으로 나타내 과매수·과매도를 재는 모멘텀 오실레이터.
- SMC (Smart Money Concepts): 스마트머니 개념. 기관 자금의 흔적을 구조 돌파·오더블록·유동성 사냥 같은 가격 행동으로 읽는 분석 틀.
- TF (Timeframe): 시간 프레임. 캔들 하나의 기간(1분·1시간·일봉 등).
- BTC (Bitcoin): 비트코인. 이 블로그에서는 코인 시장 전체의 방향(레짐)을 재는 기준 자산.