시장 폭 계기판

조건에 몇 개가 걸리는지를 센다 ― 예측이 아니라 측정이다

과매도 비율이 높다는 건 “지금 많이 빠졌다”는 사실이지 “이제 오른다”는 뜻이 아니다. 이 페이지의 숫자는 전부 마감된 일봉으로 센 것이고, 후보·체결·청산은 고정한 규격대로만 움직인다.

돌파 대기 후보종목명을 누르면 상세가 열린다

관찰 패턴 후보 아님 · 검정 전

삼각수렴·쐐기·플래그·쌍봉·헤드앤숄더·재시험·눌림목. 검출하고 그리고 기록만 한다. 장부는 이걸로 사지도 팔지도 않는다 ― 가격 가족에 120건을 선언해 재고, 통과한 것만 후보 패턴으로 올린다. 약세 패턴은 넥라인을 종가로 깨는 날이 신호고, 보유 종목에 뜨면 사건으로만 남긴다.

어제 후보에서 빠진 것
기타 기술적 신호새로 발생한 신호 · 무너진 것

새로 발생한 신호최근 5거래일

무너진 것 돌파 실패 · 구조 무효 ― 지우지 않는다

이 목록은 매수 후보가 아니다

검정 장부를 못 읽었다.

검증·정정 내역무엇을 어떻게 쟀고, 무엇을 철회했나

2026-09-15 정정 — 근거의 범위. 어제까지 이 자리의 “열네 번”에는 정작 이 장부가 매매하는 패턴 둘이 빠져 있었다. VCP는 한 번도 검정된 적이 없었고(검정기의 신호 목록에 아예 없었다), 박스권은 이름만 같고 다른 물건이었다 ― 장부는 tc.flat_base(30봉·폭이 ATR 대비 좁고·52주 고가 근처·상하단 접촉)를 쓰는데 검정기는 tp.box_breakouts(60봉 고가 돌파)를 쟀다. 컵앤핸들만 같은 함수였다.

그러니 어제까지 맞는 말은 “내 매매 규칙을 검증했고 엣지가 없었다”가 아니라 “내가 검증한 열네 개에 엣지가 없었고, 내가 매매하는 셋 중 둘은 그 열넷에 없었다”였다. 규격 첫 문단이 경고하는 “정의가 두 벌”이 검정기와 장부 사이에 그대로 남아 있었던 것이다. 지금은 배선했다.

2026-09-14 정정. 하루 전 이 자리에 “유의하게 나온 결과는 대부분 부호가 반대였다”고 적었다. 철회한다. 그 부호는 검정 설정 하나(시장중립 + 날짜 군집 미보정)의 산물이었고, 설정을 바로잡으니 부호가 대부분 뒤집혔다(양수 39 / 음수 25). 지금은 대부분 양수인데 잡음과 구분이 안 된다가 맞는 서술이다. 결론(“확인하지 못했다”)은 그대로지만 이유가 달라졌다.

2026-09-15 정정 — “확인 못 했다”가 두 가지였다. 문턱만 세고 표본을 안 셌다. 그래서 “통과 0건”이 성격이 다른 두 결과를 한 칸에 담고 있었다.

  • 박스권 (발생) · 표본 553 1.35%p면 잡는 칸이다. 안 잡혔으니 없다는 증거다
  • VCP 방아쇠 · 표본 21 17%p는 돼야 잡는 칸이다. 안 잡힌 건 아무 말도 아니다

첫째는 결론이고 둘째는 결론이 아니다. 둘을 같이 세면 안 재고도 “없다”고 말하게 된다. 결측에 적용한 “자료 부족”을 검정력에는 적용하지 않고 있었다. 규격 v1.5에 문장으로 못 박았다 ― 최소 탐지 효과가 비용 바닥(0.50%p)보다 크면 그 칸은 결과가 아니라 자료 부족이다.

이제 모든 결과 표 위에 이 줄이 찍힌다:

비용선을 잡을 수 있는 칸: 1/20 · 최소탐지 0.40%p ~ 16.76%p

이중 처벌도 있었다. 정보가 0인 칸이 본페로니 분모를 키워서 정작 정보가 있는 칸의 문턱을 끌어내린다. 검정력 없는 칸을 많이 돌릴수록 검정력 있는 칸이 통과하기 어려워진다.

그래서 지금 맞는 서술은 이렇다. 박스권·VCP의 “발생”에는 정보가 없다 ― 표본 200~550에 탐지력이 충분했고 안 잡혔다. 이건 답이다. 장부의 방아쇠(돌파+거래량)는 아직 못 쟀다 ― 표본 13~40으로는 잴 수 없다. B/P도 못 쟀다: 95% 신뢰구간이 코스피 [−16.7, +26.3], 코스닥 [−15.7, +35.6]이다. 연 16% 잃는 것과 연 26% 버는 것을 구분하지 못한다. p=0.66은 “효과가 없다”가 아니라 “이 표본으로는 아무 말도 못 한다”였다.

2026-09-16 — 미국에서 복제해봤다 (Form 4). 방향은 나오고 유의성은 안 나온다. 같은 표본을 계속 파는 것보다 다른 시장에서 같은 게 나오나가 강한 증거라 미국으로 갔다. SEC Form 345 분기 데이터셋 15분기(2022Q3~2026Q1), 세 시장 36회. 통과 0.

미국 데이터가 국내의 결함을 드러냈다. 2026Q1 거래 103,592건 중 장내 매수(P)는 5.7%뿐이다 ― 나머지는 무상부여 24%, 세금납부 26%, 옵션행사 16%, 매도 22%다. DART의 증감 수량은 이걸 다 섞어서 준다. 그러니 어제 “내부자 순매수”라고 부른 것의 대부분은 임원이 산 게 아니라 받은 것이었을 가능성이 크다. 부여는 회사가 잘나갈 때 나오니 “오른 종목에 부여가 따라온다”가 “내부자가 사면 오른다”로 보인다.

  • 장내 매수 1일S&P +0.66%p(p=0.011) · 나스닥 +0.86%p(p=0.033) · 뉴욕 +0.34%p(p=0.107)
  • 장내 매도 12칸전부 0 근처 (−0.38 ~ +0.04) ― 문헌과 일치한다. 매도는 정보가 적다
  • 다섯 시장 매수 20칸18칸이 양수 ― 다만 구간이 중첩이라 독립 20회가 아니다

그래도 통과는 0이다. 대형주에서 장내 매수 자체가 드물어 군집 보정 뒤 표본이 72~170건이다. 그리고 1일 효과에서 왕복 50bp를 빼면 S&P +0.16%p, 나스닥 +0.36%p, 뉴욕 −0.16%p가 남는다 ― 비용이 거의 다 먹는다.

정직한 서술은 이것이다: 부호는 다섯 시장에서 같은 쪽을 가리키는데, 크기가 비용선 근처고 어느 칸도 문턱을 못 넘었다. “있다”도 “없다”도 아직 아니다. 표본이 더 필요하고, 그건 규격 v1.7이 정한 대로 +50%가 쌓인 뒤에 다시 본다.

2026-09-16 — 축을 바꿔봤다. 둘 다 통과 0. 가격 455회·폭 356회가 소진돼서 새 데이터 축을 열었다. 상수를 만져 다시 돌리는 건 엣지를 키우는 게 아니라 문턱을 낮추는 것이라 안 한다.

수급은 죽어 있었다. pykrx의 투자자별 매매·공매도가 전부 빈 표를 준다(같은 라이브러리의 OHLCV는 82행 정상 ― 엔드포인트 자체가 죽었다). 대신 DART 지분공시가 살아 있다 ― 부호 있는 증감 주식수와 실제 접수일이 들어 있어 시점 정렬이 공짜다.

공시 축(정기보고서 접수일, 16회 × 2시장): 통과 0. 코스피는 “보고서를 들고 가면 잃는다”가 세 칸에서 같은 방향(−1.82%p p=0.004)인데 코스닥은 부호가 반대다. 사업보고서가 3월에 몰려 군집 보정이 1,215건을 155건으로 눌렀다 ― 이 축은 구조적으로 표본이 안 나온다.

내부자 축(임원·주요주주 소유보고, 12회 × 2시장): 통과 0. 그런데 지금까지 중 가장 눈에 띄었다 ― 코스닥 순매수가 1/5/10/20일에 +0.36 / +0.96 / +1.88 / +3.33%p(p=0.005)로 기간과 함께 커지고, 코스피도 같은 방향이고, 매도는 부호가 뒤집혔다. p<0.05가 9건(기댓값 1.2)이다.

그래서 반증하러 갔다 ― 그리고 반증됐다. 내부자 매수에 정보가 있다면 많이 사는 쪽이 더 나아야 한다. 확신도(순매수 주식수 ÷ 발행주식수)로 3등분해 쟀다. 시총 3분위 안에서 순위를 매겨 크기 효과 통제를 설계에 넣었다.

  • 코스피 20일하위 +1.64 · 중위 +1.61 · 상위 +0.31
  • 코스닥 20일하위 +2.28 · 중위 +4.19 · 상위 +0.38
  • 단조 증가한 칸0/8 · 상위가 하위보다 작은 칸 5/8

확신도는 142배(코스피)·14배(코스닥)로 갈렸고 시총 중앙값은 3.53조 대 3.76조, 0.54조 대 0.54조로 같다 ― 못 갈라서 안 나온 게 아니다. 그러니 앞의 +3.33%p는 “내부자가 아는 게 있다”가 아니라 다른 것일 가능성이 크다. 효과를 키우러 갔다가 앞 결과를 깎았고, 그게 이 검정의 값어치다.

여기서 멈춘다. 비율이 안 되니 금액으로, 금액이 안 되니 등기임원만 ― 그게 정확히 검정 장부가 막으려는 경로다. 내부자 축은 48회를 썼고 통과 0이다. 1년 뒤 표본이 50% 늘면 재검정 조건이 채워진다(규격 v1.7).

2026-09-15 — 자라는 표본을 다시 보는 일 (규격 v1.7). 객체 수준에 이미 이 문장이 있었다: “아직 움직이는 봉을 종가로 읽는 것이다.” 메타 수준에도 같은 일이 생긴다 ― 실측 로그가 매일 자라니까, 여섯 달 뒤 B/P를 61구간으로 다시 돌리면 그건 같은 가설을 두 번째로 보는 것이다. 반복해서 들여다보는 것만으로 거짓양성이 는다.

지금은 무해하다. 재검정을 한 번도 안 했다. 문제는 처음 재검정하는 날이고, 그날 규칙이 없으면 “표본이 늘었으니 다시 봐도 되지 않나”가 이긴다. 그래서 오늘 적었다 ― 표본이 직전보다 50% 이상 늘어야 하고, 그 재검정은 가족 카운터에 새 검정으로 더해진다. 둘 다다.

그리고 문장이 아니라 관문으로 넣었다. 객체 수준은 코드가 막는다 (register()가 이미 체결된 후보를 다시 안 연다). 메타 수준은 주의문 한 줄이 전부였다. 이제 장부가 거부한다:

표본이 +11%밖에 안 늘었다 (하한 +50%). 55 → 61. 아직 같은 봉이다.

만드는 김에 관문에 난 구멍을 하나 잡았다. 이월 판정을 날짜로 걸렀더니 오늘 적은 줄이 안 세어졌다 ― 오늘 돌리는 검정이 가족 카운터에 공짜로 들어간다는 뜻이다. 날짜가 아니라 표시로 바꿨다. testlog_test.py가 잡았고, 매일 돈다.

2026-09-15 — 가족을 나눴다 (규격 v1.6). 다음 검정부터. 누적 734회 문턱(0.000068)은 어떤 진짜 효과도 통과할 수 없는 문턱이 됐다 ― 4.42년 표본에서 IR 1.89가 필요한데 그런 팩터는 없다(시장 ~0.4, 모멘텀 ~0.5, 최상급 멀티팩터 ~1.0). 보수적인 게 아니라 재는 걸 포기한 것이다.

나누되 세 가지를 같이 못 박았다. 하나라도 빠지면 헐거워지는 문이 된다.

  • ① 축은 데이터다가설이 아니라 입력 원천으로 나눈다. 가설로 나누면 새 아이디어마다 가족이 생기고, n=1짜리 가족 열 개는 보정 없는 열 번과 같다
  • ② 0에서 시작 안 한다각 가족 카운터는 기존 건수에서 출발한다. 0이면 첫 검정이 α=0.05가 되어 보정이 사라진다 ― 이미 그 데이터를 본 뒤다
  • ③ 먼저 적는다검정 전에 가족과 예상 검정 수를 장부에 적는다. 결과를 보고 가족을 바꾸지 않는다

가격 376회 → p<0.000133 · 폭 356회 → p<0.000140 · 재무 2회 → p<0.025

옛 행은 라벨만 붙이고 판정은 그대로 뒀다. 734 문턱에서 받은 판정은 734 문턱의 판정으로 남는다. 지금 와서 다시 계산하면 결과를 다 본 뒤에 분모를 줄이는 것이다.

그런데 가족을 나눠도 B/P는 못 잰다. 보정을 아예 없애도(α=0.05) 4.42년 표본에서 필요 IR이 0.93이다 ― 최상급 멀티팩터 수준이다. 못 통과한 이유가 본페로니가 아니라 기간이라는 뜻이다. 가족 문턱에서 IR 0.4짜리 진짜 밸류 효과를 확증하려면 36년이 필요하고, DART 가용 시작이 2022-04라 기간을 늘릴 방법이 없다. 그래서 재무 가족의 기본 출력은 통과/탈락이 아니라 “자료 부족”이다.

검정 장부. 문턱이 실행마다 0으로 돌아가고 있었다. 40회 돌리면 0.00125, 100회 돌리면 0.0005 ― 누적은 아무도 안 셌다. 매매에는 “규칙을 바꾸면 버전을 올린다”를 못 박아놓고 검정에는 그 규율이 없었던 것이다. 이제 tests_run.csv에 커밋 해시까지 적는다.

지금까지 7회 실행 · 검정 732회다. 누적 본페로니로 읽으면 문턱이 p < 0.000068이고, 통과는 여전히 0건이라 어느 문턱으로 읽어도 결론이 같다. 이 장부가 진짜로 막는 건 다음번이다 ― 실패한 검정을 상수만 바꿔 다시 돌리는 것. 그러면 검정 수가 늘고 문턱이 내려가야 하는데, 장부가 없으면 그걸 셀 방법이 없다.

다만 누적 본페로니는 과보정이다. 검정들이 독립이 아니다 ― vcp ⊃ vcp:break ⊃ vcp:entry는 중첩된 부분집합이고, 네 구간이 같은 사건 집합에 붙고, 다섯 시장이 글로벌 요인을 공유한다. 실효 독립 검정 수는 732보다 한참 작다. 그래서 오차가 두 방향으로 있었다 ― 실행 안에서는 과보정, 실행 사이에서는 무보정. 순효과는 모른다. 그래서 실행 문턱과 누적 문턱을 둘 다 적는다.

상세 패널의 매매 시나리오도 산술이지 예측이 아니다 — 진입가·손절가·손익비는 패턴에서 뽑은 계산이 맞지만, 그 진입 신호의 유효성은 확인되지 않았다.

검증 상세 — 무엇을 어떻게 쟀나

두 가지 질문을 가른다. 예전엔 하나로 뭉쳐서 “통과 0건”이라고 했는데, 섞으면 무엇이 왜 안 됐는지를 알 수 없다.

  • 정보 검정신호일이 같은 종목의 다른 날과 다른가. 비용을 안 빼고, 날짜 군집만 보정한다. 지수는 안 뺀다.
  • 매매 검정그 차이가 왕복 거래비용 0.5%p(편도 25bp)를 넘는가.

정보가 있어도 비용을 못 넘을 수 있고, 그 둘은 다른 결론이다. 아래의 “64번 0건”은 전부 이 정의의 정보 검정이다 ― 지수를 뺀 숫자와 섞지 않는다. 지수를 뺀 것은 분해이지 정보 검정이 아니며, ②에 따로 적는다.

2026-09-14에 검정 방법 두 군데를 고쳤다.

① 날짜 군집. 급락 주 하루에 수십 종목이 동시에 신호를 낸다. 그걸 독립 표본으로 세면 t가 부풀어 오른다. 날짜별로 묶으니 표본이 16,211 → 8,294로 줄었다(최대 군집 16).

② 시장중립은 정보 검정이 아니라 분해다. 지수 수익을 빼면 신호 표본과 기준선에서 같은 값이 빠져 상쇄될 것 같지만, 신호일이 특정 국면에 몰려 있어서 상쇄되지 않는다. 같은 눌림목 20일이 지수를 안 뺀 쪽에서 +2.20%p(p=0.005)인데 빼면 +0.48%p(p=0.516)다. 두 숫자는 다른 질문의 답이다 ― 앞은 “그 뒤 그 종목들이 잘 갔나”, 뒤는 “그게 시장이 올라서였나”. 뒤의 숫자는 앞의 결과를 쪼개 보는 용도이지 통과/탈락을 가리는 데 쓰지 않는다. 예전엔 이 둘을 섞어서 “부호가 반대”라는 틀린 결론을 냈다.

잰 것: 캔들패턴 62개, 다이버전스, RSI 과매도, 박스권 이탈, 12-1 모멘텀, 잔차 모멘텀, 변동성 타게팅, 분산일, 밸류(E/P·B/P), 골든/데드크로스(50일선 × 200일선), 그리고 이 화면이 쓰는 돌파 후 재시험과 눌림목.

재시험·눌림목(2026-09-13~14, 네 시장 · 코스피 270 · 코스닥 245 · S&P 500 501 · 나스닥 290종목, 2022-08~2026-09). ①(날짜 군집)만 걸고 64번 검정했다 ― ②는 통과를 가리는 보정이 아니라 분해라서 여기 안 건다. 정보 검정에서 통과 0건, 매매 검정에서도 0건이다.

  • 부호양수 39 / 음수 25 ― 한쪽으로 쏠리지 않는다
  • p<0.0564번 중 1건(나스닥 눌림목 1일, −0.17%p). 64번 쟀으면 우연으로 3건쯤 나올 자리다 ― 우연보다도 적게 나왔다
  • 비용선 초과15건. 그중 유의한 것은 0건
  • 표본47,580 → 군집 후 19,621

그래서 지금 가장 정확한 서술은 “보정하고 나니 잡음과 구분이 안 된다”이지 “반대로 작동한다”가 아니다. 유일하게 유의한 한 건도 하루짜리 0.17%p라 비용선 근처에도 못 간다.

후보 탭은 기다림 자체다. 화면의 규칙은 “기준선을 넘을 때까지 기다렸다 들어간다”이고, 그걸 따로 잰 것이 재시험 → 기준선 돌파와 눌림목 → 기준선 돌파다. 네 시장 16번 검정에서 유의한 것은 없다. 아직 이 목록이 먹는다는 근거도, 안 먹는다는 근거도 없다.

관찰 패턴 6종(2026-09-17, 다섯 시장 · 규격 v1.10.5): 삼각수렴·하락쐐기·플래그는 돌파 + 거래량 1.5배(가정)로, 상승쐐기·쌍봉·헤드앤숄더는 넥라인 종가 이탈로 쟀다. 6신호 × 5시장 × 4구간 = 120번, 날짜 군집 보정, 가격 가족 문턱 p<0.000086. 통과 0건. p<0.05가 10건인데 우연 기대치(6건)와 크게 다르지 않고 부호가 엇갈린다 ― 코스피 하락쐐기 5일 −3.0%p(p=0.004)와 S&P 플래그 10일 +6.9%p(p=0.010, 표본 16)가 가장 세지만 둘 다 문턱의 백분의 일 수준이다.

그리고 120칸 전부 자료 부족이다. 비용선 0.5%p를 잡으려면 필요한 MDE가 최소 2.6%p, 대부분 5~13%p다. 국내 플래그는 표본 ~125건인데도 20일 수익 표준편차가 커서 못 잡고, 미국은 표본 자체가 적다(플래그 8~16 · 삼각수렴 2~4 · 하락쐐기 4~9 ― 10~20봉 안에 +15% 기둥이 서는 종목이 미국 대형주엔 드물다). 결론은 "없다"가 아니라 "이 표본으론 모른다"다. 그래서 여섯 패턴은 관찰 전용으로 남는다 ― 차트에 그리고 목록에 적되 후보로 올리지 않는다. 쌍봉·헤드앤숄더는 애초에 진입이 아니라 청산 쪽 질문이라, 거래 열 건이 쌓인 뒤 청산 신호로 따로 잰다.

골든/데드크로스(2026-09-14, 네 시장): 교차 정의를 20일선×60일선에서 50일선×200일선으로 바꿔서 다시 쟀고, ①(날짜 군집)을 걸고 또 한 번 다시 쟀다. 32번 검정해서 통과 0건이다. 표본 24,916 → 군집 후 14,172.

보정 전에 적었던 “골든크로스는 네 구간 모두 음수, 기간이 길수록 더 내려간다 (1일 −0.03 → 20일 −1.00%p)”는 보정 후 남지 않는다. 지금은 시장 평균으로 1일 +0.05 / 5일 +0.10 / 10일 −0.01 / 20일 −0.40%p로 0 근처이고 단조롭지도 않다. 코스피 20일이 −0.95(p=0.110) → −0.39(p=0.581)로 사실상 사라졌고, S&P 20일은 −0.18 → +0.25로 부호가 바뀌었다. 재시험·눌림목과 같은 일이 여기서도 일어났다.

32번 중 비용선과 유의성을 동시에 만족한 것이 하나 나왔다 ― 나스닥 골든크로스 5일, +0.67%p, p=0.017. 그래도 통과로 세지 않는다: 32번 검정의 본페로니 기준은 p<0.00156이고, 같은 구간에서 다른 세 시장은 +0.08 / −0.63 / +0.26으로 따라오지 않으며, 무엇보다 신호 승률이 기준선보다 낮다(57.7% 대 59.6%). 평균을 끌어올린 것은 몇 건의 큰 수익이지 꾸준함이 아니다. 코스닥 재시험과 코스피 폭을 기각한 것과 같은 잣대다.

다시 쟀다(2026-09-15, 다섯 시장). 두 가지가 바뀌어서다. 뉴욕거래소가 다섯 번째 시장으로 들어왔고, 빠진 종목을 세는 장치가 붙었다. 검정은 32번에서 40번으로 늘고 본페로니 기준은 p<0.00156 → p<0.00125로 더 빡빡해졌다. 표본 30,414 → 군집 후 17,649. 통과는 여전히 0건이다.

위 문단의 나스닥 건은 거의 그대로 남았다 ― +0.674 → +0.678%p, p 0.017 → 0.0163, 표본 418 → 418. 기각 근거 셋도 다 서 있고, 두 개는 오히려 세졌다. 본페로니 기준이 내려갔고(p가 문턱의 13배다), 따라오지 않는 시장이 셋에서 넷이 됐다 ― 5일 골든크로스는 코스피 +0.05 / 코스닥 −0.60 / S&P +0.26 / 뉴욕 −0.08이다.

다시 재면서 새로 보인 것이 하나 있다. 5일 골든크로스의 신호 승률이 다섯 시장 전부 기준선보다 낮다.

  • 코스피45.5% 대 57.1%
  • 코스닥45.5% 대 58.1%
  • S&P 50055.8% 대 58.9%
  • 나스닥57.7% 대 59.4%
  • 뉴욕거래소57.3% 대 63.2%

평균이 양수인 시장에서도 맞히는 횟수는 아무 날이나 사는 것보다 적다. 나스닥 하나를 두고 "몇 건의 큰 수익이지 꾸준함이 아니다"라고 적었던 게 다섯 시장에서 같은 모양으로 나온다.

그리고 여태 안 보이던 제외가 드러났다. 상장한 지 200일이 안 된 종목은 200일선을 낼 수 없어 표본에서 빠지는데, 그 개수를 아무도 안 셌다. 이번엔 표 위에 찍힌다 ― 코스피 7 · 코스닥 17 · S&P 500 3 · 나스닥 6 · 뉴욕 2. 정상적인 제외지만, 표본 403이 원래 410이었다는 걸 알고 읽는 것과 모르고 읽는 것은 다르다. 숫자 자체는 안 바뀐다 ― 이 종목들은 전에도 똑같이 빠졌고, 달라진 건 빠졌다는 사실이 보인다는 것뿐이다.

전·후반 일관성 칸도 확인했다. 다시 재게 된 계기가 이거였다 ― 구간을 반으로 자르는 이 검사가 200일선 앞에서 조용히 터질 수 있다는 걸 발견했다(짧은 창으로 돌리면 ta.sma가 None을 돌려주고 그 종목이 통째로 빠진다). 확인해보니 이 검정은 그 조건이 아니었다 ― 1,500일 기본값에서 절반은 515봉이라 200일선이 잡힌다. 값은 20일 기준으로 코스피 반대(전반 −1.04 / 후반 +0.67) · 코스닥 일치 · S&P 일치 · 나스닥 일치 · 뉴욕 일치다. 이 칸은 애초에 기각 근거로 쓴 적이 없고, 채워놓고 보니 코스피는 오히려 기각 쪽이다.

컵앤핸들에 거래량을 걸어 다시(2026-09-15, 다섯 시장). VCP·박스권에 따로 붙여야 했던 거래량 조건을 컵에도 걸어봤다. 스무 칸이 마지막 자리까지 같았다. 한 건도 안 걸러진다.

이유는 컵에는 그 조건이 처음부터 들어 있어서다 ― cup_parts가 vol_ratio ≥ 1.5를 걸고 cup_handle이 모양·돌파·거래량을 한 번에 묶는다. 그러니 컵앤핸들은 그 자체로 방아쇠였고, 위 100회에 들어간 컵 숫자는 이미 방아쇠 조건으로 잰 것이었다.

읽어서 아는 것과 재서 아는 건 다르다. d에 vol_ratio가 없으면 그 조건이 조용히 전부 통과가 되는 경로가 실제로 있다 ― 새고 있었다면 표본 수가 달랐을 것이다. 안 샌다. 다섯 시장 20칸, p<0.05 0건(양수 12 / 음수 8).

재시험·눌림목을 같은 방식으로 다시(2026-09-15, 다섯 시장). 아래 장부 패턴을 잴 때 붙인 거래량 조건을 이 둘에도 걸었다. 뉴욕거래소도 들어왔다. 6개 신호(발생·돌파·돌파+거래량 × 둘) × 4개 구간 × 5개 시장 = 120회, 본페로니 p<0.000417. 통과 0건.

이번엔 우연보다 적게 나왔다 ― p<0.05가 4건이고 기댓값은 6.0건이다. 그 4건이 전부 눌림목 “발생”이고 전부 음수이며 미국 쪽에만 있다 (뉴욕 5·10·20일, 나스닥 1일). 즉 가장 유의에 가까운 것들이 반대 방향을 가리킨다.

옛 64회는 그대로 재현된다. 같은 칸 64개에서 초과% 최대 변화가 0.574%p고 표본은 최대 6건 움직였다(자료가 하루 늘어서다). 그때 유일하게 걸렸던 나스닥 눌림목 1일 −0.17%p도 −0.167%p, p=0.033으로 다시 나온다.

거래량 조건을 걸면 재시험이 평균 +0.37%p(양수 13/20, 최소 p=0.051), 눌림목이 +0.70%p(양수 14/20, 최소 p=0.081)다. 양수 쪽이지만 하나도 유의하지 않고, 이건 비용 빼기 전 숫자다 ― 왕복 50bp를 빼면 남는 게 거의 없다.

그리고 여기서도 표본이 무너진다. 20일 구간에서 눌림목은 발생 283~481건 → 돌파+거래량 43~77건, 재시험은 304~442건 → 75~142건이다. VCP에서 본 것과 같은 모양이다 ― 거래량 조건이 85~90%를 거른다.

다만 이 둘은 장부가 사지 않는다. ruleset.CANDIDATE["patterns"]는 컵앤핸들·VCP·박스권 셋뿐이라 judge()가 재시험·눌림목으로는 애초에 진입하지 않는다. 그래서 여기 “돌파+거래량”은 장부의 방아쇠가 아니라 “같은 방식으로 샀다면”이라는 가정이다. 표에서도 이름을 (가정)으로 갈라 적는다 ― 안 그러면 VCP·박스권의 방아쇠와 같은 것으로 읽힌다.

장부가 매매하는 패턴(2026-09-15, 다섯 시장, 새로 만듦). 위의 검정 어디에도 VCP가 없었고 박스권은 다른 함수였다. 이번엔 탐지도 기준선도 장부와 같은 함수로 쟀다. 그리고 질문을 둘로 갈랐다 ― 발생(“이 모양 자체에 정보가 있나”)과 방아쇠(“장부가 실제로 사는 조건이 먹히나”). 방아쇠는 돌파만이 아니라 거래량 1.5배 조건까지 건 것이다. judge()가 그 조건 없이는 안 사기 때문이다.

5개 신호 × 4개 구간 × 5개 시장 = 100회. 본페로니 기준 p<0.0005. 통과 0건. 부호는 양수 46 / 음수 54로 갈린다.

이번엔 우연보다 많이 나왔다 ― p<0.05가 10건이고 기댓값은 5.0건이다. 숨기지 않는다. 다만 그 10건이 한 방향을 가리키지 않는다. 제일 작은 둘이 서로 반대다.

  • 코스닥 박스권(발생) 10일 +3.02%p p=0.0019 · 표본 270
  • S&P 500 VCP(발생) 10일 −0.89%p p=0.0022 · 표본 343

게다가 둘 다 살 수 없는 신호다. “발생”은 모양이 처음 잡힌 날이지 매매 규칙이 아니다 ― 장부는 그날 안 산다. 같은 코스닥에서 실제로 사는 규칙은 +4.10%p, p=0.445였다. 정보는 있는데 규칙이 못 건진다. 가르지 않았으면 “박스권이 먹힌다”로 읽었을 자리다.

방아쇠만 따로 보면 40회 중 통과 0건이고, 평균 초과가 VCP −0.01%p · 박스권 −0.04%p로 사실상 0이다. p<0.05인 2건은 둘 다 음수다(코스피 박스권 1일 −0.41, S&P 20일 −1.13). 이건 비용을 빼기 전 숫자고, 비용 바닥은 왕복 50bp다.

따로 눈에 띈 것. VCP 방아쇠의 표본이 시장당 13~40건뿐이다 ― 4년 동안이다. 관찰의 44%를 차지하는 패턴인데 실제 진입 조건까지 가는 일이 스무 번 남짓이다. 거래량 조건이 대부분을 거른다. 이건 엣지 이야기가 아니라 표본이 안 쌓인다는 이야기고, 장부에 체결이 안 생기는 이유이기도 하다.

상수는 한 개도 안 건드렸다. VCP_SHRINK · VCP_DRYUP · FLAT_ATR 같은 걸 결과 보고 만지면 그 순간 100회가 120회가 되고, 위의 p 논리가 그대로 나한테 적용된다. 얼려둔 값으로 한 번 재고 그 결과를 여기 적는다.

옛 결과와 달라진 값은 있다. 가장 큰 게 코스피 골든크로스 20일로 −0.386 → +0.013이다. 이건 고친 것 때문이 아니라 자료가 사흘 늘어서다 (9/11 → 9/14). 32개 중 25개에서 표본이 1~4건 움직였다. 방향은 안 바뀐다 ― 어느 쪽이든 0 근처다.

폭 자체는 어떤가(2026-09-14, 새로 만듦). 위의 검정은 전부 “그 신호가 뜬 종목을 사면”이었다. 그런데 이 화면의 본체는 종목이 아니라 폭이다 ― “조건에 몇 개가 걸리는가”가 헤드라인이다. 폭의 수준·변화가 이후 지수 수익을 가르는지는 한 번도 안 쟀었다. ta_breadth_validate.py로 쟀다.

첫 판이 틀렸다. 매일을 관측 하나로 세고 60일 선행수익을 붙였더니 상위 20%와 하위 20%가 둘 다 평균을 이기고 t가 12.7까지 갔다. 겹치는 창 때문이다 ― 503일에 60일 창이면 독립 관측은 여덟 개쯤인데 63개인 척한 것이다. 겹치지 않는 창으로 고치고 로그를 503일 → 1,355~1,391일로 늘렸다.

가장 가까웠던 것이 코스피 120일선 위 비율 상위 20%, 곧 이 페이지의 헤드라인 숫자다. 5·10·20일 모두 같은 방향이고 크기가 구간에 거의 비례했다 (+1.15 / +2.49 / +5.75%p, p=0.080 / 0.068 / 0.060). 방향은 추세추종이다 ― 폭이 높을 때 이후가 좋았지, 낮을 때 좋았던 게 아니다.

그런데 그건 폭이 아니라 지수 모멘텀일 수 있다. “120일선 위 비율이 상위 20%”인 날은 정의상 이미 많이 오른 날이다. 그래서 선행수익을 최근 지수 수익에 회귀하고 잔차로 다시 쟀다 (ta_breadth_control.py):

  • 코스피 5일+1.15%p(p=0.080) → 잔차 +0.93%p(p=0.161)
  • 코스피 10일+2.49%p(p=0.068) → 잔차 +1.90%p(p=0.164)
  • 코스피 20일+5.75%p(p=0.060) → 잔차 +5.01%p(p=0.099)

통제 변수를 처음에 잘못 골랐다. 최근 20일과 120일 지수 수익을 둘 다 뺐는데, “120일선 위 비율”은 지수의 120일 수익과 기계적으로 얽혀 있다 ― 지수가 120일 동안 올랐으면 구성종목 상당수가 자기 120일선 위에 있다. 그걸 빼면 모멘텀만 빼는 게 아니라 폭 신호 자체를 일부 빼게 된다. 위 숫자는 20일만 뺀 깨끗한 쪽이다. 과도하게 뺀 쪽(20+120)은 +0.82 / +1.73 / +4.57%p, p=0.222 / 0.205 / 0.134으로 더 나쁘게 나왔었다.

깨끗한 통제로도 모멘텀이 13~24%를 설명하고, 남은 크기는 꽤 되지만 어느 구간도 유의하지 않다. 통제하고도 폭이 남는다고 말할 수 없고, 전부 모멘텀이었다고도 말할 수 없다 ― 표본이 13~51개라 어느 쪽도 못 가린다.

그리고 통과가 아니다: 356번 검정에 본페로니 0.00014이고, 코스피에서만 나오며(S&P·나스닥은 없거나 음수), 기간을 가르면 전반부는 상위 20% 표본이 다섯 개도 안 되고 측정 가능한 후반부만 보면 p=0.196~0.323이다. 코스닥 재시험을 기각한 것과 같은 이유로 기각한다. 다만 이 방향은 데이터가 더 쌓이면 다시 볼 값어치가 있다 ― 지금은 표본이 없어서 못 가린 것이지, 없다고 확인한 게 아니다.

재는 방법이 틀려서 좋아 보였던 것들: 다이버전스는 p=1.75e-116이 나왔는데 미래를 보고 있었고, RSI 과매도 + 박스권 이탈은 보정 전 +2.11%p가 보정 후 −0.19%p가 됐다. 오늘 폭 검정의 첫 판(t=12.7)도 같은 계열의 실수다.

이 결론의 한계: 한 구현·한 표본 구간·한 비용 가정에서의 결과다. 다른 규칙·기간·비용으로는 달라질 수 있고, 유효성을 확인하지 못했다는 것이 효과가 없음을 증명한 것은 아니다. 폭 로그는 1,355~1,391일 중 대부분이 소급 계산이라 생존편향이 있다. 국내는 fdr이 배당을 안 줘서 50/200 교차·52주 고가·250일 지표가 무배당 기준이다. 원자료는 validate_retest_pullback_<시장>.csv, validate_cross_50_200_<시장>.csv, validate_breadth.csv에 남겨뒀다.

실패한 측정을 목록에서 지우지 않는 이유도 같다. 지우면 남는 건 성공한 것뿐이고, 그게 생존편향이다. 오늘 내 검정 방법이 틀렸던 것도 지우지 않고 위에 적어뒀다.

소급 구간(history)은 오늘 기준 종목으로 과거를 재구성한 것이라 생존편향이 있다 — 그때 있었지만 지금은 사라진 종목이 빠져 있어 과거의 약세가 실제보다 순하게 나온다. 매일 쌓는 실측(live)에는 그 문제가 없고, 수준 비교는 실측끼리만 해야 한다. 미국은 상장폐지 목록을 받을 수 없어(fdr에 엔드포인트가 없다) 생존편향 보정이 불가하다. 종가는 배당 반영 기준이다(미국만 · 국내는 fdr이 배당 데이터를 주지 않는다). “신호일 대비”는 신호가 난 날 종가와 오늘 종가의 차이일 뿐, 그날 사서 지금까지 들고 있었다면 얻었을 수익이 아니다 — 종목마다 경과일이 다르고 거래비용도 안 뺐다.