정정 — 어제 일지의 숫자가 다른 베이스라인 위에 있었다
어제 발표한 V4.3.1 백테 일지에 데이터 출처 오류가 있었습니다. 'V4.3.1 7일 +$0.601'이라고 적힌 숫자는 실제로는 V4.4 (ADX 필터가 이미 적용된) 결과였습니다. Build in Public이 의미하는 게 이런 정정도 함께 공개하는 것이라 생각해서 적습니다.
무엇이 잘못됐는가
어제 일지에서 V4.3.1 7일 백테 결과를 "108건 거래, WR 64.8%, PnL +$0.601, PF 1.20"으로 적었습니다. 이 숫자는 실제로는 V4.4 (ADX 25+ 필터 적용된 버전) 의 결과였습니다.
원인: 백테 엔진 (BACKTEST_V4_3.py)에 ADX_MIN = 25 조건이 이미 들어가 있었습니다. 우리는 그 위에서 V4.3.1이라는 이름표를 달고 결과를 받았습니다. ADX 필터에 의해 51건이 진입 차단된 상태로 108건만 남은 것을 "V4.3.1의 자연스러운 결과"로 해석했습니다.
진짜 V4.3.1 (ADX 필터 OFF)
| 윈도우 | 거래 수 | WR | Net PnL | PF |
|---|---|---|---|---|
| 7일 | 159 | 61.0% | +$0.785 | 1.18 |
| 30일 | 416 | 41.8% | -$3.626 | 0.65 |
V4.4 (ADX 필터 ON, 어제 V4.3.1로 잘못 부른 숫자)
| 윈도우 | 거래 수 | WR | Net PnL | PF |
|---|---|---|---|---|
| 7일 | 108 | 64.8% | +$0.601 | 1.20 |
| 30일 | 239 | 46.4% | -$1.649 | 0.74 |
무엇이 영향을 받는가
어제 일지의 결론들은 ADX 필터가 이미 적용된 데이터 위에서 내려진 것이었습니다. 즉:
-
"7일 +$0.601 vs 30일 -$1.65" 비교 — 이건 ADX 적용된 V4.4의 양쪽 윈도우 비교였습니다. 진짜 V4.3.1은 7일 +$0.785 vs 30일 -$3.626. 7일에서 더 좋고 30일에서 더 나빴습니다.
-
"Trail 0.8% Sweet Spot" — Grid Search가 ADX 적용된 데이터로 실행됐습니다. 진짜 V4.3.1 (ADX off)에서 sweet spot이 정말 0.80%인지, 아니면 다른 값인지 다시 봐야 합니다.
-
"HYPER 제거 결정" — HYPER가 6개 백테에서 PnL -$0.145 한 자리도 안 변했다는 발견도 ADX-on 데이터 기반이었습니다. ADX 없이 보면 어떨지 재검증 필요.
-
"30일 학살, ORCA만 흑자" — 종목별 분석도 ADX 필터 거른 거래만 본 것. ADX 적용 안 된 진짜 V4.3.1 30일 종목별 분포가 다를 수 있습니다.
그래도 살아남는 결론들
전부 무효는 아닙니다. 다음 결론은 데이터 정정 후에도 유효합니다:
-
"한 번에 변수 1개" 원칙은 옳다 — V4.2 → V4.3 → V4.3.1 진행이 단일 변수씩이었기 때문에 이 데이터 오류를 발견할 수 있었습니다. 만약 V3.8.0처럼 9개 변수를 한꺼번에 바꿨다면 어디서 문제가 났는지 분리 불가능했을 것.
-
백테 윈도우는 7일 단독으로 결정 근거가 될 수 없다 — V4.3.1이든 V4.4든, 7일과 30일이 다른 그림을 그리고 있습니다. 표본 크기와 시장 regime 모두 영향.
-
종목별 PF가 Trail 파라미터보다 더 큰 결정 요인이다 — V4.4 30일에서도 ORCA만 +$0.236, KAT는 -$1.509. 어떤 Trail 값이든 KAT은 30일 손실 종목.
-
ADX 필터는 손실 55% 줄였다 (방어 효과 확실) — V4.3.1 30일 -$3.626 → V4.4 30일 -$1.649. 흑자 전환은 못 시켰지만 손실의 절반 이상을 차단. ADX는 필요 조건 (충분 조건 아님).
새로 발견한 것 — ADX 30+ 손실 40.9%
데이터 정정 작업 중에 추가로 발견했습니다.
KAT/AXS 30일 손실 거래 203건의 진입 시점 ADX 분포:
| ADX 구간 | 비율 | 의미 |
|---|---|---|
| ADX < 25 | 51.2% | 휩쏘 — ADX 25+ 필터로 차단됨 |
| ADX 25~30 | 7.9% | 경계 영역 |
| ADX 30+ | 40.9% | 추세 강한데 손실 |
ADX 25+ 필터로 차단되는 51.2%는 위안이 됩니다. 하지만 ADX 30+에서도 40.9%가 손실 입니다. 이게 의미하는 게 뭔가:
ADX는 추세 강도만 측정하고 추세 방향은 측정하지 않습니다. 강한 하락 추세에서도 ADX는 30+가 나옵니다. 우리 봇은 그 강한 하락 추세에 매수로 진입하고 있었던 것.
해결책은 표준 — DI+ vs DI- 비교. 진정한 모멘텀 진입 조건은:
- ADX > 25 (추세 강함)
- DI+ > DI- (상승 추세)
- 둘 다 만족
V4.4 (지금)는 1번만 체크하고 있었습니다. ADX 30+ 손실 40.9%의 정체는 "강한 하락추세에 매수 진입한 거래들". 이게 다음 PoC에서 정조준할 변수입니다.
다음 단계
-
진짜 V4.3.1 (ADX off) Grid Search 재실행 — 0.7~1.0% 7일 + 30일, HYPER 포함. 정정된 baseline 위에서 sweet spot/HYPER 결정 재검증.
-
V4.4.1 PoC — DI+ > DI- 방향성 단독 추가 — V4.4 베이스에 ADX 코드 한 부분만 보강. ADX 30+ 손실 40.9%가 V4.4.1에서 어떻게 변하는지 확인.
-
ORCA-only Paper Mode 100건 — V4.4 베이스로 즉시 가동. 백테-라이브 괴리 측정. 30일 ORCA +$0.236이 paper에서 비슷한 비율로 나오는지.
세 작업 모두 병렬 진행 중입니다. 결과는 다음 일지에서.
Build in Public이 의미하는 것
어제 일지에 잘못된 숫자를 적은 채로 두는 것도 한 옵션이었습니다. "V4.3.1 7일 +$0.601" 표기가 사실 V4.4 결과였다는 걸 조용히 다음 글에서 슬쩍 정정하는 것도 가능했습니다. 아무도 두 일지를 비교해서 "이상한데?"라고 잡아낼 가능성은 낮습니다.
하지만 그렇게 하면 일지 자체가 의미가 없어집니다. 빌드 인 퍼블릭의 핵심은 결정의 시점에 무엇을 알고 있었고, 나중에 무엇이 틀렸음을 알게 됐는지 같이 공개하는 것입니다. 정정 없는 빌드 인 퍼블릭은 그냥 "잘 된 부분만 보여주는 회고"입니다.
이 글이 그 정정입니다. 어제 일지의 결론 일부는 살아있고, 일부는 재검증이 필요합니다. 다음 PoC 결과로 어느 쪽인지 확인합니다.