3주 만에 판정이 뒤집혔다 — 계산이 틀린 게 아니라 자료의 시점이 틀렸다
소개
3주 전, KOSPI가 지금 바닥인지 판정하는 연구를 끝냈습니다. 문헌에 알려진 저점 감지법 14가지를
KRX 전종목 31년치로 다시 돌려 한국 시장에서 통하는지 확인하는 작업이었고, 결론은 이랬습니다.
1차 분할매수까지만. 전량 매수는 아직.
빚으로 산 물량(신용잔고)이 −1.8%밖에 안 털렸다. 과거 진짜 바닥들은 예외 없이 −35% 넘게
털린 뒤에 돌아섰다. 팔아야 할 사람이 남아 있다는 뜻이다.
판정일(2026-07-21) 화면 — '1차 분할매수까지만. 전량 매수는 아직.'
한국사이트 스크린샷
이 판정이 마음에 걸렸습니다. −1.8%는 과거 바닥의 1/20 수준이라 너무 극단적이었거든요.
그래서 저장소를 다시 열고 클로드 코드에게 "어디까지 진행됐는지 확인해줘"라고만 시켰습니다.
새 분석을 시키려던 게 아니라 현황 파악이 목적이었습니다.
그런데 자료를 최신으로 채우자 판정이 뒤집혔습니다.
진행 방법
도구: 클로드 코드(Claude Code) + 크롬 브라우저 자동화
시작은 딱 세 마디였습니다
제가 실제로 넣은 프롬프트는 이게 전부입니다.
bottom 레지토리를 깃으로부터 가져와줘
어디까지 진행되었는지 확인
순서대로 고고
"순서대로 고고"는 클로드가 정리해준 남은 과제 4건을 위에서부터 하라는 뜻이었습니다.
이후로는 대부분 결과를 보고 지적하는 식으로 진행했습니다.
1. 왜 뒤집혔나 — 자료의 시점
신용잔고 청산폭이 −1.8%가 아니라 −22.2%(8월 4일 저점 −29.1%)였습니다.
계산이 틀린 게 아니었습니다. 판정일(7월 21일) 시점의 신용잔고 자료는 6월까지였고,
7월 급락기의 청산이 아직 자료에 들어오지 않았을 뿐이었습니다. 같은 정의로 재계산하면
그날 그 데이터로는 −1.8%가 정확히 나옵니다.
여기에 변동성 지표를 대체값에서 원계열로 바꾸자 확인 신호까지 붙어, 규칙상 L1·L2·L3
세 축이 모두 섰습니다.
기준일만 2026-08-12로 바꾼 같은 화면 — '전량 매수 조건 충족.'
한국사이트 스크린샷
같은 화면에서 기준일만 7월 21일 → 8월 12일로 바꾼 것입니다. 판정 문구가 통째로 바뀝니다.
2. AI가 자기가 만든 결론을 뒤집었습니다
여기서부터가 재밌었습니다. 남은 과제를 순서대로 시켰더니,
앞선 세션에서 자기가 내린 결론 두 개를 스스로 반증했습니다.
변동성 지표(케이스 14) 재적합 — 원계열을 확보했으니 백테스트를 다시 돌리게 했더니
두 가지가 나왔습니다.
· 문턱값 30은 실현변동성의 값이라 내재변동성에 그대로 쓰면 안 된다. VKOSPI 분포에서 30은
상위 8% 수준이고, 2022년 최고치가 28.95라 그 해 전체가 무신호가 된다.
· 더 큰 문제는 중복 제거 규칙이었다. 폭락 도중 지표가 잠깐 −15%를 스치면 그 신호가 먼저
잡히고, 60일 안에 오는 진짜 저점 확인 신호가 중복으로 지워진다. 2020년 코로나 바닥이
정확히 그 사례(3월 4일 신호가 3월 24일 확인 신호를 삭제).
그리고 앞선 세션의 비교표가 틀렸다는 것도 스스로 찾아냈습니다. 중복 제거를 빼먹고 돌린
숫자였고, 넣으면 "발생 빈도 2~3배"가 성립하지 않았습니다(28회 → 12회). 그 문서에 정정
배너를 붙였습니다.
투자자예탁금(케이스 12) — 저장소에 남은 마지막 데이터 공백이었습니다. 메우러 갔는데
결과가 반대였습니다.
저점
예탁금 30일 변화
반대매매비중
2008-10 글로벌 금융위기
−0.5% 미충족
23.0% 충족
2020-03 코로나
−5.3% 미충족
8.5% 충족
2022-09 더블바텀
−12.2% 충족
20.1% 충족
2026-07 수급 충격
−26.1% 충족
10.2% 충족
문서가 정한 "예탁금 30일 −10%" 조건은 평가 가능한 6개 바닥 중 2개에서만 성립했습니다.
공포 국면에서 예탁금은 빠지기도 하지만 대기자금으로 쌓이기도 합니다 — 2020년엔 27조에서
65조로 늘었습니다. 공백이 메워진 게 아니라 조건이 기각된 것입니다.
반면 반대매매비중은 자료가 있는 네 바닥 전부 충족이었고, 2026년 7월 9일 값 10.2%가
원 검증이 뉴스에서 인용했던 수치와 정확히 일치했습니다.
3. 막힌 데이터를 브라우저로 뚫었습니다
신용잔고 자료는 금투협 사이트에서 사람이 엑셀로 받아 합치고 있었습니다. 자동화를 시켰더니
클로드가 사이트 자바스크립트를 역추적해 들어갔는데, 엔진이 난독화(`µWY`, µEY 같은 이름)돼
있어 요청 형식을 못 읽었습니다.
그래서 크롬에서 실제 요청을 한 번 잡는 쪽으로 방향을 틀었습니다. XHR을 가로채는
코드를 페이지에 넣고 조회 버튼을 누르니 본문이 그대로 나왔습니다.
// 요청 가로채기 — 이 한 번으로 끝났다
const XS = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function (body) {
if (/getMetaDataList/.test(this.__u)) console.log("[CAPBODY] " + body);
return XS.apply(this, arguments);
};
잡힌 본문은 이거였습니다.
POST https://freesis.kofia.or.kr/meta/getMetaDataList.do
{"dmSearch":{"OBJ_NM":"STATSCU0100000070BO","tmpV1":"D",
"tmpV45":"19980701","tmpV46":"20260812",
"tmpV40":"1000000","tmpV41":"1"}}
파라미터 이름(`tmpV1/45/46`)이 서비스 메타데이터의 SRCH_METAVAR 항목에 그대로 적혀
있었습니다. 코드로 며칠 헤맬 걸 30초에 끝냈습니다.
결과: 1998년 7월부터 오늘까지 7,163행이 단일 요청 0.2초에 들어옵니다.
같은 방법으로 투자자예탁금 표까지 뚫려서 마지막 데이터 공백도 닫혔습니다.
4. 읽는 사람 기준으로 말을 바꿨습니다
작업 중에 제가 계속 지적한 게 용어였습니다. "오발화가 뭐냐", "바닥 존이 뭐냐",
"ZBT가 뭐냐", "백필이 뭐냐" — 문서가 저 읽으라고 쓴 건데 제가 못 읽고 있었습니다.
지적할 때마다 고치면 작업이 끊기니 목록으로 모아뒀다가 한 번에 처리했습니다.
바꾼 것
바꾼 뒤
오발화
가짜 신호
바닥 존 / L1 존
바닥 / L1 바닥
점등 / 미점등
발생 / 신호 없음
발화 / 미발화 / 과다발화
발생 / 발생 없음 / 과다발생
무장
대기
캐피툴레이션
투매
washout
투매 소진
MAE
최대 역행 폭
ZBT
상승 종목 급확산
여기에 더해, 기준이 있는 용어는 커서를 올리면 기준이 뜨게 했습니다. "급확산은 신호 없음"
이라고만 쓰여 있으면 급확산의 기준이 뭔지 알 수가 없으니까요. 20곳에 붙였습니다.
휴대폰에 있는 한국어 스크린샷
밑줄 친 용어에 커서를 올리면 기준이 뜬다
정의는 자바스크립트 한 곳(`DEFS`)에만 두고 화면 여러 곳이 거기서 가져다 쓰게 했습니다.
같은 용어가 자리마다 다르게 설명되는 걸 막으려는 것입니다.
스타벅스 한국어 메뉴 스크린샷
매수 사다리 4단계와 살 이유 / 못 사는 이유. 조건을 통과한 항목은 '못 사는 이유'에서 사라진다
결과와 배운 점
얻은 것
· 판정이 뒤집힌 근거와 경위를 문서로 남겼습니다. 무효가 된 옛 판독은 지우지 않고
기록으로 보존하고, 현재 판독을 새 장으로 붙였습니다.
· 검증 규칙 두 개의 결함을 찾았습니다(문턱값 이식 오류, 중복 제거 규칙).
· 손으로 받던 자료 두 종을 자동화했습니다.
시행착오
제 추정이 크게 빗나갔습니다. 내부자 매수 자료 수집을 "30~45분"으로 잡았는데 실제로는
건당 1.5초씩 5시간짜리였습니다. 보고서 원문을 한 건씩 열어야 하는 구조를 제가 안 보고
답한 탓입니다. 중간에 사용자에게 정정해서 알렸습니다.
"6,000행 제한"이 사실이 아니었습니다. 기존 문서에 그렇게 적혀 있어서 저는 구간을 3년씩
쪼개는 코드를 짰는데, 사용자가 "전체 기간 엑셀 1개로 되는데?"라고 지적했습니다. 확인해보니
단일 요청으로 전 구간이 0.2초에 왔습니다. 문서에 적힌 제약을 검증 없이 믿은 것이 실수였습니 다.
화면이 조용히 낡아 있었습니다. 대시보드가 단독 HTML이라 데이터를 파일이 아니라 인라인으로
들고 있었는데, 그걸 손으로 붙여 넣는 구조였습니다. 그래서 히어로 차트가 7월 16일에 멈춰
있었는데 아무도 몰랐습니다. 동기화 스크립트를 만들어 봉했습니다.
CSS 함정: 조건을 통과한 항목을 hidden으로 감췄는데 안 사라졌습니다.
display: flex가 브라우저 기본 [hidden] { display: none }을 이깁니다.
꿀팁
1. 난독화된 사이트는 코드를 읽지 말고 요청을 잡으세요. 자바스크립트 역추적으로 반나절
헤맬 일을 브라우저 개발자도구에서 30초에 끝냈습니다. 클로드 코드에 크롬 자동화가 붙어 있으면
이걸 직접 시킬 수 있습니다.
2. "자료가 없어서 못 봤다"와 "조건이 틀렸다"는 다릅니다. 공백을 메우면 확인될 줄 알았는데
기각됐습니다. 미검증 항목을 '아마 맞을 것'으로 두고 넘어가면 안 됩니다.
3. 지적은 모아서 한 번에. 용어 지적이 나올 때마다 고치면 본 작업이 계속 끊깁니다.
목록 파일에 쌓아뒀다가 일괄 처리하니 훨씬 깔끔했습니다.
4. 결론이 뒤집혔을 때 옛 기록을 지우지 마세요. 왜 그때는 그렇게 봤는지가 남아 있어야
같은 실수를 반복하지 않습니다. "그날 그 데이터로는 그게 맞았다"를 문서에 명시했습니다.
5. 판정 근거는 커서만 올려도 나와야 합니다. 숫자만 있고 기준이 없으면 나중에 자기가 쓴
문서도 못 읽습니다.
도움이 필요한 부분
선행 PER의 과거 시계열이 막혀 있습니다. 컨센서스가 당시 시점 값으로 남아 있지 않아서
무료 경로로는 과거 복원이 안 됩니다. 지금은 수집 시작일부터 하루씩 쌓는 수밖에 없는데,
과거 시계열을 구할 방법을 아시는 분 있으면 알려주세요.
앞으로
· 대시보드에 근거 문헌 정리해 붙이기 (Zweig, Desmond, Seyhun, 김학균 등이 흩어져 있음)
· 중복 제거 규칙 수정 — 설계서를 바꿔야 하는 일이라 미결로 남겨둠
· 기각된 예탁금 조건을 컴포지트에서 빼기
한 가지 계속 붙잡고 있는 단서가 있습니다. 규칙상 조건이 다 섰지만, **지금 청산폭 −22%는
과거 어느 바닥에도 못 미칩니다.** 가장 얕게 털린 2022년이 −36.4%였습니다. 그리고 8월 4일
−29.1%에서 8월 11일 −22.3%로 신용잔고가 다시 늘고 있습니다. 청산이 끝난 게 아니라
되감기는 중일 수 있습니다. 조건 충족이 곧 안전은 아니라는 걸 화면 맨 위에 적어뒀습니다.
도움 받은 글
· 별도 참고 없이 진행했습니다. 원 연구의 근거 문헌은 Zweig의 Breadth Thrust,
Desmond(2001, Charles Dow Award)의 90% 데이 연구, Seyhun(1988/1992)과
Lakonishok & Lee(2001, RFS)의 내부자 거래 연구, 김학균(2012)의 PBR 밴드 검증입니다.