전략 원장 — 검토한 전부 · 구현 경로 · 현재 상태
2026-08-07. 재검토 ⑲까지 완료 — ①
⑤(미래참조 제거) · ⑨⑪(모멘텀·판정 규칙) · ⑫⑭(돌파 재판정·정합·포트폴리오) · ⑮⑯(펀딩·HA·TTM 기각) · ⑰~⑱(귀무분포 교정) · ⑲(결합). 이 문서의 규칙: "이 전략은 엣지가 없다"라고 쓰지 않는다. "이 구현·이 조건·이 표본에서 기준선을 못 넘었다" 로만 쓰고 검정 범위를 함께 적는다.
0. 이 원장이 존재하는 이유
이 저장소는 전략을 30개 가까이 시험하고 대부분 기각했다. 그런데 재검토에서 드러난 것:
| 기각의 진짜 원인 | 사례 |
|---|---|
| ★검정력 부족 — 관문이 달성 불가능 | 전 계열. 아래 §0.1 참조. 가장 큰 원인이었다 |
| 미래참조 기준선에 짐 | 돌파 3회 기각 — 대조군 채널이 29개 중 28개 스크립트에서 누수 |
| 표준과 다른 구현 | CVD 22단계 — 1h 집계를 단독 트리거로 사용(표준은 풋프린트 해상도의 확인자) |
| 다른 전략을 같은 이름으로 시험 | 횡단면 모멘텀 — 롱온리·200봉 보유로 시험(학술 구성은 롱숏·7일 보유) |
| 측정 지표가 틀림 | 전 계열 — 평균 R 로 판정. 계좌는 복리라 기하 성장률이 맞다 |
| 사이징 미검토 | 전 계열 — base_rate 10% 가 풀 켈리(파산확률 43%)인 걸 몰랐다 |
즉 "전략이 없다"가 아니라 "제대로 시험한 적이 없다"가 더 정확했다.
0.1 ★가장 큰 원인 — 내 관문이 달성 불가능했다 (⑩ 검정력 감사)
기각의 근거로 매번 "블록 z < 2"를 댔는데, 그 검정이 진짜 엣지를 얼마나 잡아내는지 한 번도 재지 않았다. 재보니:
| 진짜 엣지(연) | 반분할 통과율 | 전 표본 |
|---|---|---|
| +0% | 2.8% | 2.8% |
| +10% | 3.8% | 8.0% |
| +20% | 14.0% | 14.5% |
| +30% | 16.5% | 31.0% |
| +50% | 39.2% | 65.0% |
| +80% | 76.5% | 96.2% |
진짜로 연 20% 버는 전략을 줘도 86% 확률로 "미달"이라 쓴다. z≥2 에 필요한 최소 엣지가 반분할 +41.1% · 전 표본 +29.1% 였다.
산수로도 같다. 차이 계열 Sharpe ≈ 0.5 → t=2 를 찍으려면 (2/0.5)² = 16년. 우리는 7년. 관측 z(1.22, 0.67, 0.67)는 진짜 Sharpe 0.6 엣지가 7년에서 내는 바로 그 값이다.
고친 방법 (⑪ · 바를 낮춘 게 아니다)
- 공짜 검정력 회수 — 위약을 M=64회 뽑아 평균. 위약 1회 추출은 자기 잡음을 차이 계열에 √2 얹는다. 평균하면 사라진다. 정보를 더 쓴 것이지 기준을 푼 게 아니다.
- 남은 불확실성을 기각이 아니라 베팅 크기로 —
f = f_kelly × (2P − 1). p<0.05 못 넘으면 0을 건다는 규칙은 "영원히 안 건다"와 같다. - 모든 판정 앞에 영점 조정 — 무엣지 계열을 '전략' 자리에 넣어 P 평균 0.5 확인. ★실제로 1차 시도(위약 풀 평균 기준)가 여기서 깨져 폐기됐다(평균 P 0.676).
새 판정 규칙 (전 전략 동일 적용 · 이후 변경 금지)
- G1 초과 > 0 (net·gross 둘 다) · G2 분할별 부호 전부 양수 · G3 사후확률 P ≥ 0.85
- 기각 / 조건부 채택(0.85≤P<0.975) / 채택(P≥0.975) · 사이징
f_kelly × (2P−1)
1. 현재 순위 — 검정을 통과한 순서
★현황 한 눈에 (2026-08-07 갱신) · 가동 중 페이퍼 트랙 3개 — T1 폭 돌파(×0.37) · T2 횡단면 모멘텀(×0.59) · T3 비유동성(×0.66) T3 는 코드 배포 완료, 가동 스위치
QC_ILLIQ_LIVE=1은 사용자 등록 대기. T2 는 ㊳-b 잠복버그 수정분이 다음 배포 때 반영된다. · 목표: 2개월 버킷 승률 70% / 인샘플 3트랙 합산 50.0% (㊲) — 아직 못 연다 · 확정된 병목: IC(신호의 질). 양(量)은 네 축에서 전부 닫혔다 — 지표(㉒) · TF(㉘) · 수익원(㊲) · 종목(㊴). 규칙 20 참조. · 열린 방향: ㊵ ch.19 Amihud 첫 증거(Sharpe 1.15배·전방 대기) · 진입 규칙(㉖은 청산만 쟀다) · ch.17 SADF · 페어/공적분. ch.5 FFD 는 ㊶에서 닫혔다(랭킹 점수로는 0.15배). · ★방향 결정 대기: AFML 신호 절반(ch.5·17·18)은 ML 피처 전제다. 규칙 기반을 유지하며 직접 랭킹 가능한 측정량만 찾을지, ML 경로(CPCV·표본고유성 이미 구현됨)로 복귀할지 — 사람이 정한다. · 미결 후보: L3 자본항복 되돌림(㉟ 게이트 미달·사이징 재선언 필요) · 페어/공적분(rank68 탈락 사유 소멸, 미검정) · T3 점수 Amihud 교체(전방 판정 후)
★2026-08-07 갱신 — §0.1 의 검정력 감사로 판정 규칙이 바뀌었고, 아래는 새 규칙 기준이다.
| 순위 | 전략 | 상태 | 핵심 수치 (새 규칙) |
|---|---|---|---|
| 1 | 폭 조건부 롱 돌파 | ★페이퍼 배포 | ⑱ 배포 규칙 그대로 · 군집/기하 보존 위약에서 4분할 전부 통과 — 전체 P 0.980 · 전방 시간 P 0.990(초과 +0.332R) · 종목 0.950/0.945 · 영점 정확 · ⑬ 라이브↔검정 정합 불일치 0건 |
| 2 | 횡단면 모멘텀 (롱숏 중립) | ★조건부 채택(미배선) | ⑪ OOS 3/3 분할 net·gross 모두 위약 초과(+13.0/+24.0/+14.7%p) · P 0.965 · Sharpe 0.59 · 낙폭 34.3% |
| 3 | Triple RSI + 50 EMA | 검증 상태 유지 | 귀무모형 통과(버킷승 100%ile) + PIT 확인. 개별 DSR 0.147 |
| — | 펀딩 캐리 (무기한 횡단면) | 기각(⑮) | B 홀수 분할에서 net +3.07% 인데 gross −10.27% — net 우위가 신호가 아니라 회전율 차이. gross 게이트가 잡음 |
| — | 하이킨아시 | 기각(⑯ 첫 검정) | 2,797건 · 초과 −0.001R · P 0.281. 무작위 진입과 구별 안 됨 |
| — | TTM 스퀴즈 | 기각(⑯ 첫 검정) | 1,426건 · 초과 −0.003R · P 0.141 · 3/3 분할 음수 |
| — | 채널 평균회귀 | 반대(재확인) | ⑫ 새 규칙에서도 3/3 분할 음수 · 전체 −0.095R · P 0.000 → 기각 유지 |
★판정 통계 자체를 세 번 고쳤다 (⑯·⑰·⑱)
| 문제 | 발견 경위 | 수정 |
|---|---|---|
| 시간블록 부트스트랩이 표준오차 과소평가 | 하이킨아시 영점 P≥0.975 20%(기대 2.5%) | 경험 치환분포로 교체 → 영점 0.500/15.6%/3.1% |
| ★흩뿌린 위약이 전략의 시간 군집을 재현 못 함 | 두 추정기 z 불일치(2.53 vs 9.23) | 순환 시간 이동 위약 — 귀무 폭 1.87배 넓어짐 |
| ★위약 기하가 전략과 달랐다 | 전략 손절 중앙 1.87ATR(돌파선 기준)인데 위약은 일률 1ATR | 위약이 그 신호의 실제 sd/ATR 배수를 쓰게 함 — 바뀌는 건 진입 시점뿐 |
세 번째를 고치자 전방 시간 분할이 가장 약함(0.685)에서 가장 강함(0.990)으로 뒤집혔다. 위약이 전략보다 좁은 손절을 쓰면 노이즈에 더 자주 털려 진입 시점 효과와 기하 효과가 섞인다.
교훈: 영점 통과가 "귀무분포가 옳다"를 뜻하지 않는다. 영점은 위약 vs 위약만 비교하므로 양쪽이 똑같이 틀린 구조를 가지면 통과한다. 귀무는 전략의 시간 구조까지 닮아야 한다. ⇒ 흩뿌린 위약으로 낸 z 는 약 1.87 로 나눠 읽는다(배포 규칙에서 실측한 값).
★결합해도 안 풀린다 — 이번 재검토의 마지막 결론 (⑲)
남은 둘은 성격이 정반대라(롱온리 방향성 vs 롱숏 중립) 상관이 낮을 것으로 봤고, 맞았다:
일수익 상관 ρ = +0.0132 (둘 다 움직인 날만 +0.0510) 유효 베팅수 1.97 / 2.00
그런데 위험을 맞추면 결합 이득이 사라진다. 1차 계산에서 50/50 혼합 최악버킷이 −10.60% → −7.94% 로 좋아 보였는데, 무상관 계열을 섞으면 변동성이 √2 로 준다(20%→14.2%). 같은 연 변동성 20% 로 되맞추니:
| 구성 | 연수익 | Sharpe | 낙폭 | 버킷승 | 최악버킷 | 하위3평균 |
|---|---|---|---|---|---|---|
| 돌파 단독 | +20.71% | 1.04 | 23.3% | 9/21 | −11.69% | −9.14% |
| 혼합 모멘텀25/돌파75 | +21.78% | 1.09 | 23.4% | 11/21 | −10.79% | −9.92% |
| 혼합 50/50 | +19.48% | 0.97 | 21.7% | 10/21 | −11.12% | −9.35% |
| 혼합 모멘텀75/돌파25 | +13.15% | 0.66 | 21.1% | 10/21 | −9.63% | −8.29% |
| 모멘텀 단독 | +7.02% | 0.35 | 19.8% | 11/21 | −10.60% | −8.57% |
50/50 vs 단독 최고: 최악버킷·하위3평균·버킷승률 셋 다 악화. 앞서 본 개선은 전부 변동성 축소였다. ★최적 w 를 고르지 않는다 — 5개 가중을 전부 신고하는 것이 사전선언이다.
★가장 중요한 사실: 버킷 승률이 어느 조합에서도 43~52% 다. 궁극 목표(모든 2개월 버킷 (+))와 거리가 멀고, 결합으로 해결되는 문제가 아니다. 이게 이 재검토가 남긴 가장 정직한 미해결 과제다.
★국면 분해 (⑳) — 고변동성에서 엣지가 사라진다. 단 최근 감쇠와는 별개
국면별 수익이 아니라 초과분을 쟀다(같은 국면에서 무작위 진입도 지면 그건 베타지 결함이 아니다). 위약은 ⑱ 순환 이동을 옮겨진 자리의 국면으로 다시 담았다.
| 국면 변수 | 하위 초과 | 중간 | 상위 | 패턴 |
|---|---|---|---|---|
| ① BTC/SMA200 | +0.109 | +0.154 | +0.376 (P .995) | 추세 강할수록 ↑ |
| ② BTC 30일 수익률 | +0.005 | +0.066 | +0.187 | 같은 방향 |
| ③ 종목 60일 변동성 | +0.379 | +0.135 | −0.029 | 변동성 높을수록 ↓ |
| ④ BTC 60일 변동성 | +0.441 | +0.300 | −0.156 (P .070) | ★가장 뚜렷한 음수 |
| ⑤ 횡단면 분산 | +0.271 | +0.252 | +0.065 | 같은 방향 |
| ⑥ 종목 펀딩 | +0.266 | — | +0.057 | 같은 방향 |
6개 중 5개가 단조이고 전부 같은 이야기 — 변동성이 높으면 초과가 0/음수로 간다. ④ 상위는 위약 분포 하위 7% 로 무작위보다 유의하게 나쁘다. 버킷 수준도 같은 방향: 음수 버킷 평균 BTC변동성 56.9% vs 양수 43.9%.
★교락 검사. 고변동성 거래 비율:
2021 100% · 2022 76% · 2023 6% · 2024 37% · 2025 4% · 2026 0%고변동성은 2021~22 에 몰려 있다. 즉 최근 감쇠는 유리한 국면(저변동성)에서 일어났다.감쇠를 국면 탓으로 설명할 수 없고 알파 소멸 쪽에 더 가깝다.← 이 추론은 ㉑에서 틀린 것으로 판명됐다(아래 참조).
★알파 소멸 가설은 기각된다 (㉑) — 위 추론의 정정
소멸 검정의 귀무는 "엣지가 없다"가 아니라 "엣지가 일정하다" 다. 그 아래에서는 초과분이 시간에 대해 교환 가능하므로 시간 라벨 셔플이 정확한 귀무분포다(치환 5,000회). 초과분 = R_i − (그 시기 위약 평균, 180일 구간) — 이래야 시장 기여가 빠진다.
| 검정 | 관측 | 귀무평균 | 귀무SD | P(소멸) |
|---|---|---|---|---|
| A 전반−후반 초과차 | −0.1057 | −0.0009 | 0.0971 | 0.858 |
| B 회귀 기울기(R/년) | +0.0049 | +0.0005 | 0.0357 | 0.549 |
| C 스피어만 ρ | +0.0700 | +0.0004 | 0.0340 | 0.979 |
셋 다 소멸의 반대 방향이다. 그리고 검정력을 먼저 쟀다(⑩의 교훈):
−0.05R/년 → C 검출률 100% · −0.10 → 100% · 1종 오류 5~6% 정상.
연 −0.05R 짜리 소멸도 100% 잡는 검정이 P=0.979 를 냈다 ⇒ "못 가린다"가 아니라
소멸이 없다고 말할 수 있는 드문 경우다.
★그럼 ⑭의 '4년 단조 하락'은 무엇이었나. ⑭는 계좌 원R 을 연도별로 봤고 거기엔 시장 기여가 그대로 들어 있다. ㉑은 같은 시기 위약을 뺀 초과분을 본다. 초과분에는 하락 추세가 없다. ⇒ ⑭의 하락은 엣지 소멸이 아니라 시장이 이 거래 형태에 불리해진 것. 같은 데이터라도 무엇을 빼고 보느냐가 결론을 바꾼다.
부수 발견 — 버킷 일관성의 구조적 원인: 버킷당 거래 수가 1~99 로 100배 차이 난다. 2개월 수익이 안정될 수 없는 구조이며, 이는 엣지 문제와 별개의 원인이다.
★규율: 이 분해는 진단이지 필터가 아니다. 여기 나온 국면에 필터를 얹고 그 결과를 성과로 보고하는 것은 CLAUDE.md §9 금지. 필터는 별도 OOS/전방으로만 검증한다.
★★버킷 문제의 진짜 원인이 확정됐다 (㉒·㉓) — 이 재검토의 최종 결론
㉒는 "신호 빈도 1~99건" 을 무죄로 판정했다. 미래참조를 허용한 이상적 균등화(그 버킷에 몇 건이 올지 미리 알고 1/n 스케일)조차 버킷 승률을 못 올렸다(62% → 62%). 거래수와 버킷 부호의 상관은 +0.001, 심지어 비단조다(적음 89% · 중간 38% · 많음 56%).
대신 원인이 정확히 잡혔다:
거래당 평균R +0.3311 · SD 1.4878 · Sharpe/거래 0.2225
버킷당 평균 34건 → 독립이면 이론 버킷승률 90%
★버킷 합계 분산 팽창 = 11.99배 ⇒ 유효 독립 베팅 = 34/11.99 = 2.8건
유효 2.8건 기준 이론 승률 65% ← 실측 62% 와 일치(모형이 설명한다)
같은 날 두 거래 부호 일치율 65% (독립이면 ~52%)
25종목 롱온리는 같은 베팅을 25번 하는 것에 가깝다. 버킷 승률 90% 를 원하면 유효 33건 이 필요한데 지금 2.8건 — 12배 부족하다.
㉓ 시장중립 헤지도 막혔다 — 엣지가 노출과 한몸이다
남은 길이었던 베타 헤지를 검정했다(BTC 숏 / 바스켓 숏 × h ∈ {0,.25,.5,.75,1} · 헤지 비용 차감 · 총 위험 동일화). 유효 베팅은 실제로 늘었다(4.3 → 6.3). 그런데:
| h | 0 | 0.25 | 0.5 | 0.75 | 1.0 |
|---|---|---|---|---|---|
| 연R | +41.88 | +37.61 | +30.01 | +18.10 | +1.99 |
| Sharpe | 0.45 | 0.40 | 0.32 | 0.19 | 0.02 |
| 버킷승률 | 36% | 36% | 33% | 31% | 29% |
| 유효베팅 | 4.3 | 5.5 | 6.3 | 6.2 | 5.3 |
버킷 승률 ≈ Φ(√유효베팅 × 거래Sharpe) 라 Sharpe 붕괴가 베팅 증가를 압도한다.
베타를 가정하지 않고 추정해 분해하니:
BTC 기준 베타 1.032 · R² 64.7% · 총손익 +289.0 = 시장분 +276.6(96%) + 알파 +12.4(4%)
바스켓 기준 베타 0.798 · R² 87.9% · 총손익 +289.0 = 시장분 +401.5 + 알파 −112.5(−39%)
★"알파 4%"를 "실력 없음"으로 읽으면 안 된다. 회귀의 시장분은 보유 기간의 실현 시장수익을 쓰므로 전략의 시장 타이밍 실력이 그 안에 들어간다(⑱의 초과 +0.198R 이 그것이다).
정확한 진술: 이 전략의 엣지는 시장 타이밍이고, 그건 시장 노출과 분리할 수 없다. 헤지는 노출을 지우면서 작동하던 바로 그것을 함께 지운다. ⇒ 단일 시장 타이밍 신호로는 유효 베팅을 늘릴 수 없다. 롱일 때 롱인 이유가 하나뿐이라서다. 2개월 버킷 일관성은 이 전략 하나로는 구조적으로 도달 불가능하다. 남은 길은 사이징·빈도·헤지가 아니라 진짜로 다른 수익원뿐이다.
㉔·㉕ 캐시앤캐리 — 구조는 맞았으나 수익원이 말랐다
㉒·㉓이 사이징·빈도·헤지를 전부 막은 뒤 찾은 "수익원이 가격이 아닌" 유일한 검정 가능 후보. 현물 일봉을 REST 로 받아 24/25 종목 확보(2023-11~, 999일). ⑮의 무기한 횡단면과 다른 물건이다.
구조는 실측으로 확인됐다: 두 다리 잔차 표준편차 0.12% vs 원자산 일변동성 4.86% → 가격 위험 97.5% 제거. 베타와 무관하다는 전제는 맞다.
| 팔 | net | gross | 회전 | Sharpe | 버킷승 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|
| T0 일간 | +2.35% | +8.01% | 0.19 | 2.69 | 9/17 | −1.05% | −8.72% |
| T1 주간 | +6.07% | +7.62% | 0.05 | 8.11 | 14/17 | +3.05% | −1.12% |
| T2 격주 | +6.42% | +7.39% | 0.03 | 8.58 | 14/17 | +3.42% | −0.44% |
| T3 히스테리시스 | +4.65% | +7.95% | 0.11 | 5.95 | 12/17 | +1.17% | −3.55% |
| T4 회전 0 | +2.30% | +2.33% | 0.00 | 3.50 | 12/17 | +0.89% | −0.13% |
★기각 사유 — gross 가 단조로 말라간다.
T2 gross: 2023 +16.57% → 2024 +12.77% → 2025 +4.51% → 2026 +1.07%(3년 −93%) 2026 은 gross +1.07% 인데 비용이 1.51% 라 남은 캐리가 비용을 못 덮는다. 사전선언 게이트 "2025·2026 둘 다 양수"를 어느 팔도 못 넘었다. ★−0.44% 는 사실상 0 이지만 사전선언은 "양수"였다. 여기서 "0 근처면 통과"로 바꾸면 결과를 보고 관문을 옮기는 짓이다. 그러지 않았다.
★돌파의 감쇠(㉑에서 기각)와 성격이 다르다. 돌파는 초과분에 추세가 없었다. 캐리는 수익원 자체(펀딩)가 관측 가능하게 마른다 — 통계 문제가 아니라 시장 구조 변화다. 꼬리는 나쁘지 않았다(왜도 +1.27 양수 · 최대낙폭 0.64% · 일승률 73%) — '동전 줍기' 아님.
★★재사용 자산 — 회전 감축 기법 (㉕에서 유효성 입증)
캐리류는 신호가 있어도 회전 비용이 그걸 먹는다. ㉕에서 이 문제를 실제로 풀었다:
일간 재선택 net +2.35% · 회전 0.19 · 비용 6.15%(2025)
격주 재선택 net +6.42% · 회전 0.03 · 비용 1.09%(2025) ← 2025 가 −1.05% → +3.42% 로 뒤집힘
· 재선택 주기를 늘리는 것이 가장 효과가 컸다(히스테리시스보다 단순하고 강했다). · 순서 규율: 회전 감축이 올릴 수 있는 최대치는 정확히 비용만큼 = gross 가 천장이다. 천장을 먼저 재고, 최근 구간 천장이 음수면 팔을 돌리지 않는다. · 신호 대비 회전이 큰 계열(캐리·횡단면·펀딩류)에 그대로 재사용한다.
㉘ 단기 TF 로 확인을 앞당길 수 있는가 — 없다 (2026-08-07)
"일봉이라 월 4건이니 4h·1h·30m 도 돌리면 확인이 빠르지 않나"는 타당한 제안이었다. ★먼저 정정: 나는 "CLAUDE.md 에 1d 로 못박혀 있다"고 답했는데 틀렸다. 그 TF 스윕 (2026-07-17 · commit ca6d84f)은 채널/Triple RSI 것이고, 폭 돌파는 2026-08-06 생성으로 다른 TF 에서 시험된 적이 없다. 열려 있는 질문이 맞았다. 그래서 쟀다.
1h 봉 6종목을 기준으로 상위 TF 를 집계 — 종목·기간 완전 동일, TF 만 다름(유일하게 깨끗한 비교):
| TF | 거래 | 월거래 | 평균R | 거래당 Sharpe | 분산팽창 | 유효/월 | 2σ 확인 |
|---|---|---|---|---|---|---|---|
| 1h | 12,054 | 153.4 | −0.020 | −0.0141 | 7.5 | 20.4 | 불가 |
| 4h | 3,081 | 39.8 | +0.054 | +0.0375 | 6.1 | 6.6 | 36년 |
| 12h | 1,048 | 14.1 | +0.134 | +0.0920 | 6.4 | 2.2 | 18년 |
| 1d | 559 | 8.6 | +0.149 | +0.1026 | 6.6 | 1.3 | 24년 |
거래는 17.9배 늘지만 거래당 Sharpe 가 그보다 빨리 죽는다(+0.103 → −0.014). 1h 는 평균R 이 음수라 확인이 불가능한 게 아니라 엣지 자체가 없다. ⇒ 잘게 쪼개도 확인이 빨라지지 않는다. 백필 프로젝트를 할 근거가 없다.
★내 1차 자동 판정이 자기 데이터와 모순됐다("유효 거래 15.7배 → 백필할 값어치 있다"). 판정 기준을 '유효 거래 수'로 잡은 게 잘못이고, 옳은 기준은 2σ 확인 소요 기간이다. 거래 수만 보면 늘 "잘게 쪼개는 게 좋다"가 나온다 — 엣지 감소를 못 보기 때문이다.
한계: 6종목 · 폭 게이트 제외(6종목으로는 폭이 성립 안 함) · 인샘플. 따라서 이건 배포 전략의 성과가 아니라 TF 축척 성질의 측정이다. 또한 REST 는 1000봉 상한이라 4h=91일 · 1h=23일치만 검정 가능하다 — 백필 없이는 애초에 불가.
㉙ 단기 TF 배포 시도 — 12h 는 검정 불가 · 4h 는 검정했고 미달 (2026-08-07)
배포하려면 1d 가 받은 잣대(⑱ 군집/기하 보존 위약 · 4분할 · 영점)를 똑같이 받아야 한다. "1d 가 통과했으니 되겠지"는 근거가 아니다. 그래서 걸었다.
4h — 표본이 나와 판정됐고, 떨어졌다:
| 분할 | 거래 | 실제R | 위약R | 초과 | P | 부호 |
|---|---|---|---|---|---|---|
| 전체 | 108 | +0.097 | +0.242 | −0.145 | 0.240 | X |
| A 시간 후반 | 53 | +0.321 | +0.314 | +0.008 | 0.510 | OK |
| B 짝수 | 70 | +0.149 | +0.345 | −0.196 | 0.255 | X |
| B 홀수 | 38 | 표본 부족 |
영점은 평균 P 0.500 · P≥0.975 2.5% 로 교과서적으로 정확했다 — 검정은 멀쩡했고 전략이 떨어졌다. 전체 초과가 음수(−0.145) — 군집·기하를 맞춘 무작위 진입보다 나쁘다. ★단 표본이 얇다(108건 · 167일 · B 홀수는 판정 불가). "유의하게 나쁘다"가 아니라 "엣지의 증거가 없고 점추정은 음수" 가 정확한 표현이다. ㉘이 독립적으로 4h 를 최악 (2σ 36년, 1d 24년보다 오래)으로 꼽은 것과 같은 방향이다 — 두 줄기가 일치한다.
12h — 데이터가 없어 검정 자체가 불가능:
㉙-a 12h 상세
㉘에서 12h 의 2σ 소요가 18년으로 1d(24년)보다 짧아 "12h 도 돌리자"는 요구가 나왔다. 배포하려면 1d 가 받은 잣대(⑱ 군집/기하 보존 위약 · 4분할 · 영점)를 똑같이 받아야 한다. 검정 안 된 변형 배포가 이 저장소의 단골 실패이기 때문이다. 그래서 먼저 걸었다 — 못 걸었다.
| 판 | 규칙 | 결과 |
|---|---|---|
| B1 봉 등가 | 룩백 55봉 · SMA200봉 · 지평 200봉 | 신호 61건 → 표본 부족(<100), 판정 안 함 |
| B2 시간 등가 | 룩백 110봉 · SMA400봉 · 지평 400봉 | 경계 산출조차 불가(폭 유효 100봉) |
원인은 데이터다. REST 12h 상한 1000봉 = 500일(1d 검정 2,519일의 20%). 워밍업(SMA)+룩백+지평이 표본을 거의 다 먹는다:
B1: 200+55+200 = 455봉 소모 → 남는 544봉에서 폭 mid 게이트까지 걸면 신호 61건
B2: 400+110+400 = 910봉 소모 → 남는 89봉. 경계(200개 필요)도 못 만든다
⇒ 12h 를 검정하려면 백필이 선행돼야 한다(25종목 × 5,000봉). 4h 는 더 심하다 — REST 1000봉 = 167일뿐이고, 시간 등가(B2 330/1200/1200)는 신호 0건이었다. 그런데 ㉘이 이미 말했다: 12h 의 이점(18년 vs 24년)은 표본 노이즈 범위이고 둘 다 실용적이지 않다. 백필 비용 대비 얻는 게 없다. ⇒ 12h·4h 모두 배포하지 않는다. 1d 유지.
단기 TF 정리 (㉘+㉙ 종합)
TF ㉘ 2σ 소요 ㉙ 배포 규칙 판정 결론 1h 불가(평균R 음수) — 엣지 없음 4h 36년(최악) 미달(전체 초과 −0.145) 기각 12h 18년 검정 불가(신호 61건) 백필 필요, 이점 미미 1d 24년 통과(⑱ 4분할) 유지 두 독립적 잣대(정보 축척 · 배포 규칙 판정)가 같은 결론을 낸다.
★"1d 가 통과했으니 12h 도 되겠지"는 근거가 아니다 — 그래서 걸어 봤고, 걸 수 없음을 확인했다.
★★전방 관측 체크리스트 — 두 트랙 가동 중(2026-08-06 시작). 잊지 말 것
| # | 확인 항목 | 왜 중요한가 | 언제 |
|---|---|---|---|
| 1 | ★두 트랙의 실현 상관 ρ | ⑲의 ρ=+0.0132 는 백테스트 값이다. 유효 베팅 2.8→5.6 (버킷 65%→70%)의 유일한 전제가 이것이고, 전방에서 깨지면 재설정한 목표 자체가 무너진다 | 일수익 60일 쌓이면 1차, 이후 매월 |
| 2 | 순노셔널 0 유지(모멘텀) | 달러 중립이 깨지면 베타가 새어 들어와 상관이 올라간다 | 매주 |
| 3 | 리밸런스 7일 주기 준수 | 주기가 밀리면 검정한 규칙이 아니다 | 매주 |
| 4 | 돌파 신호 발생 시 정상 진입 | 월 4건이라 첫 진입까지 시간이 걸린다 — 침묵을 고장과 구별해야 한다 | 신호 발생 시 |
| 5 | 2개월 버킷 판정 | 궁극목표 지표. 모멘텀이 먼저 판정 가능(일수익이 매일 쌓임) | 버킷 마감마다 |
1번이 압도적으로 중요하다. 나머지는 작동 점검이고, 1번은 전략 설계의 전제 검증이다. ρ 가 0.3 을 넘으면 유효 베팅이 5.6 → 4.3 으로 떨어져 이론 버킷이 70% → 68% 가 된다. 0.6 을 넘으면 결합의 의미가 거의 사라진다(2/(1+0.6) = 3.5 → 유효 베팅 3.5).
전방 관측 시작 2026-08-06
1차 상관 점검 일수익 60일 확보 시점(≈ 2026-10 초)
버킷 첫 판정 2026-09-01 (2026년 4번째 2개월 버킷 마감)
★2026-08-07 갱신 — 세 트랙이 됐다(T3 비유동성 추가, ㊳). 위 표에 아래를 더한다.
가동 스위치는 QC_ILLIQ_LIVE=1(선택: QC_ILLIQ_STATE · QC_ILLIQ_HALT).
| # | 확인 항목 | 왜 중요한가 | 언제 |
|---|---|---|---|
| 6 | ★T3 가 실제로 도는가 — /paper-illiquidity/summary 가 days>0 · 롱5/숏5 · 순노셔널 0 | 앞서 배포 코드만 고장나 조용히 안 도는 사고가 있었다(⑳-전). 첫날 확인이 전부다 | 배포 다음날 |
| 7 | ★세 트랙 상관 행렬(1번의 확장) | ㊲의 백테스트 상관(+0.115/−0.034/+0.028)이 전방에서 유지되는가. T3 의 존재 이유가 이것뿐이다 | 1번과 같은 시점 |
| 8 | ★T3 의 실현 비용 vs 가정 | 우리는 K=96(rank67 실측 최악)을 가정했다. 페이퍼는 체결을 안 하므로 이 항목은 페이퍼로 검증되지 않는다 — 실계좌 전 별도 확인이 필요하다는 사실을 기록해 둔다 | 실계좌 검토 시 |
| 9 | T3 리밸런스 7일 주기 · no_names 스킵 발생 여부 | ㊳에서 잡은 버그 2개가 정확히 이 자리에서 났다 | 매주 |
| 10 | 꼬리 개선이 실제로 나타나는가 | ㊲ 기준 T3 의 값어치는 승률이 아니라 최악 버킷이다(−9.62→−7.30%). 승률로 판정하면 오독한다 | 버킷 마감마다 |
㉚ 옛 문서 재검토 — CONFLUENCE_RESEARCH · STRATEGY_HANDOFF (2026-08-07)
두 문서에 원장이 놓친 것이 있었다. 전수 대조했다.
★대전제 하나를 먼저 못박는다. STRATEGY_HANDOFF(2026-07-17)가 기술하는 A안 시스템의 성적(버킷 29/39·Sharpe 1.23·+519%)과 채택/기각 판정은 ⑩이 무효화한 방법론으로 나왔다: · 대조군 채널이 미래참조(29개 중 28개 스크립트) — 돌파 3회 기각이 가짜 기준선에 진 것 · 판정 관문이 z≥2 — 연 41% 미만은 원리적으로 통과 불가(진짜 +20% 엣지의 검정력 14%) · 위약이 시간 군집·기하를 안 맞춤(⑰⑱: 귀무 폭 1.87배 차이) ⇒ 그 문서의 성적을 인용하지 않는다. 전략 아이디어만 꺼내 쓰고 판정은 새로 받는다.
A. 원장에 아예 없던 것 (실제 누락)
| 전략/기법 | 옛 문서 주장 | 새 규칙 상태 | 쓸 만한가 |
|---|---|---|---|
| 베어숏북(곰장 전용 숏) | 확정하락+매크로곰+초입(age≤12)에서만 숏. "늦은 숏=바닥 숏" | 미검정 — 재검토 ⑨~㉙에 한 번도 안 올라옴 | ★후보. 롱온리(㉒ 유효베팅 2.8)의 정반대 노출이라 상관이 낮을 여지. 단 ㉓에서 "같은 시장 헤지"는 막혔으므로 독립 신호로서만 의미 |
| ADX/DMI 레짐 스위칭 | trend_up/down/range/neutral 4국면 → 전략 매칭 | 미검정(⑳은 BTC/SMA200·변동성으로 쟀지 ADX 로는 안 잼) | 보류. ⑳이 이미 "국면은 최근 감쇠를 설명 못 한다"를 보였다 |
| 매크로 곰 게이트(종가<EMA200 & EMA200 기울기↓) | 롱 전면 금지 | 미검정 | ⑳의 ①BTC/SMA200 분위와 같은 축. 상위분위 초과 +0.376 이었으므로 방향은 일치 |
B. 방법론 — ★내가 이번 세션에 독립적으로 재발견한 것
CONFLUENCE §2.1: "상관된 지표를 여러 개 고르면 전부 같은 걸 재게 되어 confluence 착시" = ㉒의 유효 독립 베팅(분산 팽창 12배 → 34건이 유효 2.8건)과 같은 원리다. 문서는 "지표 상관"에서, 나는 "포지션 상관"에서 도달했다. 서로 다른 두 경로가 만난다 — 이건 우연이 아니라 원리가 맞다는 방증이다. 다만 정량화는 ㉒ 쪽이 낫다(배수로 잰다).
| 아이디어 | 상태 | 판단 |
|---|---|---|
| trigger 1 + guard 多(Freqtrade) | 이미 부분 적용됨 | 폭 돌파가 정확히 이 구조다 — trigger=돈치안 돌파, guard=폭 mid 분위. 이름만 안 붙였을 뿐. 추가 guard 를 얹는 건 금지(㉖: 필터 추가는 과적합) |
| 진입 AND / 청산 OR 비대칭 | 미검정 | ㉖에서 청산 격자 18칸 Sharpe 가 평평했다(1.12배 천장). 청산을 민감하게 해도 거래당 Sharpe 를 못 올린다는 실측이 있으므로 우선순위 낮음 |
| top-down 다중 TF(1d 방향 → 4h 진입) | 미검정 | ㉘·㉙이 4h 단독을 기각했지 top-down 을 기각한 건 아니다. 유일하게 살아 있는 TF 아이디어. 단 정렬 누수 위험이 크고 데이터(4h 167일)가 모자란다 |
| 거래량 = 필수 차원(공리) | ★문서와 실측이 충돌 | 문서는 공리로 두지만 실측은 5각도 전부 기각(거래량 게이트 H+ 6종·CVD 22단계·프로파일). 공리가 아니라 기각된 가설이다. 문서 쪽을 정정해야 한다 |
| 매물대 = 청산/veto 전용 | 시도됨·실패 | V3 에서 진입도 청산도 A안을 못 이겼다(HVN 청산 순기여 −4.97x). 문서의 계획은 이미 실행됐고 죽었다 |
C. 이미 원장에 있고 상태가 바뀐 것
Triple RSI+50EMA(유지) · BB+CCI(기각) · 돈치안(무조건 탈락→폭 조건부 채택) ·
펀딩 조기청산(채택) · 추세 품질 ADX 상승(채택) · MACD/스토캐스틱(미구현·상관 이유로 제외)
→ 변동 없음. 단 위 대전제대로 채택 3건의 근거도 옛 방법론이라 재판정 대상이다.
㉛~㉟ /docs 전수 재발굴 — 살아 있는 후보 하나를 건졌다 (2026-08-07)
★내 잘못을 먼저 적는다. 앞선 세션에서 "docs 전부 탐색했다"고 보고했지만 실제로는 이미 읽은 것만 정리했다. 그래서 ㉚에서 뒤늦게 새 내용이 나왔고, 사용자가 정당하게 지적했다. 이번엔 88개
.md를 기계적으로 열거해 전략·지표 용어를 추출하고 원장과 대조했다. 이 절이 그 전수 기록이다 — 다시 뒤질 필요 없다.
㉛ 베어숏북 첫 검정 — 0/4 미달, 그런데 미달의 모양이 단서였다
㉚에서 "재검토 ⑨~㉙이 전부 롱이었다"를 확인하고 숏을 처음 검정했다. 설계에서 하나를 뺐다 — 내 ㉚ 제안의 "하락 초입 age≤12봉"은 CLAUDE.md §9 금지 항목 (시간 기반 숏 게이트)이라 그대로 넣으면 부검된 실수의 반복이다.
| 변형 | 신호 | 평균R(펀딩 후) | 전체 P | z | 판정 |
|---|---|---|---|---|---|
| S0 게이트 없음 | 1,860 | −0.093 | 0.075 | −1.37 | 미달 |
| S1 매크로 곰 | 1,126 | −0.223 | 0.005 | −2.75 | 미달 |
| S2 곰+폭 중간 | 363 | −0.085 | 0.305 | −0.48 | 미달 |
| S3 곰+폭 하위 | 737 | −0.291 | 0.000 | −3.32 | 미달 |
★무엣지가 아니라 위약보다 유의하게 나빴다. 같은 신호·같은 기하·같은 시각 분포의 무작위 진입보다 나쁘다는 건 그 시점에 정보가 있고 부호가 반대라는 뜻이다.
㉜ 부호를 뒤집었다 — L3 통과 (곰장 자본항복 되돌림)
바꾼 것은 방향 한 비트와 펀딩 부호뿐. 신호·손절거리·위약 규약은 ㉛과 한 글자도 같다.
| 변형 | 거래 | 평균R(펀딩 후) | 전체 P | z | A 시간후반 z | 판정 |
|---|---|---|---|---|---|---|
| L0 게이트 없음 | 1,860 | +0.034 | 0.410 | −0.16 | −0.80 | 미달 |
| L1 매크로 곰 | 1,126 | +0.188 | 0.965 | 1.94 | 2.14 | 통과 |
| L2 곰+폭 중간 | 363 | +0.015 | 0.420 | −0.28 | −0.47 | 미달 |
| L3 곰+폭 하위 | 737 | +0.286 | 1.000 | 2.80 | 3.45 | 통과 |
영점 전부 정상(평균 P 0.500 · P≥0.975 2.5%). 누적 시행 8(㉛ 4 + ㉜ 4). 기제: 매크로 곰 + 폭 하위(=유니버스 대부분이 SMA200 아래) + 55일 신저가 = 자본항복. 거기서 산다. 배포 돌파(폭 중간=소진 회피)와 같은 원리의 반대편이다. 그리고 [[breakout-no-edge]]("되돌림만 엣지")와도 어긋나지 않는다 — 이건 돌파가 아니라 회귀다.
㉞ 강건성 — 통과가 무엇으로 만들어졌는지 (전부 통과)
| 검사 | 결과 | 판정 |
|---|---|---|
| A 연도 | 2021 +2.00 · 2022 +0.19 · 2023 +1.33 · 2024 +1.10 · 2025 −0.02 → 4/5 양수 | OK |
| B 잭나이프 | 종목 하나씩 제거 시 [+0.2635, +0.3072] — 범위가 매우 좁다 · 종목별 20/25 양수 | OK |
| C 군집 | 분산팽창 14.63배 → 유효 독립 50.4건 · 유효 t 1.37 | OK(≥20) |
| D 꼬리 | 상위 5건이 총합의 4.8% · 승률 43.1% · 중앙값 −1.00R(RR2 구조상 정상) | OK |
| E 생존편향 대리 | 진입 후 200봉 내 −50% 추가 하락 39.9% — 그런데도 평균 +0.29R | 편향만은 아니다 |
| F 배포와 겹침 | L3 발화 136일 · 폭중간 발화 89일 · 교집합 0일 | 구조적 배타 |
★생존 편향은 이 검사로 제거되지 않는다. 상폐 종목은 애초에 표본에 없고, "바닥에서 산다"는 이 편향의 최대 수혜자다. E 의 39.9% 는 하한이다. 전방만이 가른다.
㉟ 보완성 — ★사전선언 게이트 미달. 배포하지 않는다
사전 기준: 합산의 음수 버킷이 줄고 그리고 최악 버킷이 덜 나빠져야 보완재.
| 지표 | 돌파 단독 | L3 단독 | 합산 | 사전기준 |
|---|---|---|---|---|
| 음수 버킷 | 10/28 | 2/28 | 7/28 | ✅ 개선 |
| 최악 버킷 | −30.3R | −61.5R | −61.5R | ❌ 악화 |
| 버킷 승률 | 57.1% | 39.3% | 75.0% | (기준 아님) |
| 버킷 상관 ρ | — | — | +0.107 | 사실상 독립 |
돌파가 음(−)인 10버킷 중 5개를 L3 이 덮었다(그 구간 L3 +183.2R vs 돌파 −110.2R). 그런데 L3 자신의 최악 버킷 2022-H3(5~6월, LUNA·3AC 붕괴) −61.5R 이 합산 최악을 만든다. 그때 돌파는 신호가 0 이라 상쇄가 없다.
★게이트는 내가 사전에 선언했고 실패했다. 기준을 고쳐 통과시키지 않는다. 버킷 승률 57%→75% 는 크지만 그건 내가 선언한 기준이 아니다. 다음 단계는 "사이징으로 2022-H3 을 눌러본다"가 되겠지만, 그건 새 사전선언이 필요한 새 질문 이며 과거 표를 초록칠하는 방식으로 하면 안 된다(CLAUDE.md §9).
현재 상태: L3 = 검정 통과 · 배포 보류. 다음은 전방(페이퍼) 관측 대상 후보이지 지금 자본을 붙일 물건이 아니다.
㉝ 횡단면 부활 4종 — X3 비유동성 프리미엄 통과 (시행 N=4, 스윕 없음)
rank68 이 "6종목뿐"·"베타 노출"로 탈락시킨 계열들을 달러중립 형태로 되살렸다. 껍데기는 배포 모멘텀과 동일(상·하위 20% · hold 7 · 같은 비용·펀딩). 바뀌는 건 줄세우는 점수 하나. 위약은 횡단면에 맞게 같은 날 안에서 종목 라벨만 셔플(수익분포·기하·회전·펀딩 보존).
| 신호 | 연 gross | 연 net | Sharpe | 버킷 | 최악 | 전체 P | 판정 |
|---|---|---|---|---|---|---|---|
| X1 단기반전(−7일수익) | −29.76% | −32.75% | −0.98 | 16/42 | −38.2% | 0.005 | 미달 |
| X2 저변동성(−30일σ) | −11.09% | −11.90% | −0.30 | 19/42 | −51.5% | 0.255 | 미달 |
| X3 비유동성(−log ADV) | +23.37% | +23.13% | 0.89 | 24/42 | −12.1% | 0.980 | 통과 |
| X4 저베타(−60일β) | +3.64% | +3.11% | 0.09 | 22/42 | −28.6% | 0.745 | 미달 |
영점 4건 전부 정상. X1 은 유의하게 음수 — 즉 7일 연속(반전이 아니라 모멘텀) 쪽에 부호가 있다.
배포 모멘텀이 skip=1 로 이 구간을 피하는 것이 옳았다는 확인이지 새 수익원이 아니다.
㊱ X3 비용 스트레스 — 통과. 가장 의심스러운 자리를 먼저 쳤다
X3 은 정의상 가장 안 팔리는 종목을 산다. 그런데 ㉝의 비용은 전 종목 일률 8bp 였다. rank67 실측은 "알트 스프레드가 BTC 의 41~96배". 종목별 비용(로그 ADV 보간)으로 다시 물렸다.
| 최저유동 비용배수 K | ×1 | ×10 | ×41 | ×96 | ×200 | 손익분기 |
|---|---|---|---|---|---|---|
| 연 net | +23.13% | +22.32% | +20.59% | +18.25% | +14.59% | ×728 |
손익분기 728배 — 실측 최악(96배)의 7.6배 여유. 이유도 설명된다: 연 회전 6.22배뿐 (ADV 순위가 느리게 움직여 거의 안 갈아탄다). ㉕의 "회전 감축이 자산" 원리와 같은 자리다. ㉝에서 에러로 못 돌린 상관 관문도 여기서 갚았다 — 배포 모멘텀과 ρ = −0.130(독립).
㊲ 세 트랙 합산 — ★목표 70% 에 못 미친다. 50.0% 다
동일비중 1/3(사이징 최적화 금지). T3 는 보수적으로 K=96 비용을 물렸다.
| 계열 | 버킷 승률 | 음수 버킷 | 최악 | 하위3 평균 |
|---|---|---|---|---|
| T1 돌파 단독 | 38.1% | 26/42 | −11.23% | −8.24% |
| T2 모멘텀 단독 | 52.4% | 20/42 | −19.12% | −15.68% |
| T3 비유동 단독 | 50.0% | 21/42 | −12.17% | −11.18% |
| T1+T2 (현 배포) | 52.4% | 20/42 | −9.62% | −8.83% |
| ★T1+T2+T3 | 50.0% | 21/42 | −7.30% | −6.38% |
상관: T1–T2 +0.115 · T1–T3 −0.034 · T2–T3 +0.028 — 셋 다 사실상 독립.
★정직한 읽기 세 가지.
- 내 사전 게이트는 T1 단독 대비였고 통과했다(38.1%→50.0%). 그러나 실제 의사결정 기준은 현 배포 T1+T2 이고, 거기 대비하면 승률은 52.4%→50.0% 로 오히려 내려간다. 개선된 것은 꼬리뿐이다(최악 −9.62→−7.30%, 하위3 −8.83→−6.38%).
- ㉖의 투영이 빗나갔다. "수익원 1개 추가 ≈ 70%"는 추가되는 수익원의 거래당 Sharpe 가 비슷하다고 가정했다. 실제로 무상관 계열을 섞으면 버킷 분산은 줄지만 평균은 안 오른다 — Φ(평균/σ) 에서 분모만 건드린 것이라, 평균이 작으면 승률이 크게 안 오른다. ⇒ 남은 레버는 "수익원 수"가 아니라 "버킷 평균 수익"이다. 이건 ㉖이 천장(1.12배)을 확인한 그 레버와 같다. 즉 현재 우리가 아는 방법으로는 70% 경로가 열려 있지 않다.
- T1 단독 38.1% 는 ㉟의 "57.1%"와 모순이 아니다 — ㉟은 거래가 있던 28버킷의 R 합 기준, 여기는 전체 42버킷 기준이라 무거래 버킷(15개)이 0% = 비승리로 잡힌다. 목표가 "버킷마다 자본 (+)"이므로 후자가 맞는 셈법이다.
현재 상태: X3 = 검정·비용 스트레스 통과 · 배포는 사용자 판단. 붙이면 꼬리가 얇아지고 승률은 제자리다. 인샘플이며 T3 는 이 표본에서 골라졌다 — 가설이지 성과가 아니다.
㊳ X3 배포 — 정합 검사가 버그 두 개를 또 잡았다 (2026-08-07)
사용자 지시로 X3 를 세 번째 페이퍼 트랙으로 붙였다. 배포 전 필수 관문(원장 규칙 10·11)에서:
| 검사 | 사전 기준 | 결과 |
|---|---|---|
| A 추출 정합 | ㊱ net 계열과 완전 일치 | 일치(+18.2535% 소수점까지) |
| B 후행 창 비용 | 연 net 차이 3%p 미만 | −0.01%p (㊱의 전표본 중앙 ADV 는 미래참조 → 배포는 후행 30일) |
| C 위상 민감도 | 7위상 전부 양수 | 7/7 · 범위 [+17.09%, +21.83%] |
| D 엔진 재생 | 상관>0.999 · 연평균차<0.001%p | ★사전 기준 미달(0.9932) — 아래 참조 |
| E D 잔차 진단 | (추가 진단) | 규약 맞춘 뒤 1.000000 — 잔차는 전부 회계 칸 차이 |
★잡은 버그 2개 (둘 다 배포됐으면 검정과 다른 물건이 굴러갔다):
- 리밸런스 위상 표류 — 조건에
or not weights가 있어, 초기에 이름이 모자란 동안 매일 재시도하다가 이름이 처음 생긴 날에 위상이 박혔다. 엔진167, 174, 223…vs 검정70, 77, …, 168, 175…— 하루 어긋났고, C 가 잰 위상 감도(연 17.1~21.8%)만큼 성과가 통째로 달라진다. → 첫 회만 sentinel 로 열고 이후는 주기로만 판단. - 이름 부족 시 행동 불일치 — 리밸런스일에 유효 종목 < 10 이면 검정(㉝ rank_w)은
평평하게 가는데 엔진은 옛 비중을 그대로 들고 있었다(
174→223구멍). 검정된 적 없는 전략이다. → 같이 평평하게 간다. 고친 뒤 연 평균차 4.02%p → 0.0000%p.
★D 는 사전 기준을 못 넘었다. 그 사실을 지우지 않는다. 기준을 낮추는 대신 잔차의 정체를 밝혔다 — 엔진은 비용을 거래한 날에, 참조는 그 비용이 여는 수익과 같은 칸에 단다. 참조의 비용만 한 칸 옮겨 규약을 맞추자 상관 1.000000. 행동은 동일하고, 엔진 쪽이 물리적으로 옳다(비용은 거래한 날 낸다). 그래서 배포를 허용했다.
★앞선 두 트랙에 같은 잠복 위험이 있다.
momentum_paper도 조건에or not weights를 두고,no_names에서 옛 비중을 유지한다. ㉗ 정합은 통과했으므로 우리 표본에서는 발동하지 않았다 — 그러나 유니버스가 얇아지는 날 발동할 수 있다. 라이브 트랙을 사용자 확인 없이 손대지 않았다. 정정 여부는 사용자 판단 대기.
배포물: strategies/xsec_illiquidity.py · live/illiquidity_paper.py ·
live/illiquidity_runner.py(자정+240s) · /paper-illiquidity/{summary,positions,equity} ·
유닛테스트 18건. 사이징 ×0.66(㉝ 전방 분할 P 0.830 → 2P−1) · 비용 K=96(rank67 실측 최악).
가동 스위치는 QC_ILLIQ_LIVE=1 — 사용자가 등록해야 돈다.
㊳-b 모멘텀 트랙 소급 수정 (2026-08-07) — 잠복 버그 제거
㊳에서 비유동성 트랙에 있던 두 결함이 momentum_paper 에도 있음을 확인하고 소급 적용했다
(규칙 14: 추정기를 바꾸면 이미 판정한 것에 전부 적용한다).
검정 쪽(xsec_momentum_oos.daily_returns:73)은 이름이 모자라면 w = zeros 로 평평하게 간다 —
엔진만 옛 비중을 들고 있었다. 우리 표본에서는 발동하지 않았지만 유니버스가 얇아지면 발동한다.
수정 후 ㉗ 정합 재확인: 상관 0.999951 · 연 평균차 0.0063%p · 자카드 1.000 — 깨지지 않았다.
회귀 테스트 2건 추가(주기 정확성 · 이름 부족 시 평평).
㊴ 유니버스 25→52 — ★세 트랙 전부 미채택. 폭 레버는 닫혀 있다 (2026-08-07)
㊲가 남긴 질문("평균 수익을 올릴 레버가 있나")에 대한 답을 구했다.
㊴-a 확대 규칙 (사전선언 · 성과 미참조) — 기존 규칙에서 임계 하나만 낮췄다.
거래대금 하한 $20M → $3M, 나머지 전부 동일, 조건 만족 전부(자르면 그게 선택이다).
결과 52종목 = 기존 25 + 신규 27, 빠진 종목 0(완전한 상위집합 → 유일하게 깨끗한 비교).
일봉·펀딩 이력 전부 확보(52/52). 폭 경계 재산출(같은 창 2019-09-08~2023-02-17):
lo 0.1333 · hi 0.7333(25종목은 0.1364/0.7826) — 유니버스가 바뀌면 폭 분포가 바뀐다.
가동 중 트랙이 쓰는 config/breadth_boundaries.json 은 건드리지 않았다(별도 파일).
★㊴-b 에서 내 귀무분포가 고장났다 — 먼저 신고한다. T3 위약 연수익이 −62.78%(25) · −89.25%(52), z 7.88·12.20 이 나왔다. 물리적으로 불가능한 크기다. 원인: 라벨 셔플은 회전율을 보존하지 않는다. 회전율 실측 —
| 실제 | 위약 | 배수 | |
|---|---|---|---|
| T3 25종목 | 6.5배/년 | 83.5배/년 | 12.8배 |
| T3 52종목 | 9.2배/년 | 84.5배/년 | 9.2배 |
ADV 순위는 느리게 움직여 실제 회전이 낮은데, 섞으면 매 리밸런스마다 전량 교체된다. 거기에 K=96 종목별 비용이 곱해지니 위약이 비용만으로 죽는다. z 는 엣지가 아니라 "누가 덜 거래하는가"를 재고 있었다. ㉝의 사전선언에 "회전율 보존"이라 적었는데 틀린 선언이었다 (㉝은 일률 8bp 라 왜곡이 작았지만 0 은 아니다 — 연 약 4%p, 초과 +24.94%p 의 약 1/6). 영점 조정이 못 잡은 이유도 분명하다 — 영점은 위약 vs 위약이고 양쪽 다 고회전이다. 원장 규칙 12("영점 통과 ≠ 귀무분포가 옳다")의 교과서적 사례다. 수리(㊴-c): 위약 비교를 gross 로 한다. 기준 완화가 아니라 질문의 분리다(규칙 ⑧) — 신호 판정은 gross, 비용 감내는 ㊱의 K 스윕(실제 회전으로 손익분기 K=728)이 따로 답한다.
㊴-c 횡단면 두 트랙 (gross · 회전 왜곡 제거 후) — H1: Sharpe(52)/Sharpe(25) ≥ 1.20 (이론 1.44)
| 트랙 | Sharpe 25 | Sharpe 52 | 배수 | 25 판정 | 52 판정 | H1 |
|---|---|---|---|---|---|---|
| T2 모멘텀 | 0.654 | 0.497 | 0.76 | 통과 | 미달(짝수종목 −0.82%) | ❌ |
| T3 비유동성 | 0.863 | 0.751 | 0.87 | 통과 | 통과 | ❌ |
㊴-d 돌파 (기제가 다르다 — 랭킹 폭이 아니라 신호 수) — H2: 버킷당 유효 독립 거래 ≥ 1.5배
| 지표 | 25종목 | 52종목 | |
|---|---|---|---|
| 거래 수 | 888 | 1,595 | 1.80배 |
| 분산 팽창 | 11.99배 | 22.81배 | 상관이 더 올랐다 |
| 버킷당 유효 독립 거래 | 2.85 | 2.69 | 0.94배 ❌ |
| 평균 R | +0.331 | +0.210 | 희석 |
| 버킷 승률 | 61.5% | 50.0% | 악화 |
| 최악 버킷 | −30.3R | −66.5R | 악화 |
52 판도 위약 대조는 통과했다(P 0.985) — 엣지가 사라진 게 아니라 희석된 것이다.
★★세 트랙 전부 미채택. 그리고 이유가 하나다. 거래는 1.80배 늘었는데 유효 독립 거래는 0.94배다. 분산 팽창이 12.0 → 22.8 로 올랐다. 크립토 종목은 서로 0.6~0.9 로 동조하므로(rank65 히트맵) 종목을 더해도 독립 정보가 안 는다. 새 종목은 상관된 잡음을 들고 온다.
★이건 네 번째 같은 벽이다. 우리는 같은 것을 네 축에서 만났다: 지표(㉒ 분산팽창 12배) · TF(㉘ 잘게 쪼개도 확인 안 빨라짐) · 수익원(㊲ σ만 줄고 평균 그대로) · 종목(㊴ 거래 1.8배인데 유효 0.94배) 네 번 다 "양을 늘리면 정보가 는다"는 가정이 깨졌다. 우리 병목은 양이 아니라 IC(신호의 질)다. ⇒ 다음 탐색은 양을 늘리는 방향으로 가면 안 된다. 그건 이미 네 번 닫혔다.
보존물: docs/breakout_universe_50.json · config/breadth_boundaries_50.json ·
52종목 일봉·펀딩 캐시. 미채택이지만 데이터는 남긴다 — 다시 뽑을 이유가 없다.
㊵ AFML 전수 감사 + ch.19 첫 착수 (2026-08-07)
사용자 지적으로 docs/history/…AFML….md 를 제목이 아니라 본문으로 다시 읽고,
AFML 기법이 코드에 실제로 있는지 전수 감사했다(기억이 아니라 grep).
| AFML 장 | 기법 | 우리 상태 |
|---|---|---|
| ch.2 | 달러바 · 동적 임계(ADV 연동) | 구현 · A/B 완패(일봉등가 Sharpe 0.66 vs 1.23) |
| ch.3 | 삼중 장벽 · 변동성 조정 | 구현 · 현행 전략이 사용 중(ATR 기반 장벽) |
| ch.3 | 메타라벨링 | 구현 · AUC 0.49 기각 |
| ch.4 | 표본 고유성(concurrency 가중) | labeling/sample_weights.py 구현됨 |
| ch.7 | Purged K-Fold · 엠바고 · CPCV | validation/{cpcv,purged_kfold}.py 구현됨 |
| ch.10 | 확률 기반 베팅 사이징 | 구현 · 세 트랙 전부 f = 2P−1 사용 중 |
| ch.14–15 | DSR · PBO | 구현됨 |
| ch.5 | 분수 차분(FFD) | ❌ 미착수 |
| ch.17 | 구조 변화 탐지(SADF · CUSUM) | ❌ 미착수 |
| ch.18 | 엔트로피 피처 | ❌ 미착수 |
| ch.19 | 마이크로스트럭처 추정량 | ❌ 미착수 → ㊵에서 착수 |
★감사의 결론이 정확히 우리 문제를 가리킨다. 구현된 것은 전부 검증(과적합 방지) 쪽이고, 미착수는 전부 신호의 질(IC) 쪽이다. ㊴에서 확정한 병목이 IC 다. 막힌 곳과 안 한 곳이 겹친다. ch.19 부터 연 이유: 네 장 중 데이터 벽이 없는 유일한 장이다(고가/저가/거래대금만 쓴다).
★이 문서 자체의 결함도 적어 둔다 — 베팅 사이징 표("고정 165만 → 프라도식 250~400만")는 근거 없는 숫자이고 배수 보고 금지(CLAUDE.md §9) 위반이다. "상위 1% 헤지펀드와 똑같은 길" 같은 문장도 과확신 금지 위반이다. 아이디어만 꺼내 쓰고 수치·평가는 인용하지 않는다.
A. 가정하던 비용을 측정하려 했다 — ★실패. CS 추정량은 우리 자산에 못 쓴다 ㊱은 종목별 비용 배수 K=96 을 가정했다(rank67 L1 실측 41~96배 중 최악값). Corwin-Schultz(2012)는 고가/저가만으로 유효 스프레드를 추정한다 — 우리가 가진 데이터다.
| 종목 | CS 유효 스프레드(중앙) | BTC 대비 |
|---|---|---|
| COTIUSDT | 173.7bp | 2.5x |
| ETHUSDT | 94.2bp | 1.4x |
| BTCUSDT | 69.0bp | 1.0x |
| TRXUSDT | 61.6bp | 0.9x |
★BTC 69bp 는 명백히 틀렸다. BTC 무기한의 실제 테이커 스프레드는 1bp 안팎이다 — 약 70배 과대. CS 는 고가-저가 범위를 스프레드와 변동성으로 분해하는데, 고변동 자산에서는 그 분해가 무너진다. 즉 이 숫자는 스프레드가 아니라 일중 변동폭을 재고 있다. 그리고 배수도 ×2.5 로 rank67 의 L1 실측 41~96배와 40배 어긋난다.
원장 규칙 13("추정기가 서로 다른 답을 주면 그게 단서다") 적용: 유리한 쪽을 고르지 않는다. 둘은 다른 것을 재고 있다 — rank67 은 특정 시점의 호가 스프레드, CS 는 일중 범위 잔차. ⇒ CS 는 L2 벽을 못 뚫는다. ㊱의 K=96 은 여전히 가정이며, rank67 L1 실측이 최선의 근거다. 이 항목은 닫는다(다시 시도 금지).
B. T3 의 점수를 바꿨다 — ★Amihud 가 원시 ADV 를 이긴다 껍데기(달러중립·상하위 20%·hold 7)는 그대로, 줄세우는 점수 하나만 바꿨다. 시행 N=2 추가.
| 점수 | 연 gross | Sharpe | S0 대비 | 회전 | 버킷 | 최악 | 전체 P | 위약 |
|---|---|---|---|---|---|---|---|---|
| S0 현행 ADV(−log 거래대금) | +22.56% | 0.863 | 1.00 | 6.5배 | 22/42 | −12.69% | 0.980 | 통과 |
| S1 Amihud(|r|/거래대금) | +32.74% | 0.992 | 1.15 | 5.1배 | 21/42 | −16.07% | 1.000(z 3.12) | 통과 |
| S2 CS 유효 스프레드 | +9.16% | 0.273 | 0.32 | 24.1배 | 17/42 | −33.59% | 0.850 | 미달(홀수종목 −12.05%) |
Amihud 는 연수익·Sharpe·회전율 세 축 모두 현행보다 낫다. 회전이 오히려 줄었다(6.5→5.1)는 점이 중요하다 — 비용에 더 강하다는 뜻이고, ㊱의 손익분기 여유가 더 커진다.
★★이 세션에서 처음으로 레버가 움직였다. 양(量)은 네 축에서 전부 닫혔는데 (지표 ㉒ · TF ㉘ · 수익원 ㊲ · 종목 ㊴), 질(質)을 건드리자 Sharpe 가 1.15배 올랐다. "병목은 IC"라는 ㊴의 결론과 정확히 맞는 방향의 첫 증거다.
★그러나 채택이 아니라 후보다. 정직히 남길 것: · 인샘플이고 누적 시행이 크다 · A 시간 후반 분할이 약하다(P 0.770 · z 0.74 — S0 도 0.685) · 최악 버킷이 나빠졌다(−12.69% → −16.07%) · 버킷 개수도 22→21 · 즉 평균은 올랐고 꼬리는 나빠졌다. T3 를 붙인 이유가 꼬리였는데(㊲) 그 부분이 상충한다. ⇒ 교체는 전방 판정 뒤에 한다. 지금 가동 중인 T3 는 ADV 판 그대로 둔다.
다음에 열 AFML 장 — ch.19 는 절반 열렸다(Amihud 성공 · CS 실패). 남은 셋 중 우선순위:
- ch.5 분수 차분(FFD) — 정상성과 기억을 동시에 남기는 유일한 변환. 우리 피처는 수준(비정상) 아니면 수익률(기억 없음)뿐이다. IC 를 직접 겨냥하는 정공법이며 데이터 벽이 없다.
- ch.17 구조 변화(SADF) — 레짐을 통계적으로 잡는다. CLAUDE.md 는 손으로 고른 ADX 임계 스위칭을 금지하지만 레짐을 조건변수로 쓰는 것은 허용한다(FEATURES §3.10). SADF 가 그 원칙 있는 판이다.
- ch.18 엔트로피 — 후순위(해석·검정 설계가 무겁다).
㊶ AFML ch.5 분수 차분(FFD) — ★미채택. 이 경로는 닫는다 (2026-08-07)
㊵에서 질(質) 레버가 처음 움직였으므로 그 방향의 정공법을 쳤다. 논지: 가격 수준은 기억은 있으나 비정상 · 수익률(d=1)은 정상이나 기억이 0 · FFD(0<d<1)는 정상성을 얻는 최소한만 차분한다. 우리 모멘텀 점수는 d=1 차분을 30일 창에 가둔 것이라 30일 밖 기억이 통째로 0 이다. 그 손실을 되찾는 게 목표였다.
A d 선택 (★동결 학습창에서만 — 전 표본을 보면 미래참조)* d ∈ {0, .05, …, 1.0} 중 ADF < −2.86 을 만족하는 최소 d. 결과 d 중앙 0.45* · 범위 [0.05, 1.00] · 기억 보존 corr 중앙 0.569. ⇒ AFML 의 주장 자체는 우리 데이터에서 성립한다 — d=0.45 면 정상성을 얻고 기억은 57% 남는다.
★1차 판에서 버그를 잡았다 — 학습창(2023-02 종료) 이후 상장 종목(INJ·LDO)은 그 창에 데이터가 없어 d 를 못 고르고 후퇴값 d=1.0(=일일 수익률, 창 길이 2)을 받았다. 같은 횡단면에 서로 다른 정의의 점수가 섞인 상태 — 랭킹 전략이 견딜 수 없다. 결과가 아니라 버그이므로 수리판을 만들어 둘 다 냈다(수리 방향은 파라미터를 25개→1개로 줄이는 쪽).
| 점수 | 연 gross | Sharpe | S0 대비 | 회전 | 위약 |
|---|---|---|---|---|---|
| S0 현행 30일 수익 | +22.24% | 0.654 | 1.00 | 39.6배 | 통과 |
| S1 FFD 종목별 d*(결함판) | +2.17% | 0.098 | 0.15 | 5.9배 | 미달(홀수종목 −5.33%) |
| S2 FFD 패널 단일 d(수리판) | −1.41% | −0.052 | −0.08 | 10.2배 | 미달(전체 P 0.415) |
버그를 고쳤더니 더 나빠졌다. 결함이 원인이 아니었다 — FFD 정규화 수준을 횡단면 랭킹 점수로 쓰는 것 자체가 안 된다. S0 와의 횡단면 상관도 +0.090 — 아예 다른 것을 재고 있다.
★닫는 범위를 정확히 적는다. 닫는 것은 "FFD 를 단독 랭킹 점수로 쓰는 것"이지 "FFD 자체"가 아니다. AFML 에서 FFD 의 본래 자리는 ML 모델의 입력 피처다. 우리 세 트랙은 전부 규칙 기반이라 점수로 줄세우는 방식으로만 시험할 수 있었다. 그 한계 안에서의 판정이다.
★★AFML 감사가 드러낸 구조적 사실 (㊵·㊶ 종합)
㊵(ch.19)과 ㊶(ch.5)을 붙여 보면 패턴이 보인다:
| 시험한 것 | 성격 | 결과 |
|---|---|---|
| ch.19 Amihud | 직접 랭킹 가능한 측정량 | ✅ Sharpe 1.15배 |
| ch.19 Corwin-Schultz | 직접 랭킹 가능 | ❌ 추정량이 우리 자산에 부적합(BTC 69bp) |
| ch.5 FFD | 원래는 ML 피처 — 억지로 랭킹에 씀 | ❌ 0.15배·−0.08배 |
⇒ AFML 의 신호 절반(ch.5·17·18)은 대부분 "ML 모델의 입력"을 전제한다.
우리는 ML 경로를 접고 규칙 기반으로 왔기 때문에, 그 도구들을 원래 용법으로 쓸 그릇이 없다.
그런데 그릇은 이미 만들어져 있다 — validation/{cpcv,purged_kfold}.py · models/pipeline.py ·
labeling/sample_weights.py 가 전부 구현돼 있고 지금 안 쓰이고 있다.
★그래서 선택지가 둘로 갈린다. 둘 다 정직히 적어 둔다. (가) 규칙 기반 유지 — ch.19 Amihud 처럼 직접 랭킹 가능한 측정량만 계속 찾는다. 남은 후보: ch.19 Kyle λ · Roll 측도 · VPIN(테이커 델타 필요) · ch.17 SADF(레짐 조건변수). 장점: 지금 규율(위약·분할·영점)을 그대로 쓴다. 단점: AFML 의 대부분을 못 쓴다. (나) ML 경로 복귀 — 이미 있는 CPCV/엠바고/표본고유성 위에 FFD·엔트로피·SADF 를 피처로 얹어 메타라벨링을 다시 친다. 장점: AFML 을 원래 용법으로 쓴다. 단점: 메타라벨링은 이미 AUC 0.49 로 기각된 이력이 있고, 부활시키려면 그때 왜 실패했는지(피처 부족인가 라벨 문제인가)부터 부검해야 한다. 비용이 크다. ★이건 사람이 정할 방향 결정이다. 임의로 (나)로 넘어가지 않는다.
㊺ AFML 파이프라인 착수 — ★다섯 번 막혔던 벽이 뚫렸다 (2026-08-08)
사용자 지적: "내가 이론만 갖다주면 안 된다고만 한다. 시야를 넓게 가져라." — 맞았다. 나는 프라도의 기법을 기존 규칙 껍데기에 부품으로 갈아끼우는 식으로만 시험했다. AFML 은 부품 목록이 아니라 순서 있는 파이프라인이다. 순서대로 하니 결과가 달라졌다.
★먼저 — 지난 달러바 기각이 왜 무효였나 (두 가지)
run_dollar_ab.py:5"B) 일봉등가 달러바" — 표본 수를 설계로 고정했다. 달러바의 요점 중 하나가 표본 수·독립성인데 그 차원을 미리 제거하고 시험했다.- ★더 근본적으로 — AFML 이 하지 않은 주장을 반증했다. 지난 A/B 는 전략 Sharpe (0.66 vs 1.23)를 비교하고 "이점 없음"이라 기록했다. 그런데 ch.2 는 "달러바를 쓰면 전략 수익이 는다"고 말한 적이 없다. 말하는 것은 표본의 통계적 성질이다.
㊺-1 분봉 백필 — 해상도를 미리 깎지 않았다
Data Vision 월별 덤프로 25종목 1m 확보. 78,308,304행 · 2.0GB. 커버리지 중앙 100%(최저 99.8%) · 타임스탬프 정상 25/25 · 중복 0 · 결측 대부분 0봉. ★함정 두 개를 미리 막았다: 헤더 유무 자동 판별 · 타임스탬프 단위(ms/µs) 정규화 (신형 선물 덤프는 마이크로초다. ms 로 착각하면 1970년으로 날아가고 조용히 틀린다). ※선물 아카이브가 2020-01 부터라 일봉 캐시(2019-09)보다 짧다.
㊺-2 동적 달러바 — ★AFML ch.2 의 주장이 우리 데이터에서 성립한다
임계 = ADV₇(후행) / k. 같은 봉 개수(k=1) 에서 캘린더 1d 와 정면 비교 — 봉 개수 효과가 아닌 순수 재료 효과.
| 지표 | 캘린더 1d | 달러바 k=1 | |
|---|---|---|---|
| 초과첨도(정규성) | 12.52 | 5.51 | ✅ 56%↓ |
| Jarque-Bera | 15,510 | 3,321 | ✅ 79%↓ |
| 전후반 분산비 | 1.94 | 1.93 | ✅ |
| 롤링 분산 CV | 0.96 | 0.86 | ✅ |
| Ljung-Box(10) | 30.2 | 22.6 | ✅ |
5/5 개선. ch.2 가 주장한 정규성·등분산·독립성이 전부 좋아진다.
★그리고 "잘게 썰수록 좋다"는 아니다 — k=1→16 에서 초과첨도가 5.51 → 8.80 → 10.45 → 24.62 → 34.50 으로 폭증한다. 퇴화 아티팩트가 아니다(k=16 에서도 봉당 1m 중앙 72개, 1분짜리 0.23%뿐). 잘게 썰면 점프 지배적이 되는 실제 성질이다. 재료 품질 최적은 k≈1.
㊺-3 파이프라인 — ★표본 벽이 뚫렸다
내가 빠뜨렸던 단계가 하나 더 있었다: ch.2.5 CUSUM 이벤트 필터. 우리는 표본을 "전략이 신호를 낸 곳"(돌파 888건)으로만 잡았다. AFML 은 누적 편차가 임계를 넘는 곳에서 뽑으라고 한다 — 조용한 구간을 안 세고, 표본이 시간에 고르게 퍼지고, 겹침이 준다.
구성: 달러바 k ∈ {1,2,4} → CUSUM(h = 후행 EWMA σ × g) → 삼중장벽(±1σ · 수직 20봉) → 전역 캘린더 고유성(㊷에서 종목별은 상한임을 확인했으므로 처음부터 정직한 쪽으로만).
| 구성 | CUSUM 표본 | 평균 고유성 | 유효 표본 | ㊷ 기준선(74) 대비 |
|---|---|---|---|---|
| k=1 g=2 | 11,039 | 0.1188 | 1,312 | 17.7배 |
| k=2 g=2 | 22,535 | 0.0755 | 1,702 | 23.0배 |
| k=4 g=3 | 26,814 | 0.0745 | 1,999 | 27.0배 |
검정력이 완전히 달라진다:
| 구성 | 유효 표본 | 검출 가능 최소 AUC | AUC 0.55 검정력 |
|---|---|---|---|
| ㊷ 일봉 돌파 | 74 | 0.6111 | 18.1% |
| ㊺-3 k=1 g=2 | 1,312 | 0.5262 | 93.3% |
| ㊺-3 k=4 g=3 | 1,999 | 0.5212 | 98.7% |
★★다섯 번 막혔던 벽(지표 ㉒ · TF ㉘ · 수익원 ㊲ · 종목 ㊴ · ML 표본 ㊷)이 여섯 번째에 뚫렸다. 뚫은 방법이 프라도의 처방 그대로다. 우리가 안 한 것은 그의 이론이 아니라 그의 순서였다. 부품을 갈아끼우지 않고 파이프라인을 세우자 같은 시장에서 유효 표본이 74 → 2,000 이 나왔다.
★정직하게 남길 것: · 이건 재료 검사다. 이 표본에 엣지가 있는지는 아직 판정 안 했다. · 74 와 1,999 는 다른 질문이다 — 전자는 돌파 888건 위의 메타라벨링, 후자는 CUSUM 이벤트 위의 1차 모델. "같은 것이 27배" 가 아니라 "우리가 쓰던 표집 방식이 정보를 버리고 있었다" 가 맞는 해석이다. · 1m 근사이며 2020-01 부터다.
㊺-4 1차 모델 — ★사전 관문 미달. 그러나 ㊷과 성격이 다른 판정이다
㊺-3 이 검정력을 만들어 줬으므로("AUC 0.55 검정력 93.3%") 이제 물어도 되는 질문이 됐다: 이 표본에 예측 가능한 구조가 있는가.
구성: 달러바 → CUSUM → 삼중장벽(수직 만료 제외) → 고유성 가중을 학습에 실제 투입 → PurgedKFold 5 + 엠바고 10일(★t0/t1 을 전역 일 인덱스로 변환·정렬 — ㊹가 강제) → LightGBM 고정 1세트. 피처는 축을 강제 분산: 가격 · 유동성(Amihud) · 주문흐름(테이커 매수비율 — 1m 백필로 처음 확보) · 구조(달러바 소요시간 — 이 바 타입에만 존재) · 심리(펀딩).
⓪ 영점 정상 — 라벨 셔플 OOF AUC 0.5014, 폴드 [.507 .506 .499 .497 .502](3/5 초과, 동전다운 모양). 파이프라인은 고장나지 않았다.
| 칸 | 표본 | 유효 | OOF AUC | 폴드 범위 | 유효 피처 |
|---|---|---|---|---|---|
| k=1 g=2 (주) | 10,849 | 885 | 0.5176 | .507~.537 | 6.57/11 |
| k=1 g=1 | 22,626 | 854 | 0.5207 | .516~.537 | 6.99/11 |
| k=1 g=3 | 6,337 | 890 | 0.5314 | .510~.549 | 6.17/11 |
| k=4 g=2 | 45,772 | 1,682 | 0.5205 | .515~.538 | 6.54/11 |
| k=4 g=1 | 96,109 | 1,661 | 0.5171 | .513~.526 | 7.05/11 |
| k=4 g=3 | 26,739 | 1,699 | 0.5181 | .509~.527 | 6.13/11 |
판정: 미달. 주 칸 OOF AUC 0.5176 < 사전 관문 0.5262 · z 0.90 · p 0.183. 기준을 고쳐 통과시키지 않는다.
★그러나 세 가지를 함께 기록해야 정직하다:
(1) ㊷ 부검의 두 번째 원인은 실제로 고쳐졌다 — 유효 독립 피처 6.13~7.05/11개. 옛 시도는 7개 중 3.02개였다. 축 분산이 설계대로 작동했다.
(2) 폴드 부호 패턴이 귀무와 다르다 — 실제 6칸 30/30 폴드가 0.50 초과. 영점(셔플)은 3/5 로 0.50 을 오르내렸다. 다만 폴드는 서로 독립이 아니므로(같은 데이터·겹침) 이항검정을 그대로 쓸 수 없다. 관찰로만 남기고, 판정으로 승격하지 않는다. 검정하려면 새 사전선언이 필요하다.
(3) ★검정력이 답을 정확히 규정한다 — 이게 ㊷과의 결정적 차이다
| AUC 0.52 검정력 | AUC 0.55 검정력 | |
|---|---|---|
| k=1 g=2 (유효 885) | 26.9% | 82.5% |
| k=4 g=2 (유효 1,682) | 41.1% | 97.2% |
우리는 0.55 는 잡을 힘이 있었고 못 잡았다(→ 0.55 급 구조는 없다). 그런데 관측값 0.518 은 0.52 대의 신호가 있어도 못 가리는 구간이다. ⇒ 결론은 "구조가 없다"가 아니라 "0.55 는 없고, 0.52 대는 아직 판정 못 했다" 이다.
★그리고 이번엔 남은 거리가 계산된다. 진짜 AUC 0.53 를 80% 검정력으로 잡으려면 유효 표본 ≈ 2,291건 진짜 AUC 0.52 를 80% 검정력으로 잡으려면 유효 표본 ≈ 5,155건 현재 885(k=1) / 1,699(k=4). 2,291 은 사정거리 안이다 — k=4 에서 1,699 이고, 수직 만료 제외로 1,312 → 885 (33%)를 버렸으므로 라벨 설계만 고쳐도 상당분이 돌아온다. ★이건 지난 다섯 번의 벽과 다르다. 그때는 "닫혔다"였고, 지금은 "얼마가 더 필요한지가 숫자로 있다."
㊺-5 표본 회복 시도 — ★실패. 그리고 내 진단이 두 번 다 틀렸다
㊺-4 에서 "수직 만료 제외"로 유효 표본 33% 를 버렸다고 진단하고, AFML ch.3 getBins 표준
(수직 만료 = 만기 수익 부호)으로 되돌려 되찾으려 했다. 3변형 × 2칸 = 6 시행, 전부 신고.
| 변형 | 칸 | 표본 | 유효 | OOF AUC | 관문 | z | 판정 |
|---|---|---|---|---|---|---|---|
| A 현행(만료 제외) | k=1 g=2 | 10,849 | 885 | 0.5176 | 0.5320 | 0.90 | 미달 |
| A | k=4 g=2 | 45,772 | 1,682 | 0.5205 | 0.5232 | 1.46 | 미달 |
| B AFML 표준(부호) | k=1 g=2 | 10,857 | 880 | 0.5165 | 0.5320 | 0.84 | 미달 |
| B | k=4 g=2 | 45,785 | 1,683 | 0.5211 | 0.5232 | 1.50 | 미달 |
| C 표준+수직 40봉 | k=1 g=2 | 10,857 | 878 | 0.5197 | 0.5321 | 1.01 | 미달 |
| C | k=4 g=2 | 45,785 | 1,680 | 0.5199 | 0.5232 | 1.41 | 미달 |
영점 정상(셔플 AUC 0.4891). 6/6 미달. 그리고 회복 자체가 안 됐다 — 표본 10,849 → 10,857(+8건).
★틀린 진단 두 개를 기록한다:
- "수직 만료로 33% 를 버렸다" → 실제로는 8건뿐이었다. ±1σ 장벽에 20봉이면 거의 항상 수평 장벽에 먼저 닿는다. 라벨은 애초에 제약이 아니었다.
- 그럼 1,312 → 880 은 어디서 났나 → t0 규약 1봉 차이였다(직접 측정으로 확정): · t0 = 진입봉(㊺-3 · AFML 규약): 구간 중앙 0일 · 평균 고유성 0.1188 · 유효 1,312 · t0 = 신호봉(㊺-4·5): 구간 중앙 1일 · 평균 고유성 0.0798 · 유효 880 ★신호봉 쪽이 보수적(구간이 길어 고유성↓·관문↑)이므로 판정 기준이 느슨해진 적은 없다.
★잡은 버그 1건 — _rebuild_features 의 캐시 키에 id(df) 를 썼다. 종목마다 파케를 새로
읽으면 이전 객체가 해제되고 같은 id 가 재사용되어 다른 종목의 피처가 반환됐다.
IndexError 로 터져서 드러났지만, 길이가 우연히 맞았다면 조용히 틀렸을 자리다.
(docstring 에 그 위험을 적어놓고도 id(df) 를 그대로 쓴 것이 실제 원인이다.) 캐시 제거로 수정.
★㊺ 전체 현재 위치 (12 시행 누적)
| 유효 표본 | OOF AUC | z | |
|---|---|---|---|
| ㊷ 일봉 돌파(옛 방식) | 74 | (판정 불가) | — |
| ㊺-4·5 k=1 | 878~890 | 0.5165~0.5314 | 0.84~1.01 |
| ㊺-4·5 k=4 | 1,660~1,700 | 0.5171~0.5211 | 1.41~1.50 |
12 시행 전부에서 AUC 가 0.517~0.531 사이의 양(+)이고, 단 한 번도 유의하지 않다. 그리고 필요한 표본이 계산돼 있다 — 진짜 0.53 을 80% 검정력으로 2,291건, 0.52 를 5,155건. 현재 최대 1,683건(k=4).
★남은 레버가 좁혀졌다. 표본을 늘릴 방법 중 · 라벨 규약 → 닫힘(이번에 확인. 되찾을 게 없었다) · 기간 확대 → 닫힘(선물 1m 아카이브가 2020-01 시작) · 종목 추가 → 약함(㊴: 상관된 표본은 같은 시각에 겹쳐 고유성이 같이 떨어진다) · k 확대(8·16) → 유일하게 남음. 단 ㊺-2 에서 봉 수익의 첨도가 폭증했다. 다만 그건 봉 수익의 성질이고, 분류 라벨은 장벽 접촉이라 직접 대응하지 않는다. 재료 나빠짐 vs 표본 늘어남의 교환을 실측해야 판단할 수 있다 — 새 사전선언 필요.
㊺-6 축척 교환 k=8·16 — ★0/18. 그리고 내가 선언한 다중검정 관문이 틀렸다
사전선언대로 k ∈ {8,16} × g ∈ {1,2,3} = 6 시행(누적 18). 영점 정상(셔플 0.5006).
| 칸 | 표본 | 유효 | OOF AUC | 개별관문 | 내가 쓴 관문 | z | 판정(당시) |
|---|---|---|---|---|---|---|---|
| k=8 g=2 (주) | 93,715 | 1,994 | 0.5134 | 0.5213 | 0.5235 | 1.04 | 미달 |
| k=8 g=1 | 196,939 | 1,973 | 0.5185 | 0.5214 | 0.5237 | 1.42 | 미달 |
| k=8 g=3 | 54,563 | 2,010 | 0.5204 | 0.5212 | 0.5234 | 1.58 | 미달 |
| k=16 g=2 | 190,588 | 2,196 | 0.5219 | 0.5203 | 0.5224 | 1.78 | 미달 |
| k=16 g=1 | 400,879 | 2,178 | 0.5245 | 0.5204 | 0.5225 | 1.98 | |
| k=16 g=3 | 110,799 | 2,207 | 0.5202 | 0.5202 | 0.5224 | 1.64 | 미달 |
★★그 "통과"는 내 관문이 틀려서 나온 것이다. 취소한다. 나는 다중검정 관문을 E[max of 18 표준정규] = 1.821 로 선언했다. 그런데 E[max] 는 귀무 하 최대값의 평균이고, 평균을 넘는 일은 귀무에서도 46.8% 일어난다(모의 40만회). 즉 그건 5% 검정이 아니라 ~47% 검정이었다. 정확한 5% 다중검정 관문은 max 분포의 95분위 = z 2.763 이다. 관측 최대 z 1.98 → 다중검정 보정 p = 0.354. (보정 안 한 단일 p 는 0.024) ⇒ 18 시행 전부 미달. 유리한 결과를 관문 오류로 남기지 않는다.
★그래도 이 실험이 답한 것 두 가지 — 둘 다 값지다
| k | 유효 표본 | 봉수익 초과첨도 | OOF AUC | 0.53 검정력 |
|---|---|---|---|---|
| 1 | 880 | 5.51 | 0.5165 | 45.8% |
| 4 | 1,683 | 10.45 | 0.5211 | 68.7% |
| 8 | 1,994 | 24.62 | 0.5134 | 75.1% |
| 16 | 2,196 | 34.50 | 0.5219 | 78.6% |
① 재료 나빠짐 걱정은 근거가 없었다. 봉 수익 초과첨도가 5.51 → 34.50(6.3배) 로 나빠지는 동안 OOF AUC 는 0.5165 → 0.5219 로 변하지 않았다. ㊺-2 의 첨도는 봉 수익의 성질이고 우리 라벨은 장벽 접촉이라 직접 대응하지 않는다 — 추론이 아니라 실측으로 확인했다.
② 표본이 포화한다. k 를 1→16(봉 16배)으로 키웠는데 유효 표본은 880 → 2,196(2.5배)뿐이다. 원인은 종목 간 동시성 — 25종목이 같은 시각에 이벤트를 내므로 봉을 잘게 썰어도 고유성이 같이 떨어진다. ㊴에서 종목 확대가 막혔던 것과 같은 벽의 다른 얼굴이다.
★★그래서 지금 말할 수 있는 것 (18 시행, 검정력 78.6%) "이 피처 집합·이 유니버스에 AUC ≥ 0.53 구조는 없다" — 이건 판정이다. 힘이 있었고 못 잡았다. 남은 것은 0.52 대이고, 그건 유효 표본 5,155건이 필요한데 2,196에서 포화했다.
★이건 "프라도가 틀렸다"가 아니다. 정반대다 — 그의 파이프라인이 없었으면 우리는 74건 표본에 관문 0.611 이라 아무것도 못 물었다. 그의 절차 덕분에 0.53 을 배제할 수 있는 자리까지 왔고, 남은 한계가 우리 유니버스의 상관 구조(그가 ch.4 에서 경고한 바로 그것)라는 것도 알게 됐다.
㊺-7 프라도 프로토콜 1~3단계 — ★누수 하나를 잡았고, 진단은 (다)로 확정됐다
㊺-6 에서 표본 레버가 포화했으므로 정보 쪽으로 옮겼다. ADIA Lab 7단계 중 1~3: 변수 선택(상호정보량·군집 중요도) → 인과 발견(교락·충돌부 지목) → 인과 조정. 칸은 k=16 g=2 하나만 썼다(시행을 더 부풀리지 않기 위해).
★★1차 판은 화려했고, 그리고 누수였다 — 내가 잡았다
| 변형 | 1차 판 AUC | z | |
|---|---|---|---|
| R0 원본 | 0.5219 | 1.78 | 미달 |
| R1 교락을 피처로 추가 | 0.5884 | 7.17 | |
| R2 교락에 잔차화 | 0.5521 | 4.23 |
원인: 외생변수로 넣은 시장수익이 mret[idx] — 그 표본이 속한 날 전체의 BTC 수익이었다.
표본이 그날 3시에 있으면 나머지 21시간이 미래다. R2 도 같은 Z 로 잔차화하므로
잔차에 미래가 주입된다. 두 "통과" 모두 누수 산물이다.
⇒ 전일 수익(r[i−1])으로 지연시켜 재실행. 폐기한 4 시행도 시행으로 세어 누적 26 으로 갱신.
수정 후 (누적 26 · 다중검정 5% 관문 z 2.882)
| 변형 | 피처 | OOF AUC | ΔAUC | z | 판정 |
|---|---|---|---|---|---|
| R0 원본(기준선) | 11 | 0.5219 | — | 1.78 | 미달 |
| R1 교락을 피처로 추가 | 18 | 0.5229 | +0.0010 | 1.86 | 미달 |
| R2 교락에 잔차화 | 11 | 0.5216 | −0.0003 | 1.75 | 미달 |
| R3 충돌부 제거 | 9 | 0.5214 | −0.0005 | 1.74 | 미달 |
영점 정상(셔플 0.4985).
★사전선언한 세 결과 중 (다)가 나왔다 — 그리고 그건 확정 정보다
(가) 조정 후 AUC 가 변한다 → 오염 증거 · (나) 충돌부 제거로 오른다 → collider 실증 (다) 아무것도 안 변한다 → 우리 피처엔 교락·충돌부 문제가 없다
즉 CLAUDE.md 가 기록한 요일 교락(일봉 거래량 분석을 무효화했던 그것)은
이 달러바 파이프라인은 오염시키지 않는다. bar_minutes 의 충돌부 우려도 실체가 없다.
1단계가 답한 것 — 피처는 중복도 오염도 아니다. 그냥 약하다 · 상호정보량 최대 0.0054(ret_1) · 나머지 대부분 0.000~0.003 · 피처 11개 → 군집 8개(|상관|>0.6 기준) — ㊷의 옛 시도(7개 → 유효 3.02)와 달리 중복이 아니다 ⇒ 정보가 왜곡되고 있는 게 아니라 애초에 적다.
★★㊺ 전체 결론 (누적 26 시행) · 표본: 74 → 2,196 (프라도 파이프라인이 실제로 벽을 뚫었다) · 판정력: "AUC ≥ 0.53 구조는 없다" — 검정력 78.6% 로 확정 · 피처: 중복 아님(8군집) · 교락 아님 · 충돌부 아님 · 그냥 약함(MI ≤ 0.005) · 남은 것: AUC ≈ 0.522 이며 유효 5,155건이 필요한데 2,196에서 포화
★이건 프라도 이론의 실패가 아니다. 그의 절차가 아니었으면 우리는 74건 표본에 관문 0.611 이라 이 질문 자체를 못 물었다. 그의 도구로 물었더니 "이 유니버스·이 피처에는 잡을 만한 구조가 없다" 가 나온 것이고, 그건 답이다.
㊺-8 확신 기반 베팅 — ★산술은 맞았고, 통계는 안 선다 (방향 외부검증 후 실행)
사용자 지시로 진행 전에 두 방향의 타당성을 외부 탐색으로 검증했다.
방향 2(새 정보원) — 우리에겐 타당하지 않다. 착수하지 않았다 LOB 미시구조 문헌의 73% 정확도는 500ms 지평 · 40단계 호가이고 비용 미반영 · 단일 하루(2025-01-30) · 시간순 아닌 80/20 분할(퍼징 없음)이다. 우리는 명시적으로 HFT 가 아니고(CLAUDE.md 레이턴시 초 단위) L2 도 없다(rank67). 온체인은 유료 데이터가 필요하고 주장 범위도 좁다. ⇒ 비용 대비 타당성 미달.
방향 1(사이징) — 우리 숫자로 재니 타당했다. 그래서 실행했다
| 장벽 폭(±1σ, k=16) 중앙 | ±100.2bp |
| 왕복 비용 8bp | 장벽의 8.0% |
| 손익분기 승률 p* = 0.5 + c/(2b) | 0.5399 |
| 상위 5% 베팅 시 필요 AUC | 0.5218 (우리 0.522) |
실측 결과 (6칸 전부 신고 · 누적 시행 32 · 다중검정 관문 t 2.947)
| 상위 q | 거래 | 유효 | 총 bp | 순 bp | 승률 | t | 판정 |
|---|---|---|---|---|---|---|---|
| 100% | 190,588 | 2,196 | +3.5 | −4.5 | 51.7% | −1.51 | 미달 |
| 50% | 95,294 | 1,115 | +6.2 | −1.8 | 52.8% | −0.41 | 미달 |
| 20% | 38,118 | 456 | +10.9 | +2.9 | 54.9% | 0.39 | 미달 |
| 10% | 19,059 | 228 | +14.7 | +6.7 | 57.4% | 0.63 | 미달 |
| 5% | 9,530 | 111 | +18.8 | +10.8 | 60.8% | 0.74 | 미달 |
| 1% | 1,906 | 18 | +43.5 | +35.5 | 77.2% | 1.76 | 미달 |
영점 정상(셔플 순수익 −7.2 / −8.9bp ≈ −비용).
★사전 산술이 맞았다 — 손익분기 승률 53.99% 를 예측했고, 실측이 상위 20%(54.9%)에서 정확히 그 선을 넘는다. 확신↑ → 총수익↑ → 승률↑ 이 단조다. 그런데 0/6 미달이다. 상위 q 를 좁힐수록 유효 표본이 같이 줄어 t 가 안 큰다 (상위 1% 의 유효 표본은 18건이다).
★단조성을 증거로 승격하지 않는다. 중첩 부분집합에서 단조가 나오는 것은 "AUC > 0.5" 와 거의 동치이고, 그건 이미 알고 있으며 유의하지 않은 사실이다. 6칸은 독립 확인 6번이 아니다.
★★㊺ 최종 상태 (누적 32 시행) · 프라도 파이프라인은 작동했다 — 표본 74 → 2,196 · 재료 5/5 개선 · 검정력 18% → 79% · 판정된 것: "AUC ≥ 0.53 구조 없음" · 피처 중복·교락·충돌부 아님(그냥 약함) · 경제성: 부호는 맞다(상위 20% 이상에서 순수익 양수). 유의성은 안 선다 · 병목: 유효 표본 2,196 에서 포화. 원인은 종목 간 동시성(25종목 ρ 0.6~0.9) · 남은 정직한 길: 전방(페이퍼). 인샘플이 못 가르는 것을 전방이 가른다 — 그리고 우리는 이미 세 트랙을 돌리고 있다.
㊺-9 T4 배포 — ★검증된 전략이 아니라 사전등록 가설로 (2026-08-08)
사용자 지시로 ㊺-8 의 물건을 네 번째 페이퍼 트랙으로 붙였다.
동결 아티팩트: config/mlbet_model.txt(LightGBM 1.08MB) + config/mlbet_model.json
· 달러바 k=16 · CUSUM g=2 · 삼중장벽 ±1σ · 수직 20봉 · 확신 임계 0.047866(학습 분포 상위 20%)
★CLAUDE.md 는 모델 가중치 커밋을 금하지만 그 취지는 바이너리·시크릿 방지다. 이 텍스트 덤프는
전략 정의 그 자체(frozen 폭 경계와 같은 지위)라 config/ 에 둔다 — 크기를 신고하고 넣었다.
배포물: strategies/ml_confidence.py · live/mlbet_paper.py · live/mlbet_runner.py(자정+300s ·
1m startTime 페이지네이션) · /paper-mlbet/{summary,positions,trades} · 유닛테스트 9건.
사이징 ×0.20 — 2P−1 을 쓸 P 가 없으므로(유의성 미달) 판정용 최소 노출로 임의 지정했고 그렇게 표기했다.
스위치 QC_MLBET_LIVE=1. 라이브 경로 스모크 확인: BTCUSDT 1m 28,799봉 → 달러바 352 → 신호 9건.
★★그리고 계획서를 쓰다가 결정적인 것을 계산했다 — T4 는 전방에서도 판정되지 않는다. ㊺-8 상위 20% 의 축적 속도는 유효 표본 70건/년이다. · 단일검정 t=1.645 에 필요한 유효표본 8,172 → 전방 110년 · 다중검정 t=2.947 에 필요 26,229 → 368년 · 12개월 점검의 검정력 6.8% · 60개월도 9.6%
⇒ T4 는 "언젠가 판정될 트랙"이 아니다. 그래도 돌리는 이유는 셋이고 셋 다 판정이 아니다: ① 기록 보존(사전등록 가설이 잊히거나 재적합되는 것을 막는다 — 베팅마다 확률·방향·장벽 저장) ② 작동 검증(조용히 안 도는 사고가 두 번 있었다) ③ 파국 감지(−20bp 붙박이 같은 큰 오류는 몇 달이면 보인다) ★이 트랙에 대해 "통과/실패"라고 쓰는 일은 없을 것이다. 쓸 수 있는 것은 "작동한다/안 한다" 뿐이다.
웹 게시 (2026-08-08)
· /ledger — 이 원장을 저장소에서 직접 읽어 정적 렌더(단일 진실 원본 유지). 표·인용 지원.
· /tracks — 페이퍼 트랙 계획. 4트랙의 사전등록 가설·점검 규약·일정·중단 조건.
머리말에 "전부 모의 · 투자 권유 아님 · T4 는 가설"을 명시했다.
㊹ AFML 기계 검증 — ★정답을 아는 사례로 내 구현을 쳤다 (2026-08-07)
사용자 지적: "예전에 테스트한 내역들은 대체로 신뢰해선 안 돼. 네가 구현한 것들은 죄다
버그 투성이였으니까." — 이번 세션에서만 내 구현 버그를 18개 잡았으니 정당한 지적이다.
그리고 ㊷에서 나는 average_uniqueness 를 검증 없이 호출해 "유효 표본 415건"을 보고하고,
그 숫자로 "ML 경로가 열렸다"고 판정했다. 검증 안 한 기계의 출력으로 판정한 것이다.
tests/validation/test_afml_machinery_known_answers.py — 15건. 원칙: 손계산·불변식만 쓰고,
구현을 다시 구현해 비교하지 않는다(그러면 같은 오해를 두 번 한다).
통과한 것(13건) — 고유성 손계산 3종(무겹침 1.0 · 동일라벨 0.5 · 3중겹침 11/18·4/9·11/18) · 경계 0<u≤1 · purge 경계 4종 · 엠바고 방향/창 · 누수 0 불변식(PurgedKFold·CPCV 각각) · CPCV 이론값(C(6,2)=15 분할 · φ=C(5,1)=5 경로 · 그룹별 테스트 등장 횟수).
★잡은 버그 2건 — 둘 다 "조용한 오답" 유형
| 버그 | 증상 | 조치 |
|---|---|---|
average_uniqueness 의 n_bars 부족 | numpy 슬라이싱이 말없이 잘려 6바 라벨을 3바로 평균 → 고유성이 조용히 틀림. 음수 인덱스는 배열 뒤쪽을 건드림 | _validate_spans() 추가 — 예외를 던진다 |
PurgedKFold·CPCV 의 정렬 가정 | docstring 은 "t0 순 정렬 가정"인데 강제하지 않음. 정렬 안 된 입력이면 폴드가 시간 블록이 아니게 되는데 예외도 안 남 | require_sorted_spans() 추가 — 예외 + "여러 종목은 전역 시간 인덱스로 바꿔 넣을 것" 안내 |
★그리고 함정 하나를 테스트로 고정했다 — test_symbol_local_indices_break_purging.
종목 A 의 100번 봉과 종목 B 의 100번 봉은 다른 날짜다. 로컬 인덱스를 그대로 넣으면
고유성이 0.5(틀림) vs 1.0(맞음)으로 갈리고 purge 도 반대로 동작한다.
이건 2026-08-07 에 bucket_and_eff 가 이미 저지른 실수(유효 베팅 8.5 로 부풀림)와 같은 함정이다.
★이 검증 작업이 곧바로 ㊷의 판정을 뒤집었다(아래 ㊷ B 참조). 검증이 결과를 낳은 사례다.
㊸ 프라도 이론 직접 탐색 + ML 경로 타당성 (2026-08-07 · 사용자 (나) 선택)
A. ★가장 큰 발견 — AFML(2018)은 프라도의 종점이 아니다
2023년 이후 그의 연구는 전부 **인과 요인 투자(Causal Factor Investing)**이고, 논지가 "ML 의 다음 단계는 연관이 아니라 인과"다. 우리가 AFML 만 보고 있었던 것이 이미 한 세대 뒤였다.
| 문헌 | 연도 | 핵심 |
|---|---|---|
| Causal Factor Investing (Cambridge Elements) | 2023 | 요인 투자가 과학이 되려면 인과가 필요하다 |
| The Case for Causal Factor Investing | 2024 | 연관 기반 요인모형의 구조적 결함 |
| Causal Factor Analysis is a Necessary Condition… | 2025 | 인과 분석이 투자 효율의 필요조건 |
| Causality and Factor Investing: A Primer | 2025 | 실무자용 입문 |
| Correcting the Factor Mirage (JPM) | 2026 예정 | 요인 신기루 교정 프로토콜 |
핵심 개념 — "요인 신기루(factor mirage)": 통계적으로는 멀쩡한데 인과적으로 잘못 지정된 모형. 원인은 둘 — 교락(confounder) 과 충돌부(collider). 회귀에 설명력만 보고 변수를 넣으면 둘을 구분하지 못하고, 표본 밖에서 무너진다.
★우리는 이 함정을 이미 한 번 밟았고 기록도 남아 있다. CLAUDE.md: "요일 교락 실재(raw 저거래봉 66% 주말 → 요일조정 없는 거래량분석 무효)" 그때는 우연히 발견했다. 프라도는 그걸 체계적으로 다루는 절차를 제시한다.
ADIA Lab 7단계 프로토콜 — 우리 위치를 대조하면:
| 단계 | 내용 | 우리 상태 |
|---|---|---|
| 1 변수 선택 | SHAP · 상호정보량(함수형태 가정 없이) | ❌ 안 함 |
| 2 인과 발견 | PC · LiNGAM + 도메인 지식으로 DAG 구성 | ❌ 안 함 |
| 3 인과 조정 | do-계산으로 교락만 통제, 충돌부 배제 | ❌ 안 함 |
| 4 인과 추정 | double machine learning 등 | ❌ 안 함 |
| 5 포트폴리오 구성 | 인과 통찰 → 비중 | 부분(달러중립·켈리) |
| 6 백테스트 | 인과 구조를 보존한 리샘플링·MC | ✅ 하고 있다(순환 시프트·라벨 셔플·기하 보존 위약) |
| 7 다중검정 보정 | p 보정 · 디플레이트 Sharpe | ✅ 하고 있다(시행 횟수 전수 신고·DSR) |
⇒ 6·7 은 이미 엄격하고, 1~4 는 한 번도 안 했다. 그리고 우리 병목(IC)은 1~4 의 영역이다.
B. 오픈소스 — mlfinlab 금지는 여전히 옳다. 대체재는 있다
| 저장소 | 내용 | 우리에게 |
|---|---|---|
hudson-and-thames/mlfinlab | AFML 원조 구현 | ★유료·폐쇄 전환됨 — CLAUDE.md 금지가 지금도 유효 |
eslazarev/purged-cross-validation | Purging·엠바고·CPCV(ch.7·12). mlfinlab 유료화 때문에 만들어진 오픈 대체재 | 우리는 이미 validation/{cpcv,purged_kfold}.py 보유 → 의존 말고 교차검증용 대조 |
mlfinpy | AFML 오픈 재구현(numpy·numba) | 라벨링·표본가중 대조용 |
emoen/Machine-Learning-for-Asset-Managers | MLAM(2020) 코드 — 추세 스캐닝·ONC·클러스터 MDI/MDA·디노이징 | ★가장 쓸모 있음. 우리에게 없는 기법들 |
★방침: 의존성으로 넣지 않는다(유료 이력·검증 부담). 원 스니펫을 읽고 네이티브 구현 + 자체 검정. 이건 CLAUDE.md §4 의 기존 방침 그대로다.
C. MLAM(2020)에서 우리에게 없는 기법 — 다음 후보군
| 기법 | 무엇 | 왜 우리에게 |
|---|---|---|
| 추세 스캐닝(Trend Scanning) | t 부터 t+L 까지 회귀를 여러 번 적합해 기울기 t값이 최대인 창을 고름. 라벨 = t값 부호/크기 | 우리 라벨은 삼중장벽 하나뿐이다. 추세 스캐닝은 다른 라벨 — 라벨을 바꾸면 IC 가 바뀐다 |
| ONC(최적 군집 수) | 상관행렬 군집화로 진짜 차원을 찾음 | ㊷-C 에서 피처 7개가 유효 3.02개로 나왔다. ONC 는 그걸 체계적으로 처리 |
| 클러스터 MDI/MDA | 상관된 피처를 묶어서 중요도 산출 | 상관 피처를 개별 평가하면 중요도가 서로 갉아먹는다 — 옛 메타라벨링이 정확히 그 상태 |
| 디노이징/디토닝 | 상관행렬의 잡음 고유값 제거 | 횡단면 전략 두 개가 상관행렬에 의존한다 |
㊷ 메타라벨링 재개 타당성 — ★검정력을 먼저 쟀다(규칙 8). 열렸다, 간신히
(나)로 가기 전 내가 선언한 전제. ⑩의 교훈 그대로 — 기각이 무효였을 수 있으므로 재기 전에 확인. ★대상을 바꿨다: 옛 메타라벨링은 지금 없는 채널 시스템(527거래) 위였다. 배포 중인 T1 로 잰다.
A 유효 표본 (AFML ch.4 평균 고유성 — 우리 구현 labeling/sample_weights.py 그대로 호출)
거래 888건 · 승률 44.8% · 보유기간 중앙 9봉
평균 고유성 0.4672 → 명목 888건 = **유효 415건 (46.7%)**
가장 겹치는 종목: ETH 0.372 · BTC 0.401 · SOL 0.408
B 검정력 — ★1차 판정을 뒤집었다. 아래가 최종이다
★내 1차 판정("열렸다")은 틀렸다. 종목별 고유성을 더한 415건은 "BTC 거래와 ETH 거래는 서로 독립" 을 가정한 값이다. AFML ch.4 의 고유성은 한 계열 안의 시간 겹침만 본다. 크립토는 서로 0.6~0.9 로 동조하므로(rank65) 그 가정이 성립하지 않는다. 사용자 지적("네 구현은 죄다 버그 투성이였으니 과거 결과를 믿지 마라")으로 시작한 ㊹ 기계 검증 작업 중에 내가 스스로 발견했다.
| 표본 | 양/음 | AUC 표준오차 | 검출 가능 최소 AUC | AUC 0.55 검정력 |
|---|---|---|---|---|
| 명목 888 | 398/490 | 0.0195 | 0.532 | 82.2% |
| 유효 상한 415(교차 독립 가정) | 186/229 | 0.0285 | 0.547 | 54.3% |
| 유효 하한 60(완전 중복 가정) | 27/33 | 0.0755 | 0.624 | 16.2% |
★독립 측정이 하한 쪽을 지지한다. ㉒에서 실측한 분산 팽창 11.99배 → 888 / 11.99 = 유효 74건. 전역 캘린더 고유성(60건)과 서로 다른 두 방법이 60~74 에서 만난다. 415 는 낙관 가정의 산물이다.
⇒ 사전 기준을 하한에 걸면 검정력 16.2% 로 미달. ML 경로는 표본 벽에 막혀 있다.
C 피처 중복 — 후보 7개 → 유효 독립 3.02개(43%) · 비대각 |상관| 중앙 0.455 · 최대 0.879. 옛 메타라벨링의 "피처 15개"(ADX·DI·RSI·EMA거리·ATR%·레짐 원핫…)도 전부 같은 가격 계열 변환이라 실제 차원은 3~4개였을 것이다. "15차원"은 거짓이었다.
★부검 결론 — 옛 실패의 원인은 모델이 아니라 설계 둘이다. ① 표본: 유효 표본이 60~74건이다. 관문이 AUC 0.624 를 요구한다 — 메타라벨링에서 0.62 는 사실상 존재하지 않는 수준이다. 모델을 아무리 잘 만들어도 못 넘는다. ② 피처: 15개가 유효 3
4개. 같은 가격을 15번 물어본 것이라 새 정보가 0 이다. ⇒ 재개 시 고쳐야 할 것도 그 둘이다: 표본 가중(고유성)을 학습에 실제로 먹이고, 가격이 아닌 축의 피처를 넣는다(㊵에서 Amihud 만 움직인 것과 같은 원리). ★그리고 프로토콜 13단계(변수 선택 → 인과 발견 → 교락/충돌부 구분)가 정확히 ②를 다루는 절차다.★★그러나 ①이 먼저다. 그리고 ①은 지금 막혀 있다. 이건 다섯 번째 같은 벽이다 — 지표(㉒) · TF(㉘) · 수익원(㊲) · 종목(㊴) · ML 표본(㊷). 다섯 번 다 "유효 독립 정보"가 병목이었다. ML 은 정보를 만들지 못한다. 짜낼 뿐이다. 유효 표본 60~74 에서는 짜낼 것이 없다.
표본 벽을 푸는 길은 셋뿐이고, 둘은 이미 닫혔다: · 종목 늘리기 → ㊴에서 닫힘(상관된 잡음만 는다) · TF 줄여 겹침 줄이기 → ㉘에서 닫힘(엣지가 거래보다 빨리 준다) · 남은 하나: 라벨을 바꿔 표본당 정보량을 늘린다 — 이진 승/패 대신 추세 스캐닝(MLAM)의 연속 t값을 회귀 타깃으로. 같은 거래 수에서 정보가 더 나온다. 이게 AFML/MLAM 이 소표본에 주는 유일한 정공법이며, 아직 시도한 적이 없다.
/docs 88개 전수 대조 결과 — 다시 뒤질 필요 없는 목록
| 구분 | 항목 | 상태 |
|---|---|---|
| 부활 성공 | 베어숏북 → 부호 반전 → L3 자본항복 되돌림 | ㉛~㉟. 통과·보류 |
| 부활 후보(사유 소멸) | 페어/공적분 — rank68 이 "6종목=15쌍"이라 탈락시켰으나 지금 25종목=300쌍 | 미검정. 사유 무효 |
| 규모·저변동성·비유동성 팩터 — rank68 이 "베타 노출"로 탈락시켰으나 달러중립판은 베타 0 | ㉝에서 검정 중 | |
횡단면 단기반전 — 배포 모멘텀이 skip=1 로 일부러 버리는 신호 | ㉝에서 검정 중 | |
| 데이터 벽(불가) | 마이크로스트럭처(OFI·density·TCR) — 모듈은 있으나 1h 6종목·5m 2종목뿐 | INTRADAY_RESEARCH §2.3 |
| 메이커 체결 기반 분봉 — L2 호가 없음(rank67 실측) | 불가 | |
| 변동성 리스크 프리미엄 — 옵션 데이터 없음 / 온체인 — 유료 | 불가 | |
| 이미 소진(재개 금지) | 거래량 5각도 · CVD 22단계 · 매물대/프로파일 · 돌파 8회 · RR 하한 6종 | 메모리 참조 |
| 문서 오류(정정 필요) | CONFLUENCE_RESEARCH 의 "거래량 = 필수 차원(공리)" | 실측 5각도 전부 기각 |
| 결론 문서 부재 | rank21~66 프롬프트 46건은 별도 RESULT 없음 — 결론은 PROGRESS.md 안에 있음 | 위치 확인 완료 |
★전수 기준을 한 번 더 정정한다. 위 표를 만들 때
docs/*.md(최상위 88개)만 훑고 하위 디렉터리를 빠뜨렸다. 커밋 때docs/history/4개(2,128줄)가 딸려 나와 발각됐다. 같은 실수의 재발이다. 이 원장의 전수 기준은docs/**/*.md= 92개이며 아래가 그 나머지다.
| docs/history 파일 | 내용 | 원장 상태 |
|---|---|---|
trading_strategy_review_1.md | 코스피/코스닥 단타 3종 + 레짐 5국면 + 전략 스위칭 | 전략 A(급락 후 반등·역추세)는 ㉜ L3 와 같은 모양 — 두 경로가 독립으로 만났다. 전략 B(돈치안 돌파)=배포본. 전략 C(초단타)=비용 산수로 봉쇄. 레짐 스위칭=㉚에 이미 '미검정'으로 등재 · ★주식 가정의 이식은 CLAUDE.md §9 금지 |
AFML….md | 동적 달러바 임계(유동성 모멘텀 비율) · 변동성 조정 삼중장벽 · 메타라벨링 · LSTM/Transformer/RL | 삼중장벽·메타라벨링은 이미 검정(메타라벨링 AUC 0.49 기각). 달러바는 일봉등가 A/B 완패. 동적 임계는 미검정이나 재튜닝 = 과적합 위험(CLAUDE.md TF 확정문) → 우선순위 낮음 |
최종 진행절차.md | V8/V9 · 커스텀 5TF(3분·12분·90분·5시간·4일) · 오일러 상수 $e$ · ATR 10% 렌코/레인지 봉 | $e$ 승수는 CLAUDE.md §9 명시 금지. 커스텀 단기 TF 는 ㉘에서 정보량 측정 완료(잘게 쪼개도 확인 안 빨라짐). 렌코/레인지 봉만 진짜 미검정 — 바타입 A/B 는 달러바만 했다. 단 같은 이유로 우선순위 낮음 |
퀀텀 컨셉 아이디어.md | 양자·중력장·유체역학 은유 · TCR · 에너지밀도 가속도 | 은유의 문자적 구현은 CLAUDE.md 프로젝트 정의에서 배제. 단 건질 알맹이(TCR·density·OFI)는 이미 features/microstructure.py 로 구현돼 있고 데이터 벽(1h 6종목)에 막혀 있다 — 위 '데이터 벽' 항목과 같은 자리 |
⇒ docs 하위까지 포함해 새로 열린 실마리는 없다. 렌코/레인지 봉 하나가 형식상 미검정으로 남지만, 달러바 A/B 완패 이후의 바타입 재튜닝은 원장이 이미 과적합으로 분류한 행위다.
★다음 수익원 후보의 선별 기준 (㉔·㉕에서 도출)
- 수익원이 가격이 아닐 것(캐리·수수료·프리미엄·이벤트)
- 크립토 펀딩 캐리는 이미 말랐다 — 같은 우물을 다시 파지 않는다
- 회전 0.05 이하로 운용 가능할 것(그 이상이면 비용이 먹는다)
- 우리 데이터/인프라로 지금 검정 가능할 것
★두 후보 공통의 가장 큰 경고 — 감쇠
폭 돌파 (배포 엔진 실측) 2023 +0.528R 2024 +0.327R 2025 +0.204R 2026 −0.205R
횡단면 모멘텀 (연 net) 2023 +23.5% 2024 −3.1% 2025 +16.4% 2026 −15.9%
돌파는 4년 단조 하락이다. 알파 소멸인지 국면인지 이 표본으로는 못 가린다. 판정은 전방 페이퍼에 맡긴다. 사이징 ×0.37 을 유지하는 이유는 §3 아래에 따로 적었다.
★배포 직전에 잡은 버그 — 검정은 멀쩡하고 배포 코드만 고장나는 유형
| 버그 | 증상 | 왜 검정에서 안 걸렸나 |
|---|---|---|
breadth_series | 유효 폭 0/2519 봉 — 진입이 영원히 안 남 | 검정은 종목별 연속 배열로 계산 후 캘린더로 옮김 |
atr_pit | 25종목 중 24종목 ATR 0봉 — 7년 신호 68건(전부 BTC) | 동일 |
rank_weights | 무효 종목이 k개 이상이면 숏 다리 소멸(가중치 전부 0) | 전체 유니버스에선 무효가 적어 표면화 안 됨. 종목 분할에서만 터짐 |
px[:, 0] = BTC 가정 | load_panel 은 알파벳순 → 0번은 1000SHIBUSDT. 시장 국면 변수 3개가 SHIB 를 잼 | SHIB 2021년 상장 → 2020~21 국면이 nan 인 게 단서였다 |
fd 열을 경계 파일 순서로 조회 | 다른 종목의 펀딩을 읽음 | fd 열 순서는 load_panel 기준인데 다른 목록으로 찾았다 |
| 앞의 둘은 원인이 하나: 캘린더 정렬 배열(결측=NaN)을 지표 함수에 그대로 먹인 것. | ||
| 뒤의 둘도 원인이 하나: 패널 열을 다른 목록의 위치로 찾은 것 — 이제 이름으로 찾는다. | ||
| 근본 수정: 엔진이 정렬 배열을 지표에 넣지 않는다(폭만 캘린더, 지표·신호는 종목 자기 봉). | ||
셋째는 무효 종목을 −inf 로 밀어 정렬한 탓 — 유효 종목만 골라 그 안에서 정렬하도록 고쳤다 | ||
| (펀딩 원본 Sharpe 0.1007 → 0.1853 으로 바뀔 만큼 결과에 영향이 컸다). |
2. 전 전략 목록 · 구현 경로
A. 독립 전략 (코드 모듈 존재)
| 전략 | 계열 | 상태 | ★찾은 구현 경로 (표준 관행 대비 우리 구현의 격차) |
|---|---|---|---|
| 횡단면 모멘텀 | 중립 | 2순위(미배선) | 격차를 이미 메움. 학술: 30일 형성·1일 스킵(단기반전 회피)·7일 보유·주간 리밸런스·각 끝 20% 롱숏. 우리 옛 구현: 롱온리·200봉 보유. 문헌은 "2~4주 무의미, 그 이상 음수"라 우리는 음수 구간을 들고 있었다 |
| 폭 조건부 롱 돌파 | 추세 | ★1순위 · 배포 배선 완료 | 격차 해소됨 — frozen 경계를 config/breadth_boundaries.json 에 1회 산출해 고정, 라이브가 plan_entry 를 그대로 호출(⑬ 정합 불일치 0건). 롤링은 OOS 0/4 로 탈락했으므로 재산출 금지 |
| 캐시앤캐리(현물+퍼프) | 캐리 | 기각(㉔·㉕) | 구조는 맞음(가격위험 97.5% 제거)·회전 감축도 통함. 그러나 gross 가 3년 −93%(16.57%→1.07%) 로 말라 2026 에 비용을 못 덮는다 |
| 펀딩 캐리 | 캐리 | 기각(⑮) — 무기한형 | gross 게이트 실패(B 홀수 net +3.07% / gross −10.27%). 격차: 우리는 무기한 횡단면만 가능(현물 다리 없음). 표준 캐시앤캐리(현물 롱 + 무기한 숏)는 현물 체결 경로가 있어야 한다 — 그게 생기면 연 5~19% 사례가 사정권 |
| Triple RSI + 50 EMA | 추세 진입 | 유지 | 이미 귀무모형 통과·PIT 확인 완료. 남은 한계는 WFE 0.17·최악버킷 |
| 돈치안 돌파 | 추세 | 무조건형 탈락 | 폭 조건을 붙이면 살아난다(→ 2순위). 무조건은 OOS 0/4 |
| 하이킨아시 | 추세 지속 | 기각(⑯) | 2,797건 초과 −0.001R · P 0.281. 표준 관행(HA 는 신호 평활이지 트리거가 아님)대로 다른 진입의 확인자로 쓰는 변형은 아직 미검정 |
| TTM 스퀴즈 | 변동성 응축 | 기각(⑯) | 1,426건 초과 −0.003R · P 0.141 · 3/3 분할 음수. '축이 달라 상관이 낮을 것'이라는 기대는 엣지가 있어야 의미가 있는데 엣지 자체가 없었다 |
| 볼린저 + CCI | 상대 모멘텀 | 기각 | 개별 DSR 0.075 + ablation 4증거 열등. 표준 관행 대비 격차는 레짐 필터 부재(공개 실측: 횡보 PF +1.62 / 추세 −0.74) |
| 채널 평균회귀 | 평균회귀 | 반대 | 표준 관행 격차: ADF/Hurst/OU 반감기로 회귀성을 먼저 검정해야 하는데 한 번도 안 했다. ②에서 검정하니 잔차는 회귀하나(자격 69.4%) 그 자격이 수익으로 이어지지 않았다 |
B. 오버레이 · 필터
| 상태 | 찾은 격차 | |
|---|---|---|
| CVD (22단계) | 기각 → 재구성 중 | 표준은 트리거 아님(소진 위치 표시자) · 풋프린트 1분 해상도 · 가격 구조 확인 후 진입. 장중 버킷 재측정에서 세 버킷 부호 일관(z<2) |
| 거래량 프로파일 | 롱만 미약 | POC/VAH/VAL 을 레벨로 썼으나 위약을 못 넘음 |
| SMA20 사이징 가중 | 조건부 | 숏 OOS 0/4 |
| 추세 품질(ADX 상승) | 채택 | 현물 OOS 통과 |
| 펀딩 조기청산 | 채택 | — |
| 청산 캐스케이드 / 리테스트 / 부분익절 / 거래량 게이트 / RR 하한 / 레버리지 / 메타라벨링 | 전부 기각 | 각 항목 PROGRESS 기록 참조 |
C. 청산 규약 (오늘 A/B)
| 청산 | 평균R | 버킷승 | 해석 |
|---|---|---|---|
| 고정 RR 2.0 | +0.312 | 17/42 | 현행 |
| 샹들리에 3ATR | +0.667 | 15/42 | 평균R 2배, 버킷은 악화 |
| 반대채널 10 | +0.725 | 11/42 | 평균R 최고, 버킷 최악 |
| 고정 RR 3.0 | +0.368 | 18/42 | 버킷 최고, 최악버킷 −16.2% |
구조적 결론: 추세추종은 덩어리로 번다. 청산을 바꿔도 그 성질은 안 바뀐다.
D. 조사만 하고 미구현
MACD · 스토캐스틱 · 이치모쿠 · VWAP · 그리드 · 페어트레이딩 · 차익거래 ※ MACD·스토캐스틱·RSI·EMA 는 "같은 가격 계열의 변환이라 서로 상관"이라 조사 단계에서 제외. ※ 피보나치 · 마틴게일은 CLAUDE.md §9 금지.
3. 다음 계획
이번 재검토(⑨~⑲)에서 완료된 것
| 내용 | 결과 | |
|---|---|---|
| ⑨~⑪ | 횡단면 모멘텀 OOS·민감도 + 새 판정 규칙 수립 | 조건부 채택 (P 0.965) |
| ⑫~⑭ | 돌파 소급 재판정 · 라이브↔검정 정합 · 배포 포트폴리오 검정 | 채택 · 정합 0건 · 버그 2개 발견 |
| ⑮ | 펀딩 캐리 새 규칙 재판정 | 기각 (gross 게이트) + rank_weights 버그 발견 |
| ⑯ | 하이킨아시 · TTM 첫 검정 | 둘 다 기각 (초과 ≈ 0) |
| ⑰⑱ | 위약 귀무분포 교정(시간 군집 · 기하) | 돌파 4분할 전부 통과 |
| ⑲ | 후보 결합 상관 분석 | ρ=+0.013(독립) 이나 위험 맞추면 이득 없음 |
남은 할 일
| 순위 | 할 일 | 왜 |
|---|---|---|
| 1 | 폭 돌파 전방 페이퍼 관측 | 배포 배선 완료·미가동(QC_BREAKOUT_LIVE=1). 4년 단조 감쇠가 국면인지 알파 소멸인지 전방 표본만이 가린다 |
| 2 | ★진짜로 다른 수익원 탐색 | ㉒·㉓이 사이징·빈도·헤지를 전부 막았다. 유효 베팅 2.8→33 은 다른 수익원으로만 가능하다. 기준: 크립토 베타와 구조적으로 무관할 것(기술적 지표 변형은 해당 안 됨) |
| 3 | 횡단면 모멘텀 라이브 배선 | P 0.965 통과인데 코드가 없다. 단, ⑲에서 결합 이득이 확인 안 됐으므로 급하지 않다 |
| 4 | 완료(㉔·㉕) — 기각. 캐리가 말랐다 |
★2순위가 ㉒·㉓에서 최종 확정됐다. ⑳→㉑→㉒→㉓ 로 용의자를 하나씩 지웠다: 국면(㉑에서 최근엔 해당 없음) → 알파 소멸(㉑ 기각, 검정력 100%) → 신호 빈도(㉒ 무죄) → 베타 헤지(㉓ 막힘). 남은 것은 다른 수익원뿐이고, 그게 2순위다.
사이징은 왜 ×0.37 인가 (규칙보다 낮게 잡은 이유를 남긴다)
규칙대로면 전방 분할 P 0.990 → ×0.98. 올리지 않았다.
⑱은 전 이력 거래 단위 검정이고, ⑭ 계좌 재생은 연도별 단조 감쇠를 보여줬다:
2023 +0.528R → 2024 +0.327 → 2025 +0.204 → 2026 −0.205.
"전 표본에 엣지가 있다"와 "지금도 있다"는 다른 질문이다. 전방 페이퍼 표본이 쌓이면 올린다.
㊻ 트랙 배분 — HRP(AFML ch.16) 미달. 그리고 이유가 이론에 있다
사전선언: HRP 가 EW 대비 하위3 개선 그리고 버킷 승률 비악화. 워크포워드(후행 252일 적합 → 63일 적용), 네 트랙 공통 생존 구간 2020-07~2026-01(1,997일).
| 배분 | 연수익 | Sharpe | 버킷승률 | 하위3 | 평균 비중 (T1·T2·T3·T4) |
|---|---|---|---|---|---|
| EW 동일비중 | +21.26% | 2.49 | 76.7% | −1.89% | 0.250 · 0.250 · 0.250 · 0.250 |
| IVP 역분산 | +18.30% | 1.86 | 73.3% | −4.30% | 0.427 · 0.191 · 0.255 · 0.126 |
| ★HRP | +17.95% | 1.83 | 73.3% | −4.42% | 0.434 · 0.192 · 0.250 · 0.125 |
판정: 미달 — 하위3 −1.89%→−4.42%(악화) · 승률 76.7%→73.3%(악화). 둘 다 졌다.
진단 두 개를 더 돌렸고 셋 다 HRP 가 졌다:
- 진단A 21일 집계(희소성 보정): T1 비중 0.43→0.29 로 정상화됐지만 결과 불변(하위3 −2.94→−5.72%)
- 진단B T4 제외(인샘플 Sharpe 2.17 이 t=0.39 라 신뢰 불가): 하위3 −4.55→−5.60%
왜 졌나 — 우리에겐 HRP 가 고치는 병이 없다
네 트랙 상관은 비대각 |max| 0.142, 상관행렬 고유값 [0.845·0.869·1.138·1.148], 조건수 1.36. HRP 가 겨냥하는 것은 마코위츠의 저주 — 자산이 강하게 상관돼 공분산이 특이에 가까워질 때 2차 최적화가 폭주하는 병이다. 조건수 1.36 은 그 병이 없다는 뜻이다. 그리고 무상관·유사 Sharpe 자산에서 동일비중이 이론적 최적이다. 우리는 트랙을 일부러 무상관으로 지었고, 그래서 분산 이득을 설계 단계에서 이미 다 받았다. HRP 가 더 찾을 것이 남아 있지 않았다. ★이건 프라도의 반례가 아니라 적용 조건의 확인이다.
가는 길에 잡은 버그 셋 (셋 다 조용히 틀렸을 것들)
- R 분모를 실현 |수익| 로 썼다 → 수직 만료 건에서 R 폭발, 하루 82R(위험 1%×0.20 이면
베팅당 ±0.2%).
strat_outcomedocstring 의 +87.88R 과 같은 병을 내가 재도입했다. 분모는 **의도한 위험(장벽 σ)**이다. - ★base_day 를 안 넘겨받았다 —
assemble()이 d0 를 0 기준으로 재기준화하는데t4_daily()는d0.min()(=0)을 base 로 반환했다. T4 계열이 18,267일(50년) 전에 꽂혀 T1~T3 와 달력이 한 칸도 겹치지 않았다. 표는 멀쩡해 보였고, EW 만 맞고 IVP·HRP 가 음수로 나온 것이 유일한 단서였다. - 분산 0 을 무위험으로 읽었다 — 아직 시작 안 한 트랙은 수익이 전부 0 이고,
역분산은
1/1e-18로 그 죽은 트랙에 전 비중을 준다. 분산 0 은 무위험이 아니라 미거래다.
㊼ CPCV · DSR · PBO — 프라도 정본 절차로 T4 재판정. 미달
사전선언(실행 전 고정): N=6 그룹 · k=2 → C(6,2)=15 분할 · 5 경로 · 주 q=20%(사전등록치) · 시행 33(㊺ 누적 32 + 1) · 관문 3개 전부여야 통과 — ① 5경로 Sharpe 전부>0 ② DSR≥0.95 ③ PBO≤0.50.
★기계부터 검정했다. CombinatorialPurgedCV 는 구현돼 있었지만 한 번도 쓰인 적이 없었고,
㊼ 는 path_map() 역인덱스에 전적으로 의존한다. 알려진 답 5종을 먼저 못박았다
(tests/validation/test_cpcv_path_reassembly.py): 분할·경로 수가 이항계수와 일치 · 역인덱스가
전단사 · 각 경로가 전 표본을 빠짐없이·중복없이 덮음(덮어쓰기 0·구멍 0) · 엠바고 단조성.
경로별 Sharpe (행=경로 · 열=확신 상위 q)
| 1% | 5% | 10% | 20% | 30% | 50% | |
|---|---|---|---|---|---|---|
| 경로1 | 5.07 | 5.01 | 3.67 | 2.06 | 0.67 | −1.50 |
| 경로2 | 4.80 | 4.80 | 3.80 | 1.92 | 0.56 | −1.49 |
| 경로3 | 4.87 | 4.88 | 3.92 | 2.26 | 0.73 | −1.18 |
| 경로4 | 4.83 | 4.95 | 3.96 | 2.32 | 0.94 | −1.22 |
| 경로5 | 4.69 | 5.06 | 4.11 | 1.94 | 0.60 | −1.65 |
- ① 통과 — 5경로 전부 양(+), 1.92~2.32. 그리고 q 단조성이 5경로 전부에서 재현된다. ㊺-8 의 단조성이 단일 경로의 우연이 아니었다는 것은 이걸로 확인됐다.
- ② 실패 — DSR = 0.0000. 시행 33 · 시행간 SR 분산 6.42 → 기대 최대 SR ≈ 5.6. 관측 2.10 은 운만으로 기대되는 최대치에 한참 못 미친다.
- ③ PBO = 0.0000 이지만 무의미하다. q 격자는 중첩된 단조 계열이라 IS 최적(q=1%)이 OOS 최적이기도 하다 — 구조상 PBO 가 0 이 될 수밖에 없다. 통과로 세지 않는다.
판정: 미달.
가는 길에 잡은 지표 버그 둘
- 연율화 오류 — Sharpe 를 "베팅이 있던 날"만으로 재고 √365 를 곱했다. q=1% 에서 Sharpe 7.5 가 나왔고, q 마다 관측 수가 달라 q 끼리 비교조차 성립하지 않았다. 달력을 빠짐없이 채워야 한다 — 베팅 없는 날의 수익은 0 이고 그게 계좌의 사실이다.
- DSR 계열 5배 뻥튀기 — 5경로를 이어붙였다. 경로들은 같은 데이터를 공유해 강하게 상관되는데, 이어붙이면 독립 관측 5배인 척하게 된다. 경로 평균을 써야 한다.
위약 설계 실패 — 쓰지 않았다고 적는다
순환 시간 이동 M=64 의 위약 t 는 −21.01 ± 0.80. 0 근처가 아니다. 이유는 명확하다:
무기술 베팅도 매번 비용/장벽 ≈ 0.1R 을 잃으므로 귀무의 중심이 비용 드래그에 끌려간다.
그리고 표준편차 0.80 은 38,000건 평균의 변동이라 참조로 쓰기엔 지나치게 좁다.
"실측 5.96 > 위약 97.5%분위 −19.49" 는 "모델이 동전던지기보다 낫다" 만 말한다.
그건 내가 물어야 할 질문이 아니었다. 이 판정은 쓰지 않았다.
★남은 미해결 — 관측 단위가 t 를 15배 바꾼다
같은 대상(q=20%)에 두 측정이 어긋난다:
- ㊺-8: 베팅 단위 · 균일성 유효표본 456 → t 0.39
- ㊼: 달력일 단위 · 2,405일 → t 5.96 (자기상관 보정해도 5.98 — 팽창 0.99배)
균일성은 50종목 동시 베팅을 전부 중복으로 세고(유효 1,999), 달력일은 하루 안의 롱숏 상쇄를 분산 감소로 인정한다. 둘 다 방어 가능한 분모이고 답이 반대다. 확인한 것: R 배수는 깨끗하다 (|max| 1.2 · 장벽 σ 최소 0.14% → ㊻의 폭발 병 없음). 이건 아직 못 가렸다고 적는다. 다만 결론은 이것과 무관하게 정해진다 — 달력일 t 를 액면 그대로 받아도 DSR 이 기각한다.
DSR 의 한계도 적는다: 시행간 SR 분산 6.42 는 q 격자(4.94~−1.41)가 거의 다 만든 값인데, q 격자는 독립 탐색 6회가 아니라 중첩 단조 계열이다. 탐색 폭을 과대평가했을 수 있다. 사전선언대로 두고 바꾸지 않았다.
배포에 대한 조치: 없음
T4 의 모델·임계는 동결이고 바꾸면 그 순간 기록이 전부 무효다(PAPER_TRACKS_PLAN §5). ㊼ 가 더한 것은 "부호는 5경로에서 견고하고, 크기는 다중검정을 못 넘는다" 이며, 이는 기존 지위(판정 불가 · 사전등록 가설)와 정확히 같다. 라이브 반영 없음.
㊽ 블록 부호반전 — 관측 단위를 가렸고, ★㊼ 의 ② 판정을 철회한다
㊼ 가 남긴 세 문제(관측 단위 15배 · 위약 설계 실패 · DSR)는 뿌리가 하나였다 — 유효 표본 크기. 그래서 하나의 실험으로 셋을 풀었다. 그리고 ㊼ 의 실패 판정 중 하나는 내 버그였다.
설계 — 블록 부호반전 무작위화
무기술 귀무 H0 는 "확신의 부호가 결과와 무관" 이므로 side 는 교환 가능하다. side 를 L일 연속 블록 단위로 뒤집는다(개별 베팅마다 뒤집으면 군집이 깨져 귀무가 과소평가). 보존: 선택 집합·선택률·시간 군집·동시성·변동성·횡단면 구조 / 제거: 기술만. gross 로 잰다(규칙 19) — 비용을 넣으면 귀무 중심이 −0.1R/베팅 으로 끌려간다(㊼ 위약이 그랬다).
판별 1 — L 증가는 의존성이 아니라 평균 누출이었다
| L(일) | 귀무std(원) | 예측 √((Lμ²+σ²)/(μ²+σ²)) | 귀무std(중심화) |
|---|---|---|---|
| 1 | 1.037 | 1.037 | 1.001 |
| 5 | 1.209 | 1.250 | 1.037 |
| 20 | 1.699 | 1.841 | 1.029 |
| 40 | 2.248 | 2.413 | 1.091 |
| 80 | 3.023 | 3.270 | 1.252 |
| 160 | 4.147 | 4.520 | 1.623 |
원계열의 증가는 평균 누출 예측식과 8% 이내로 일치한다 — 블록이 길수록 |블록합| 이 커져 iid 라도 귀무가 넓어진다. 중심화하면 L=40 까지 1.0 에 평평하다. ⇒ 달력일 간 의존성은 40일까지 없다. L=80·160 의 상승(1.25·1.62)은 블록이 30·15개뿐이라 생기는 무작위화 해상도 잡음이고 각각 약 2σ — 노이즈일 가능성이 크지만 보수적으로 채택한다.
★판별 2 — 관측 단위의 답: N_eff = 913
| 후보 | 값 | 판정 |
|---|---|---|
| 달력일 (㊼ 가 씀) | 2,405 | 2.6배 관대 |
| 균일성 유효표본 (㊺-8 이 씀) | 456 | 2배 가혹 |
| ★부호반전 측정치(보수) | 913 | 채택 |
균일성이 가혹한 이유가 명확하다: AFML ch.4 의 uniqueness 는 같은 종목의 겹치는 라벨이 같은 수익 경로를 공유하는 것을 센다. 50종목을 한 인덱스에 풀링하면 횡단면 폭(breadth)까지 중복으로 세어버린다. 다른 종목의 수익은 다른 수익이고, 공통 시장 요인만 공유한다 — 그건 일별 집계의 분산에 이미 반영돼 있다. 그리고 프라도 자신의 그린올드 기본법칙에서 breadth 는 도움이지 벌점이 아니다. ⇒ ㊺ 계열이 유효표본으로 내린 기각들은 약 2배 과보수였다.
보정 결과: net 일평균 +0.6166R · 연율 SR 2.32 · t 5.96 → 보정 t 3.67 (gross 는 일평균 +2.0355R · 연율 SR 6.83 · t 17.52. 비용이 gross 의 70% 를 먹는다.)
★판별 3 — DSR: ㊼ 의 실패는 내 버그 두 개였다
- 단위 오류 365배.
sharpe_ratio는 문서에 명시된 대로 관측 단위당인데 나는 연율화된 SR 들의 분산 6.42 를 넘겼다. SR* 가 102(연율) 로 나왔다 — 불가능한 값이다. - 탐색폭 대리변수가 부적절. q 격자(1
50%)는 한 모델의 중첩 부분집합이지 6번의 독립 탐색이 아니다. 그 분산은 확신이 정보를 나른다는 결과이지 탐색의 폭이 아니고,0.5245 로 좁다.expected_max_sharpe가 전제하는 독립 시행도 아니다. 실제 탐색은 ㊺-6 의 격자 6칸(k=8·16 × g=1·2·3)이고 AUC 0.5134
expected_max_sharpe 구현은 시뮬레이션으로 대조해 정상 확인(N=33·v=1: 시뮬 2.081 vs 구현 2.112).
| 시행간 SR sd(연율) | SR*(연율) | DSR(n=2,405) | DSR(N_eff=913) |
|---|---|---|---|
| 0.18 (CPCV 경로간) | 0.38 | 1.0000 | 0.9989 |
| 0.40 (㊺-6 실제 격자) | 0.84 | 0.9999 | 0.9902 |
| 0.60 | 1.27 | 0.9966 | 0.9522 |
| 1.00 | 2.11 | 0.7041 | 0.6294 |
| 1.50 | 3.17 | 0.0148 | 0.0902 |
| 2.53 (q격자 — 부적절) | 5.34 | 0.0000 | 0.0000 |
㊼ 의 "② DSR 실패" 는 철회한다. 단위를 고치고 N_eff 를 측정치로 두고 탐색폭을 실제 모델 격자에서 재면 DSR 0.99 로 통과한다. 다만 정직하게 적는다 — 이 판정은 탐색폭 입력이 정한다. 0.40 은 AUC→SR 선형 환산 대리값이지 측정된 Sharpe 분산이 아니다. sd ≤ 1.0 이면 통과, ≥ 1.5 면 실패다.
㊼ 판정 정정
| 관문 | ㊼ 원판정 | 정정 |
|---|---|---|
| ① 5경로 전부 양(+) | 통과 | 통과 (1.92~2.32) |
| ② DSR ≥ 0.95 | 통과 0.9902 (내 단위 버그 + 탐색폭 오지정) | |
| ③ PBO ≤ 0.50 | 0.0000 "통과" | 판정 불가 — 중첩 단조 축이라 구조상 0. 설계 결함 |
⇒ ㊼ 종합 "미달" 은 무효다. 인샘플 CPCV 기준으로는 ①② 통과, ③ 판정 불가다.
★그럼에도 승격하지 않는 이유 (전부 그대로 유효하다)
- 전부 인샘플이다. CPCV 로 교차검증했지만 피처·k·g·수직봉·비용가정은 전부 이 데이터를 보며 정했다.
- 체결 가정이 낙관적이다. 장벽 가격 체결 · 왕복 8bp 올인. gross 의 70% 를 비용이 먹는 전략이라 비용 가정이 조금만 틀려도 결론이 바뀐다. 이건 페이퍼로 검증되지 않는다.
- 탐색폭이 측정치가 아니라 추정치다(위 참조).
- N_eff 913 도 보수적 채택값이다. L=80·160 의 상승이 노이즈면 N_eff 는 2,300 에 가깝다.
★단 하나 실무적으로 바뀐 것: T4 사이징 ×0.20 의 근거가 "인샘플에서 유의하지 않았으므로" 였는데 그 전제는 이제 틀렸다. 그렇다고 올리지 않는다 — PAPER_TRACKS_PLAN §5 는 사이징 상향을 전방 표본이 판정 기준을 넘긴 뒤에만 허용한다. 근거 문구만 정정하고 숫자는 동결한다.
㊾ 유보 넷을 결론으로 — ★모델은 맞고 임계가 틀렸다
㊽ 이 남긴 "유보 4개" 는 결론이 아니라 미룬 것이었다. 넷 다 닫는다. 그리고 그 과정에서 배포된 설정이 탈락했다.
결론 표
| 유보 | 방법 | 결론 |
|---|---|---|
| ① 전부 인샘플 | 종목 × 시간 이중 분리 홀드아웃 | 신호는 실재한다 — gross 연율 SR 3.42·4.62 |
| ② 비용 가정 | 손익분기 역산 | ★q=20% 탈락 — 손익분기 6.3·8.3bp < 실제 8~10bp |
| ③ 탐색폭 추정치 | (k,g) 6칸의 일별 Sharpe 실측 | 측정 0.956 (내 추정 0.40 은 과소, q격자 2.53 은 과대) |
| ④ N_eff 보수값 | 분산비(Lo-MacKinlay) | ★1,537 — ㊽ 의 913 은 gross 기준 오류였다 |
| PBO 판정 불가 | 전략 축을 비중첩 (k,g) 6칸으로 | 0.0000 통과 |
㊾-1 격자 PBO — 전략 축을 비중첩으로
㊼ 의 PBO 는 q 격자(중첩 단조)라 항등식이었다. 실제로 훑은 서로 다른 후보는 ㊺-6 의 (k,g) 6칸이다. 프로토콜은 ㊺-6 과 동일(PurgedKFold 5 · 엠바고 10일).
| 칸 | 이벤트 | 연율 SR(q=20%) |
|---|---|---|
| k=8 g=2 | 93,715 | 0.86 |
| k=8 g=1 | 196,939 | 2.06 |
| k=8 g=3 | 54,563 | 0.70 |
| k=16 g=2 (배포) | 190,588 | 2.32 |
| k=16 g=1 | 400,879 | 3.17 |
| k=16 g=3 | 110,799 | 1.24 |
PBO = 0.0000 통과. 단, IS 최적(k=16 g=1)이 전 구간 우세해 선택이 안정적인 결과이므로 강한 형태의 통과는 아니다 — PBO 가 잡는 것은 "선택이 뒤집히는" 과적합이고, 여기선 안 뒤집혔다.
측정된 탐색폭 = 0.956 (q=10% 면 1.458, q=5% 면 1.867 — 계층이 좁을수록 칸 간 격차가 커진다).
| q | 배포칸 SR | 탐색폭 | SR* | DSR(N=2,405) | DSR(N_eff=1,537) |
|---|---|---|---|---|---|
| 20% | 2.32 | 0.956 | 2.02 | 0.780 | 0.731 실패 |
| 10% | 4.12 | 1.458 | 3.08 | 0.996 | 0.984 통과 |
| 5% | 4.92 | 1.867 | 3.94 | 0.994 | 0.977 통과 |
⇒ ㊽ 이 "DSR 통과" 라 적은 것은 탐색폭을 0.40 으로 과소추정한 결과였다. 실측 0.956 에서 q=20% 는 실패한다. 정정한다.
㊾-2 이중 분리 홀드아웃 — ★가장 중요한 검정
학습 = 종목 절반 · ≤2023-12-31 / 검정 = 나머지 종목 · 2024-02-01 이후(엠바고 30일). 두 축을 동시에 끊는다 — 하나만 끊으면 다른 축으로 정보가 샌다. 하이퍼파라미터는 배포값 고정. 여기서 아무것도 고르지 않았다.
| 배정 | q | 베팅 | gross SR | net SR(8bp) | net SR(10bp) | 손익분기 |
|---|---|---|---|---|---|---|
| 짝→홀 | 20% | 7,820 | 3.42 | −0.98 | −2.17 | 6.3bp |
| 짝→홀 | 10% | 3,910 | 3.53 | +0.64 | −0.14 | 9.6bp |
| 짝→홀 | 5% | 1,955 | 4.32 | +2.34 | +1.80 | 16.2bp |
| 홀→짝 | 20% | 8,516 | 4.62 | +0.16 | −1.02 | 8.3bp |
| 홀→짝 | 10% | 4,258 | 4.79 | +1.82 | +1.02 | 12.5bp |
| 홀→짝 | 5% | 2,129 | 4.98 | +3.04 | +2.50 | 18.6bp |
사전 관문(q=20% net Sharpe > 0, 양방향): 실패 — −0.98 · +0.16.
★그러나 gross 는 3.42·4.62 로 강하다. 학습에 없던 종목, 학습 이후 기간에서도 신호가 산다.
즉 모델이 틀린 게 아니라 임계가 틀렸다. q=20% 는 건당 엣지가 고정비용 810bp 를 못 넘는다.
q=5% 는 건당 엣지가 4배라 손익분기가 1619bp 로 올라가고, **양방향·실제 수수료에서 양(+)**이다.
④ N_eff 정정 — ㊽ 의 913 은 틀렸다
분산비(Lo-MacKinlay)는 무작위화 해상도 문제가 없다. net 계열에서:
L=280 의 VR 은 0.9451.028(z 전부 |z|<0.8, 유의한 의존성 없음), L=320 에서 1.564.
보수 채택 → N_eff 1,537 · 보정 t 4.76.
㊽ 이 913 을 얻은 이유가 확인됐다 — gross 계열로 보정계수를 재서 net t 에 적용했다. 비용항은 극단적으로 자기상관돼 있다(VR: L=20 에서 4.18, L=320 에서 33.0). 일별 베팅 수와 변동성 레짐이 지속되기 때문이다. gross VR 3.28 vs net VR 1.56 이 그 차이다. 보정계수는 판정하려는 계열 자신에게서 재야 한다.
⇒ 조치: 신호는 동결, 판정 기준을 q=5% 로 사전등록
q=5% ⊂ q=10% ⊂ q=20% 이므로 엔진은 손대지 않는다(q=20% 로 계속 생성).
summary() 에 계층 보고만 추가했다. 이 등록은 전방 표본이 0 인 시점(2026-08-08)에 이뤄졌다.
- 주 판정 = q5. 예측: 순수익 > 0
- q20 은 반증 대조군. 예측: 음(−) — 홀드아웃에서 10bp 로 −2.17·−1.02 였다
- ★q=5% 를 고른 것은 q=20% 실패를 본 뒤다. 그러나 (a) q 단조성은 ㊺-8 에서 먼저 확인됐고 (b) 이유가 기계적이다(건당 엣지는 확신에 비례, 비용은 건당 고정) (c) 홀드아웃 증거는 진짜 표본 외다. 그래도 사후 선택은 사후 선택이므로 전방으로만 판정한다.
- 사이징 ×0.20 동결. 상향은 전방 표본이 기준을 넘은 뒤에만.
㊿ 네 트랙을 같은 잣대로 — 그리고 검증을 코드로 강제했다
㊿-A 이중 분리 홀드아웃 (종목 × 시간, 양방향)
학습 = 종목 절반 · ≤2023-12-31 / 검정 = 나머지 종목 · 2024-02-01 이후(엠바고 30일).
| 트랙 | 설정 | 검정 (짝→홀 / 홀→짝) | 학습 | 판정 |
|---|---|---|---|---|
| T1 폭돌파 | — | +0.160R · +0.224R (t 1.37·2.03) | +0.378·+0.473R | 양방향 양(+) |
| T2 모멘텀 | q=20% | SR −0.01 · +0.30 | −0.10·+0.68 | 한쪽 ~0 |
| T2 모멘텀 | q=10% | SR +0.17 · +0.43 | −0.04·+0.72 | 양방향 양(+) |
| T3 비유동성 | q=20% | SR +0.38 · −0.41 | +0.47·+0.72 | ★부호 뒤집힘 |
| T3 비유동성 | q=10% | SR +0.34 · −0.65 | +0.09·+0.68 | ★부호 뒤집힘 |
| T4 ML | q=20% | SR −0.98 · +0.16(8bp) | — | 실패(㊾) |
| T4 ML | q=5% | SR +2.34 · +3.04(8bp) · +1.80 · +2.50(10bp) | — | 양방향 양(+) |
검정력: T2·T3 는 참 SR 1.0 에 대해 43.5%, T1 은 51~56%. ⇒ 음(−)은 기각이 아니라 판정 불가다. 단 T3 의 부호 뒤집힘은 다르다 — 한쪽 +0.38 / 다른 쪽 −0.41 은 크기가 아니라 방향이 갈린 것이고, 이건 검정력 문제가 아니라 종목 집합을 바꾸면 결과가 뒤집힌다는 뜻이다. 일반화 실패의 전형적 서명이다.
★순위가 뒤집혔다. 인샘플 지위는 T2·T3(P 0.965·0.980 통과) > T4(미검증) 였는데, 같은 이중분리 잣대에서는 T4(q=5%) > T1 > T2(q=10%) > T2(q=20%) > T3 다. "인샘플 통과"는 이 잣대를 통과했다는 뜻이 아니었다.
- q=5% 는 T2·T3 에서 다리당 1종목이라 판정 제외. 52종목을 절반으로 나눈 한계다.
- T1 은 검정에서 학습 대비 절반으로 감쇠(+0.42→+0.19R). 그래도 양방향 양(+).
㊿-B 검증을 코드로 강제했다 — validation/audit.py
"버그가 있었습니다 / 다시 해보니 뒤집혔습니다" 가 이 세션에서만 일곱 번 나왔다. 전부 결과를 낸 뒤에 알아챈 것이다. 그래서 검사를 코드로 옮겼다. 검사 12종 · 테스트 20종 — 각 검사는 실제로 터진 사고 하나에 대응하고, 테스트는 그 사고를 재현해 넣어 감사가 막는지 증명한다(추측으로 만든 항목 없음).
★그리고 만든 직후 첫 실행에서 세 개를 잡았다:
- 다리당 1종목 — 25종목 패널을 절반 나누니 q=5% 가 1종목. '분산'이 아니라 개별 종목 사연
- q10 ≡ q5 —
k=max(1,round(n·q))라 둘 다 k=1. 표에는 두 줄인데 같은 전략이었다. 이걸 두 시행으로 세면 다중검정도 분위 스윕도 거짓이 된다 - 감사 범위 오설정 — 판정 제외한 설정까지 감사해서 엉뚱하게 막혔다.
막은 값
|max| 0.5092를 파보니 TRX +95.8%(2024-12-02) 라는 진짜 사건이었다. ★한도를 올려 통과시키지 않고 원인을 봤고, 답은 "감사 대상 = 판정 대상" 이었다
프로토콜 전문: docs/VERIFICATION_PROTOCOL.md · CLAUDE.md §6.5 에 NON-NEGOTIABLE 로 박았다.
(51)~(57) ★두 트랙을 살렸다 — 병목은 신호가 아니라 비용이었다
사용자 지시: "'이 전략은 못 씁니다'가 제일 싫다." 그래서 음(−)이 나올 때마다 원인을 특정 → 고친 버전을 내거나 → 왜 못 고치는지를 숫자로 내는 규율로 갔다. 결과: T3 는 살아났고, T4 는 피처로는 못 늘렸지만 체결 구조로 늘었다.
T3 — net>0 42% → 92%
| 단계 | 무엇 | 결과 |
|---|---|---|
| (51) 원인 | 가설 4개를 미리 적고 측정 | 집중도 30%·ADV분산 45~55배·유지율 90% 정상. gross 양방향 양(+) → 비용이 원인 |
| (52) 비용 레버 16칸 | 보유×상한×체결 | 양방향 통과 2/16, 최소 +0.02 — 아슬 |
| (53) 판정 교체 | 무작위 절반 분할 M=50 | gross>0 76%(천장) · 배포 net>0 42% · h21·maker 66% |
| (54) 버퍼 존 | 진입 상위 q, 청산 (q+b) 밖에서만 | b0.20·h21: net>0 92% · 비용 0.92→0.48bp |
| (56) 대조군 | 다리 크기 효과 제거 | 같은 다리 대조군 78% vs 승자 94% → 분산 효과 아님 |
★기제: 버퍼는 실효 보유기간을 늘린다. 비유동성 프리미엄은 천천히 쌓이는 팩터라 오래 들수록 더 걷는다. 다리를 4.5→5.3 으로 키우면 gross>0 가 +2%p 오르는데 버퍼는 +18%p 올렸다 — 크기로 설명이 안 된다.
T3 는 폐기 대상이 아니라 설정이 틀렸던 것이다. h7·상한96·taker(42%) → h21·버퍼0.20·maker(92%).
T4 — 피처는 실패, 체결이 성공
| 팔 | 피처 | OOF AUC | q5 홀드아웃 net(10bp) | 비용여유 | 판정 |
|---|---|---|---|---|---|
| base | 11 | 0.5219 | +1.80 / +2.50 | 1.62 / 1.86배 | 기준선 |
| +A VPIN | 13 | 0.5238 (+0.0019) | +1.35 / +3.21 | 1.44배 감사 막힘 | 불가 |
| +A+C 느린신호 | 16 | 0.5208 (−0.0011) | +1.73 / +2.39 | 1.66 / 1.84배 | AUC 악화 |
| ★(57) 체결 | 11 | — | +2.26 / +2.96 | 1.99 / 2.29배 | 채택 |
· VPIN 은 AUC 를 아주 조금 올렸지만 홀드아웃에서 비용여유가 관문 미달이었다 · 느린 신호 주입(T1 폭 · T2 모멘텀순위 · T3 유동성순위)은 오히려 AUC 를 떨어뜨렸다. ⇒ 트랙을 조건변수로 합치는 발상은 이 데이터에서는 안 통한다 · ★체결 구조: 삼중장벽은 청산 가격을 미리 안다. 익절(롱 상단·숏 하단)은 지정가 = maker, 손절은 스톱 = taker. 실효 왕복 10.0 → 8.13bp, net SR +26%
★1차 판에서 나는 "청산 전부 maker(7bp)" 로 잡아 여유 2.31/2.66배를 냈다. 손절이 스톱이라는 걸 빠뜨렸다. 정정하니 절감폭이 절반 이하로 줄었다(1.99/2.29배). 낙관 가정은 스스로 잡아야 한다.
외부 탐색이 확인해준 것
· [arXiv 2605.04004] MNQ 5분 OHLCV 신호군 14종 전부가 거래비용 미달 — 우리 T4 q=20% 사망과 같은 병이다. 독립 확인 · 크립토 퍼프 메타 오더플로우: IC 0.10·t 6.86 인데 raw alpha 0.42bp@30s = 우리 비용의 1/20 ⇒ 초단타는 우리 비용 구조로 원천 봉쇄 · VPIN 크립토 검증: 유효하나 감쇠(2024 +82bp → 2026 +12bp/거래)
★단타 빈도 — 이미 달성돼 있고, 더 빠르게는 못 간다
| q | 거래 | 일평균 |
|---|---|---|
| 20% | 38,118 | 15.85 |
| 5% | 9,529 | 3.96 |
장벽 축척 실측: 장벽 ∝ k^(−0.533). k 를 2배로 하면 장벽 69%, 비용/장벽 1.45배 악화.
| k | 장벽 | 비용/장벽(10bp) | 판정 |
|---|---|---|---|
| 16 (현재) | 100.2bp | 0.100R | 여유 2.4배 |
| 32 | 69.3bp | 0.144R | 여유 1.65배 — 가능 |
| 64 | 47.9bp | 0.209R | 여유 1.13배 — 아슬 |
| 128 | 33.1bp | 0.302R | 비용 > 엣지. 죽음 |
프론티어는 k=32~64. k=32·q=5% 면 일 8건. 그 이상은 수수료가 먹는다.
(58)(59) 배포 반영 — ★정합 검사가 또 잡았다
사용자 결정: 개선안을 배포에 반영. 그래서 프로토콜 Tier 2.3(엔진 재생 대조) 을 돌렸다.
(58) 정합 검사 — 검정 스크립트 vs 배포 모듈
| 항목 | 결과 |
|---|---|
| 점수 | 최대차 0.000e+00 (완전 일치) |
| valid 종목 수 | 10 vs 10 (일치) |
| 다리 크기 | 스크립트 3/3 vs 배포 2/2 — 불일치 |
원인: n 을 세는 시점이 다르다.
· (54) 스크립트: n = valid.sum() 을 점수 유무 반영 전에 센다
· 배포 모듈: 점수가 있는 종목만 센다
⇒ 밴드 k_out = round(n·(q+b)) 이 갈리고 유지/청산 판단이 달라진다.
배포 모듈 쪽이 옳다 — 점수 없는 종목은 줄을 못 세운다. 그러면 규칙은 하나다: 배포할 코드로 검정한다. (54) 의 92% 는 배포 안 될 코드에 대한 숫자였다.
(59) 배포 모듈로 재검정 — 같은 50 분할
| 설정 | net 중앙 | net>0 | gross 중앙 | gross>0 |
|---|---|---|---|---|
| OLD h7·b0·taker | −0.08 | 42.0% | 0.31 | 76.0% |
| NEW h21·b0.20·maker | 0.73 | 92.0% | 0.80 | 94.0% |
42.0% → 92.0%. 스크립트 구현과 소수점까지 같았다 — 개별 리밸런스의 다리 크기 차이가 50 분할 통계에는 영향을 주지 않았다. 그래도 이제 이 숫자는 실제로 배포될 코드의 것이다.
배포 반영 내역
| 트랙 | 바뀐 것 | 근거 |
|---|---|---|
| T3 | hold 7→21 · buffer 0.20 신설 · fill_factor 0.4 | (51)~(59) |
| T4 | 비용 회계: 익절 7bp(지정가) / 손절 10bp(스톱) | (57) |
· T3 target_weights 에 w_prev 인자 추가(버퍼). w_prev=None 이면 구 규약 — 검정 재현용
· T4 resolve() 가 gross > 0 로 익절/손절을 갈라 비용을 다르게 문다
· ★두 트랙의 전방 기록은 리셋된다. 새 사전등록으로 다시 시작한다
· 테스트 추가: 버퍼 유지/청산 불변식 2종 · 익절·손절 비용 비대칭 3종
(60)(61) T2 에 T3 프로토콜 적용 — ★같은 약이 독이었다
T2 와 T3 는 구조가 완전히 같다(달러중립 롱숏 · 상하위 20% · 7일). 점수만 다르다. T3 를 살린 것이 보유 연장 + 버퍼 + 지정가였으니 T2 에도 대봤다. 결과는 정반대다.
진단 — 무작위 절반 분할 M=50 (T3 와 동일 분할·동일 관문)
| T3 | T2 | |
|---|---|---|
| 현 배포 net>0 | 42.0% | 68.0% |
| gross>0 (천장) | 76.0% | 74.0% |
| gross − net 격차 | 34%p | 6%p |
| 다리 유지율 | 90% | 63% |
| 상위3 기여 | 30% | 29% |
★T2 는 비용이 주범이 아니다. 격차가 6%p 뿐이다.
레버 격자 24칸 — T3 의 약이 T2 에는 독
| 설정 | net>0 | gross>0 | 다리 |
|---|---|---|---|
| h7 · b0 · maker | 72.0% | 74.0% | 4.6 |
| h7 · b0 · taker (현 배포) | 68.0% | 74.0% | 4.6 |
| h7 · b0.10 · maker | 64.0% | 68.0% | 5.5 |
| h7 · b0.20 · maker | 56.0% | 58.0% | 6.0 |
| h21 · b0 · maker | 46.0% | 48.0% | 4.6 |
| h14 · b0 · taker | 44.0% | 48.0% | 4.6 |
버퍼를 키울수록·오래 들수록 나빠진다. gross 까지 74→68→58% 로 떨어진다 — 비용 얘기가 아니라 신호가 상한다는 뜻이다.
★기제: 모멘텀은 빨리 썩는다. 30일 형성 신호는 7일이면 소진되고 21일이면 반전 구간이다. 비유동성은 천천히 변해(유지율 90%) 오래 들수록 더 걷혔지만, 모멘텀 순위는 빨리 바뀐다(63%). 같은 구조라도 신호의 반감기가 다르면 정반대 처방이 필요하다.
(61) maker 개선은 실재하나 작다
같은 50 분할 짝지어 검정: 50/50 전 분할에서 개선(비용만 줄이므로 당연) · 평균 차이 +0.032 Sharpe · 부호검정 p 1.78e-15. 그런데 net>0 이 68%→72% 인 실체는 부호가 뒤집힌 분할 2개다.
⇒ T2 는 배포값을 바꾸지 않는 것을 권한다: · 이득이 +0.032 Sharpe 로 경제적으로 무의미하다 · 7일 보유 · 빨리 썩는 신호라 미체결 비용이 T3 보다 훨씬 크다 — 못 채우면 3bp 아끼려다 움직임 전체를 놓친다 · 천장(gross 74%)이 낮아 비용 축에서 더 얻을 게 없다
★내가 틀렸던 것
㊿ 에서 나는 T2 를 "한쪽 ~0(−0.01/+0.30) · 가장 약한 트랙"이라고 적었다. 그건 분할 2개를 보고 한 말이었다. 50 분할로 재보니 68% 다. T3 에 대해 "표본 2개로는 못 판단한다"고 써 놓고 T2 에는 안 지켰다.
(70)(71) 채널 평균회귀 — ★캐시가 틀렸다. 라이브가 옳았다
사용자 지시로 채널 계열을 살릴 방안을 찾는 중, 검정 캐시 자체가 오염된 것을 발견했다.
(70) 레짐 조건 검정 — 감사가 막았다
외부 탐색이 정확한 가설을 줬다: · [SSRN 5775962] BTC/USDT 4H 2023~25 — 볼린저 평균회귀는 레인징(ADX<20) 수익요인 1.62 / 추세(ADX>30) −0.74. "레짐 감지가 생사를 가르는 유일한 요인" · ATR 필터(ATR > 1.5×20기평균 시 중단)가 최대 손실의 72% 를 막았다 · 실패 기제: "평균이 움직이면 오늘의 과매수가 내일의 정상이 된다" — ③-c 가 잰 것이 이것이다
그런데 no_lookahead 는 통과했는데 크기 상한이 막았다: 거래 R 의 |max| 36.22.
· 손절거리 최소 0.0266% → R = net_ret/stop_frac 이라 폭발
· |R|>3 인 12.85% 의 거래가 총 R 의 89.1% 를 차지
· 평균 R +0.72 는 꼬리가 만든 착시였다
⇒ 막힌 채로 판정하지 않았다. 레짐 결과는 무효다.
(71) 모순 규명 — 캐시 vs 라이브
같은 기간(2026-06~)에서 캐시 승률 52.7% vs 라이브 33.1%. 8년 내내 캐시는 52~55% 로 일정하다 — 시간 감쇠가 아니라 다른 물건이다.
라이브 실제 청산 118건을 받아 대조했다:
| 요인 | 백테스트(캐시) | 라이브 실측 |
|---|---|---|
| 승률 | 53.9% | 33.1% |
| 승 평균 R | +2.320 | +1.021 |
| 손절 R | 정확히 −1.000 | −1.614 (−1.5 이하 39.6% · 최악 −4.05) |
| 기대 R | +0.722 | −0.507 |
★분해가 결정적이다: 승률만 라이브 값으로 바꾸면 기대 R 이 정확히 0.000 이 된다. 승률 차이가 모순의 전부다.
승률이 왜 다른가 — 라이브 청산 사유 분해:
· stop 48건 평균 −1.614R ← 백테스트는 −1.000 고정
· horizon 43건(36.4%) 평균 −0.243R ← 채널 종료 MTM 청산
· target 27건 평균 +1.039R ← 백테스트는 목표를 2.5R 로 가정
· 진입=청산이 같은 시각인 거래 21.2%(25건) — 진입한 봉에서 바로 나간다
⇒ 세 개의 독립 결함
- 목표 R 불일치 — 백테스트 2.5R vs 라이브 1.04R
- 손절이 −1R 이 아니다 — 갭 체결로 −1.6R, 최악 −4.05R
- horizon 청산 36% — 백테스트는 MTM 으로 넘긴다
캐시 +0.722R 은 낙관 가정의 산물이고 라이브 −0.507R 이 실측이다. 그리고 시장이 나빠져서가 아니다 — 백테스트가 처음부터 틀렸다.
재생성 규약 (다음 단계)
- 손절은 실제 체결가로(−1R 고정 금지)
- 목표는 라이브가 실제로 쓰는 값으로(2.5R 가정 제거)
- horizon 청산을 백테스트에도 반영
- ★교란 검사(
no_lookahead)를 채널 시뮬 전체에 건다 ★검수 기준: 재생성 후 기대 R 이 라이브 −0.507R 근처로 나와야 정합이다.
(74)~(76) 채널 손절거리 스윕 — ★레버는 찾았으나 정합은 못 맞췄다
(74) 갭은 문제가 아니었다
라이브 손절 48건에서 갭을 실측: 중앙 0.1219% — 작다. 백테스트 손절거리 중앙 1.223% vs 라이브 0.313% — 4배 차이. 넓은 손절에서는 갭 페널티가 0.10R 뿐이다. ⇒ 갭이 아니라 손절거리가 문제다.
(75) 손절거리 폭 — 위약은 통과
손절거리가 넓을수록 승률이 오른다: 48.3 → 51.3 → 53.3 → 55.3 → 55.9%. 기제: 좁은 손절은 잡음에 먼저 맞는다. 채널 회귀는 되돌아오기까지 시간이 걸린다.
| 하한(선택분위) | 선택 R | 시험 R | 시험 승률 |
|---|---|---|---|
| 0% (0.027%) | +0.428 | +0.504 | 47.6% |
| 25% (0.822%) | +0.524 | +0.592 | 51.0% |
| 50% (1.285%) | +0.551 | +0.575 | 52.4% |
| 75% (2.056%) | +0.539 | +0.533 | 55.0% |
| 90% (3.235%) | +0.518 | +0.320 | 54.8% |
선택 구간이 고른 q50 · 시험 R +0.575 · 위약 3000회 대비 100%분위 · 감사 클린.
★(76) 그러나 검수 기준은 미달 — 정직하게 적는다
조건 없음도 +0.504다. 손절거리 필터의 기여는 +0.071 뿐이고, 그보다 큰 문제는 백테스트 +0.504 vs 라이브 −0.507 의 1.01R 격차가 그대로라는 것이다.
남은 결함은 (73) 에서 확정한 목표 R 이다(백테스트 2.3 vs 라이브 0.93). 승리에 목표 상한을 씌워보면:
| 목표 상한 | 기대 R |
|---|---|
| 2.30R (백테스트) | +0.326 |
| 1.50R | +0.138 |
| 1.02R (라이브) | −0.027 |
| 0.93R | −0.063 |
★라이브 목표 R 을 그대로 쓰면 기대값이 0 근처다.
그리고 그것도 낙관이다 — 목표 상한은 승리만 자르고 손실은 안 자른다. 실제 라이브는 목표 0.93R 인데 승률이 33% 다. 가까운 목표인데도 못 닿는다는 뜻이고, 그건 채널이 라이브에서 훨씬 빨리 끝난다(horizon 36.4% · 평균 −0.243R)로만 설명된다. 백테스트는 horizon 을 MTM 으로 넘기고 그 R 이 양(+)일 수 있다.
현재 지위 — 폐기 아님, 미해결 1건 남음
· ★찾은 것: 손절거리가 레버다(넓을수록 승률↑, 위약 대비 100%분위) · ★못 맞춘 것: 목표 R·horizon 규약. 이걸 라이브와 맞추면 기대값이 0 근처로 내려간다 · 다음 후보: horizon 청산 규약을 백테스트에 정직하게 반영한 뒤 손절거리 레버를 다시 건다. 그때도 0 근처면 "이 신호로는 못 넘는다" 가 숫자로 확정된다
(77)(78) ★★채널 평균회귀가 살아났다 — 8년간 문헌이 안 쓰는 목표로 검정하고 있었다
사용자 지시: "네가 버린 전략들을 다른 사람들은 잘만 쓴다. 오픈소스 전수조사하고 처음부터 다시." → 조사가 첫 줄에서 답을 줬다.
전수조사가 지목한 것 — 청산 목표
평균회귀의 표준 청산은 중앙선(평균) 이다: · "buys when price touches the lower band and sells at the middle or upper band" · [SSRN 5775962] 레인징 수익요인 1.62 / 추세 −0.74 · [nkaz001/hftbacktest] 지정가·큐 위치·레이턴시까지가 현실 기준 · [Jesse] "zero look-ahead bias" 를 최우선 설계 목표로
★우리는 먼 레일(구조 A)로만 8년치를 검정했다. 코드에 구조 B(중앙선)가 있었는데 한 번도 안 썼다.
(77) 세 구조 동시 비교 — 라이브 승 R(+1.021) 과의 차이
| 구조 | 승률 | 승 R | 라이브와의 차이 |
|---|---|---|---|
| A 먼 레일(우리가 쓴 것) | 48.3% | +2.319 | +1.298 ← 2배 넘게 어긋남 |
| ★B 중앙선(문헌 표준) | 56.6% | +1.157 | +0.136 ← 거의 일치 |
| C 반익절+본전 | 56.2% | +1.319 | +0.298 |
구조 B 가 라이브를 재현한다. 검정을 여기서 다시 시작했다.
(78) 구조 B + 손절거리 폭 — ★통과
| 하한(선택분위) | 선택 R | 시험 R | 시험 승률 | 승 R |
|---|---|---|---|---|
| 0% (0.027%) | +0.170 | +0.218 | 55.8% | +1.272 |
| 25% (0.822%) | +0.292 | +0.363 | 60.9% | +1.181 |
| 50% (1.285%) | +0.338 | +0.399 | 64.6% | +1.093 |
| 75% (2.056%) | +0.350 | +0.373 | 67.3% | +0.955 |
선택 구간이 고른 q75 · 시험 기대 R +0.373 · 승률 67.3% · 거래 1,741 · 위약 3000회 대비 100%분위 · ★라이브 정합 관문 통과 — 승 R +0.955 vs 라이브 +1.021 · 차이 −0.066(허용 ±0.30) · 조건 없음 +0.218 → 조건 적용 +0.373 (개선 +0.155) · 감사 전 항목 통과
⇒ 무엇이 잘못이었나
신호가 아니라 검정이 틀렸다. 세 가지가 겹쳐 있었다:
- 목표선(72) — 도달 판정은 움직이는 선, R 계산은 진입 시점 선
- 청산 구조(77) — 문헌이 쓰지 않는 먼 레일로 8년치를 쟀다
- 손절거리(74·78) — 좁은 손절이 잡음에 먼저 맞는다
셋을 다 고치니 라이브와 정합하고 위약을 넘는다. ★"이 전략은 못 쓴다"가 아니라 "이 검정이 틀렸다" 였다.
(79)(80) 계좌 시뮬 — ★"돈으로 얼마" 는 아직 못 낸다. 정합이 안 맞는다
(78) 이 구조 B 의 거래 단위 정합을 통과시켰기에 계좌로 넘어갔는데, 거기서 다시 갈렸다.
(79) 계좌 시뮬 — 숫자가 물리적으로 이상하다
초기 $1,000 · 최대 8포지션 · 노출 80% · 건당 1% 위험(기존 규약 그대로):
| 구조 | 구간 | 체결 | 배수 | MDD | 버킷 |
|---|---|---|---|---|---|
| A 먼 레일 | 선택(2019~23) | 3,780 | 806.9 | 6.5% | 29/30 |
| A 먼 레일 | 시험(2024-01~) | 1,716 | 13.9 | 5.5% | 14/14 |
| B 중앙선 | 선택 | 3,780 | 111.3 | 7.8% | 28/30 |
| B 중앙선 | 시험 | 1,716 | 6.6 | 7.4% | 14/14 |
★배수 806 은 불가능하다. 5년에 80,590% 다. 시험 13.9배(2.5년)도 마찬가지다. 그리고 감사가 "구조 B 가 A 보다 낫다" 관문에서 막았는데, 그 관문 자체가 내 실수다 — A 는 라이브 정합을 못 하는 물건이라 배수 비교의 대상이 아니다.
★(80) 같은 기간 직접 대조 — 여기서 진짜가 드러났다
라이브 가동 구간(2026-06~)만 잘라 같은 계좌 규약으로:
| 설정 | 후보 | 체결 | 배수 | 총손익 |
|---|---|---|---|---|
| A 먼레일·하한없음 | 422 | 358 | 1.184 | +$184 |
| B 중앙선·하한없음 | 422 | 358 | 1.132 | +$132 |
| B 중앙선·하한2.056% | 47 | 41 | 1.040 | +$40 |
| 라이브 실측 | — | 118 | 0.978 | −$22 |
★캐시 승률 56.4%(B) vs 라이브 33.1% — 여전히 23%p 차이.
⇒ 정직한 현재 지위
· (78) 이 통과시킨 것은 승 R 정합 하나다(+0.955 vs +1.021). 그건 진짜 개선이다 · 그러나 승률이 여전히 23%p 갈린다. 승 R 이 맞아도 승률이 다르면 계좌 결과가 다르다 · ⇒ "돈으로 얼마" 는 아직 못 낸다. 배수 6.6 도 13.9 도 못 믿는다 · 남은 미해결: 왜 캐시는 56% 이기고 라이브는 33% 인가 후보 — (a) 라이브 진입 필터(LVN·fill_valid)가 다른 거래를 잡는다 (b) 라이브가 포지션·노출 상한에 더 자주 걸린다 (c) ★캐시 신호 자체가 라이브가 본 신호와 다르다 (c) 라면 채널 감지(detect_sm) 자체를 라이브와 대조해야 한다 — 그게 다음 작업이다
★폐기가 아니다. 구조 B 로 승 R 이 맞았고, 남은 것은 승률 한 축이다. 그러나 맞기 전에는 금액을 말하지 않는다.
4. 규칙 (재검토에서 배운 것)
-
배포할 코드로 검정한다 — 검정 규칙과 라이브 규칙이 갈리면 그건 다른 전략이다(자카드 28.2% 사례)
-
소표본의 "유망"을 믿지 않는다 — 채널 +0.659R → 사망, 돌파 OOS 2/4 → 0/4
-
예측을 먼저 적는다 — 폭 조건 일반성 검사가 그래서 의미가 있었다
-
부분 통과를 통과라 쓰지 않는다
-
물리적으로 불가능한 숫자는 버그다 — +87.88R 이 손절하한 누락을 잡았다
-
같은 이름 ≠ 같은 전략 — 횡단면 모멘텀을 롱온리·200봉으로 시험하고 "엣지 없음"이라 적었다
-
위약은 구성·비용·회전율까지 맞춰야 한다 — 안 맞으면 회전율 차이를 신호로 착각한다. 그래서 gross/net 분해를 항상 함께 낸다
-
★기각 전에 검정력을 먼저 잰다 — "유의하지 않다"는 "엣지가 없다"가 아니다. 우리 표본에서 z≥2 는 연 41% 를 요구했고 진짜 +20% 엣지의 검정력은 14% 였다(§0.1)
-
★모든 새 통계 절차 앞에 영점 조정 — 무엣지 계열을 '전략' 자리에 넣어 P 평균 0.5 확인. 실제로 이 검사가 "위약 풀 평균" 방식을 잡아냈다(평균 P 0.676 → 폐기)
-
★배포 전에 엔진을 재생해 검정과 대조한다 — 이 검사 하나가 배포 직전 버그 2개를 잡았고, 둘 다 배포했으면 조용히 거래를 안 하는 상태가 됐을 것이다
-
★검정의 계산 단위 = 배포의 계산 단위인지 확인한다 — ⑫는 모든 돌파봉을, 엔진은 종목당 1포지션을 센다. 달라도 되지만 그러면 배포 형태 그대로 다시 검정해야 한다(⑭)
-
★영점 통과 ≠ 귀무분포가 옳다 — 영점은 위약 vs 위약만 본다. 양쪽이 똑같이 틀린 구조를 가지면 통과한다. 귀무는 전략의 시간 군집·기하까지 닮아야 한다(⑰·⑱: 폭 1.87배 차이, 기하까지 맞추자 전방 분할 판정이 0.685 → 0.990 으로 뒤집혔다)
-
★추정기가 서로 다른 답을 주면 그게 단서다 — 부트스트랩 z 2.53 vs 치환 z 9.23 의 불일치가 귀무분포 결함을 잡아냈다. 유리한 쪽을 고르지 말고 왜 갈리는지를 판다
-
★추정기를 바꾸면 이미 판정한 것에 전부 소급 적용한다 — 안 하면 유리한 것만 옛 방식으로 남기는 체리피킹이다
-
★포트폴리오를 비교할 땐 위험을 먼저 맞춘다 — 무상관 계열을 섞으면 변동성이 √2 로 준다. 그대로 비교하면 "분산 효과"와 "그냥 위험을 줄인 것"을 못 가린다. ⑲에서 이 보정만으로 결론이 개선 → 악화로 뒤집혔다
-
★질문이 바뀌면 귀무도 바꾼다 — "엣지가 있는가"의 귀무는 위약(엣지 없음)이지만 "엣지가 줄고 있는가"의 귀무는 엣지 일정이다. 후자엔 시간 라벨 셔플을 쓴다(㉑)
-
★무엇을 빼고 보느냐가 결론을 바꾼다 — ⑭의 원R 은 단조 하락, ㉑의 초과분은 평평. 시장 기여를 안 빼면 시장 얘기를 전략 얘기로 착각한다
-
★최악 1개는 n=1 통계다 — 최악 버킷만 보고 조합을 고르지 않는다. 하위 3개 평균처럼 표본을 늘린 지표를 함께 본다
-
★셔플 위약은 회전율을 보존하지 않는다 — 점수를 섞으면 순위가 매번 뒤집혀 위약의 회전이 폭증한다(실측 실제 6.5 vs 위약 83.5 = 12.8배). 느린 신호 + 큰 비용에서는 z 가 엣지가 아니라 회전율을 잰다. 신호 판정은 gross 로, 비용 감내는 별도 스트레스로 — 한 숫자로 둘을 묻지 않는다(㊴-b/c)
-
★★"양을 늘리면 정보가 는다"는 네 번 다 틀렸다 — 지표(㉒ 분산팽창 12배) · TF(㉘) · 수익원(㊲ σ만 줄고 평균 그대로) · 종목(㊴ 거래 1.80배인데 유효 독립 0.94배, 팽창 12.0→22.8). 병목은 양이 아니라 IC(신호의 질)다. 양을 늘리는 방향의 탐색은 이미 네 번 닫혔다 — 다시 열지 않는다
-
★파생 계열을 합칠 땐 달력이 겹치는지부터 본다 — base 를 안 넘겨받아 T4 가 50년 전에 꽂혔고 표는 멀쩡해 보였다. 트랙별 시작·종료일을 먼저 찍어보면 즉시 잡혔을 것이다
-
★분산 0 은 무위험이 아니라 미거래다 — 역분산·HRP 는 아직 시작 안 한 계열에 전 비중을 준다. 비교는 공통 생존 구간에서
-
★도구는 병이 있을 때만 듣는다 — HRP 는 공분산 악조건(마코위츠의 저주)의 약이다. 우리 조건수는 1.36 이라 그 병이 없었고, 무상관·유사 Sharpe 에선 동일비중이 이론적 최적이다. 이론을 적용하기 전에 적용 조건을 먼저 잰다
-
★관측 단위를 바꾸면 t 가 15배 달라진다 — 베팅 단위(균일성 유효 456)와 달력일 단위(2,405)가 같은 대상에 t 0.39 vs 5.96 을 준다. 유리한 쪽을 고르지 말고 못 가렸다고 적는다
-
★중첩된 단조 계열에 PBO 를 쓰면 항상 0 이다 — IS 최적이 구조적으로 OOS 최적이다. PBO 의 전략 축은 서로 겹치지 않는 후보여야 의미가 있다
-
★★"실패" 를 보고했으면 그것이 이론의 실패인지 내 실패인지 끝까지 가른다 — ㊼ 의 DSR 실패는 단위 365배 오류였다. 지표가 정확히 0.0000 이나 1.0000 으로 붙으면 포화이고, 포화는 거의 항상 단위·부호·스케일 버그다. 극단값은 결론이 아니라 증상이다
-
★중첩 부분집합을 독립 시행으로 세지 않는다 — q=1%~50% 는 한 모델의 부분집합이다. 그 SR 분산은 확신이 정보를 나른다는 결과이지 탐색의 폭이 아니다. DSR·PBO 의 시행 축은 서로 겹치지 않는 후보라야 한다
-
★★균일성(uniqueness)은 횡단면 폭을 중복으로 센다 — AFML ch.4 는 같은 종목의 겹치는 라벨이 같은 수익 경로를 공유하는 것을 센다. 50종목을 풀링하면 breadth 까지 벌점이 되고, 그린올드 기본법칙에서 breadth 는 도움이다. 실측 N_eff 913 vs 균일성 456 = 2배 과보수. ★㊺ 계열이 유효표본으로 내린 기각들은 이 배율만큼 과했다
-
★블록 부호반전의 귀무가 L 에 따라 넓어지는 것은 의존성이 아닐 수 있다 — 신호가 크면 |블록합| 이 커져 iid 라도 넓어진다(평균 누출). 중심화해서 다시 재면 의존성만 남는다. 예측식 √((Lμ²+σ²)/(μ²+σ²)) 와 맞으면 그 증가는 버려도 된다
-
★영점 조정은 절대값이 아니라 몬테카를로 오차로 판정한다 — 귀무 t 평균 −0.326 을 "편향" 이라 적었지만 MC오차가 0.183 이라 1.8σ, 잡음이었다. 기준을 |mean|/(std/√B) 로 둔다
-
★★보정계수는 판정하려는 계열 자신에게서 잰다 — ㊽ 은 gross 로 재서 net 에 적용했다. 비용항이 극단적으로 자기상관(VR L=320 에서 33.0)이라 gross VR 3.28 vs net VR 1.56. N_eff 가 913 vs 1,537 로 갈렸다. 무엇을 빼고 재느냐가 유효표본을 바꾼다
-
★★"유보" 는 결론이 아니다 — 폐기할지 쓸지 못 정하면 그건 미룬 것이다. 유보 4개를 전부 닫았더니 배포 설정이 탈락했다. 안 닫았으면 그대로 돌아갔을 것이다
-
★★신호가 살아도 임계가 죽을 수 있다 — 홀드아웃 gross SR 3.42·4.62 인데 q=20% 의 net 은 음(−)이었다. 건당 엣지는 확신에 비례하고 비용은 건당 고정이라, 넓은 계층일수록 비용이 먼저 이긴다. 손익분기 비용을 배수로 보고하라 — 1.43배는 여유가 아니다
-
★진짜 홀드아웃은 두 축을 동시에 끊는다 — 종목만 끊으면 같은 시각의 시장 요인이, 시간만 끊으면 같은 종목의 특성이 샌다. 종목 × 시간 이중 분리라야 한다
-
★PBO 가 0 이어도 "강한 통과" 가 아닐 수 있다 — 한 후보가 전 구간 우세하면 선택이 안 뒤집혀 0 이 된다. PBO 가 잡는 것은 선택의 뒤집힘이지 성과의 실재가 아니다
-
★★감사가 막으면 판정하지 않는다 — 1차 판에서 나는 막힌 채로 판정을 찍었다. 그게 이 도구를 무력화하는 가장 빠른 길이다. 그리고 한도를 올려 통과시키지 않는다 —
|max| 0.5092를 파보니 TRX +95.8% 라는 진짜 사건이었고, 문제는 한도가 아니라 감사 범위였다 -
★감사 대상 = 판정 대상 — 이미 제외한 설정까지 감사하면 엉뚱한 이유로 막힌다
-
★★"인샘플 통과"는 이중분리 통과가 아니다 — T2·T3 는 인샘플 P 0.965·0.980 이었는데 종목×시간 이중분리에서 T3 는 부호가 뒤집혔다(+0.38 / −0.41). 순위가 완전히 재배열됐다
-
★부호 뒤집힘은 검정력 문제가 아니다 — 크기가 작은 것은 표본이 모자란 것이지만, 종목 집합을 바꿨을 때 방향이 갈리는 것은 일반화 실패다. 둘을 같이 취급하지 않는다
-
★★"못 쓴다"로 끝내지 않는다 — 원인을 특정하면 대개 고칠 곳이 나온다 — T3 는 "부호 뒤집힘 = 일반화 실패"로 접을 뻔했다. 가설 4개를 재보니 gross 는 양방향 양(+) 이었고 병목은 비용이었다. net>0 42% → 92%
-
★★병목은 신호가 아니라 비용이다 — T3(gross 76% vs net 42%) · T4 q20 사망 · MNQ 14종 전부 미달 · 메타오더플로우 0.42bp vs 비용 8bp. 전부 같은 병이다. 새 알파를 찾기 전에 비용 구조부터 본다
-
★낙관 가정은 스스로 잡는다 — "청산 전부 maker" 로 여유 2.31배를 냈다가 손절이 스톱(taker)이라는 걸 빠뜨린 걸 발견했다. 정정하니 1.99배. 절반 이하로 준다
-
★물리적 상한은 추측하지 말고 유도한다 — "하루 4건 × 1R = 5" 로 선언했다가 막혔는데, 파보니 건당 |R| 은 정확히 1.00 이고 하루 35R 은 청산이 몰린 날이었다(2024-08-05 176건). 상한 = 하루 최대 청산건수 × 1.2R
-
★결과가 너무 좋으면 대조군부터 만든다 — 버퍼가 gross 를 76%→94% 로 올렸을 때 "버퍼는 비용만 줄여야 하는데?" 를 물었고, 다리 크기를 맞춘 대조군으로 분산 효과를 걷어냈다. 안 물었으면 분산 효과를 엣지로 보고했을 것이다
-
★★배포 전 정합 검사는 통과를 확인하는 절차가 아니라 불일치를 찾는 절차다 — (58) 은 점수가 완전히 일치하는데도 다리 크기가 갈리는 것을 잡았다. 원인은
n을 세는 시점 하나였다. 이런 건 성과표를 아무리 봐도 안 보인다 -
★"배포할 코드로 검정한다"는 검정을 배포 모듈로 다시 돌리라는 뜻이다 — 스크립트로 낸 92% 는 배포 안 될 코드의 숫자였다. 다행히 재검정도 92% 였지만, 다행이었을 뿐이고 다음에도 그러리라는 보장은 없다
-
★★같은 구조라도 신호의 반감기가 다르면 정반대 처방이 필요하다 — T3(비유동성)는 보유 연장+버퍼로 42→92% 가 됐는데, T2(모멘텀)는 같은 처방으로 68→56% 가 됐다. 유지율이 90% vs 63% 다. 처방을 옮기기 전에 반감기부터 잰다
-
★★한 트랙에 적용한 판정 기준은 모든 트랙에 적용한다 — T3 에 "분할 2개는 표본 2개다" 라고 써 놓고 T2 는 2개로 판정해 "가장 약하다"고 적었다. 50 분할로 보니 68% 였다
-
★"전 분할에서 개선"이 곧 의미 있는 개선은 아니다 — maker 는 50/50 에서 이겼지만 평균 +0.032 Sharpe 이고 부호가 뒤집힌 분할은 2개뿐이다. p 값이 아니라 크기와 실행 리스크로 판단한다
-
★★백테스트와 라이브가 갈리면 라이브가 옳다 — 캐시 +0.722R vs 라이브 −0.507R. 8년 내내 캐시가 52~55% 로 일정했으니 시장 탓이 아니다. 백테스트가 처음부터 틀렸다. 손절을 −1R 고정으로 가정하면 갭 체결(−1.6R·최악 −4.05R)을 통째로 못 본다
-
★"승률만 바꾸면 0 이 된다" 같은 분해를 먼저 한다 — 어느 요인이 차이의 전부인지 숫자로 갈라야 고칠 곳이 정해진다. 세 요인을 뭉뚱그리면 아무것도 못 고친다
-
★꼬리가 평균을 만들면 그 평균은 성과가 아니다 — |R|>3 인 12.85% 가 총 R 의 89.1%. 중앙값과 평균이 갈리면 중앙값 쪽이 실제로 겪는 것이다
-
★★"위약 통과" 와 "라이브 정합" 은 다른 관문이다 — (75) 는 위약 대비 100%분위였지만 백테스트 +0.504 vs 라이브 −0.507 의 격차가 그대로였다. 위약은 신호가 무작위가 아님만 말하고, 정합은 그 신호를 실제로 그 값에 체결할 수 있음을 말한다. 둘 다 필요하다
-
★개선폭을 조건 없는 기준선과 비교한다 — 손절거리 필터가 +0.575 를 냈지만 조건 없음이 +0.504 였다. 기여는 +0.071 이다. 절대값만 보면 레버를 과대평가한다
-
★★문헌·오픈소스가 실제로 어떻게 구현하는지 먼저 본다 — 우리는 평균회귀를 먼 레일 청산으로 8년치를 검정했다. 표준은 중앙선 청산이고, 코드에 그 구조가 있었는데 한 번도 안 썼다. 그 하나를 바꾸니 승률 48.3→56.6%, 승 R 이 라이브와 정합했다
-
★★"라이브 정합"을 관문에 넣는다 — 백테스트가 위약을 넘어도 라이브와 승 R 이 2배 어긋나면 딴 물건을 재고 있는 것이다. (78) 은 승 R 차이 ±0.30 을 관문에 넣었고 구조 A 는 그 관문에서 걸렸을 것이다(차이 +1.298)
-
★전략을 버리기 전에 "내가 이 전략을 문헌대로 구현했나"를 먼저 묻는다 — 버린 줄 알았던 것이 잘못 구현한 것이었다
-
★★거래 단위 정합과 계좌 정합은 다른 관문이다 — (78) 은 승 R 정합을 통과했지만 계좌로 가니 승률이 23%p 갈렸다. 승 R 이 맞아도 승률이 다르면 계좌 결과가 다르다. 금액을 말하기 전에 둘 다 맞춰야 한다
-
★계좌 배수가 세 자리면 그건 성과가 아니라 증상이다 — 806배·13.9배가 나왔다. 복리 × 수천 거래는 무엇이든 폭발시킨다. 같은 기간 라이브와 직접 대조해야 보인다
-
★내가 건 관문이 틀릴 수 있다 — "구조 B 가 A 보다 낫다"로 막았는데, A 는 애초에 라이브 정합을 못 하는 물건이라 비교 대상이 아니었다. 관문도 사전선언 대상이고, 틀렸으면 틀렸다고 적고 바꾼다