[Lap 6] [모듈 5: Veto] 7대 Hard Veto 헌법과 즉시 기각 심판관

“연 50%의 대박 수익률을 기록한 백테스트 결과를 마주했을 때, 퀀트 아키텍트가 가져야 할 가장 정직한 반응은 환호가 아니라 ‘의심과 공포’입니다. 금융 시장에서 비정상적으로 아름다운 수익률 곡선의 99%는 뛰어난 알고리즘이 아니라, 데이터 누수나 과최적화가 만들어낸 통계적 신기루이기 때문입니다.”
지난 Lap 5에서 저는 24개 지표를 통해 알고리즘의 수익성뿐 아니라 팻 테일(Fat-Tail)과 왜도·첨도까지 입체적으로 채점하는 MetricsCalculator를 완성했습니다.
하지만 지표가 아무리 나쁘게 나와도, 사람이 직접 백테스트 결과를 열어보면 마음속에서 악마의 속삭임이 시작됩니다. “MDD가 좀 깊긴 하지만 2008년 한 번뿐이잖아?”, “샤프 지수가 0.7이지만 연수익률이 35%나 되는데 실전에 한번 돌려볼까?”
사람은 누구나 자신이 오랜 시간 공들여 만든 알고리즘을 감싸고 합리화하려 듭니다.
그래서 저는 사람의 감정과 타협을 완전히 배제하고, 7가지 치명적 결함 중 단 하나라도 검출되면 총점과 무관하게 알고리즘을 즉시 쓰레기통으로 보내버리는 자동 사형 집행관, HardVetoJudge(즉시 기각 심판관)를 구축했습니다.
이번 글에서는 백테스터의 본질을 ‘수익률 탐색기’에서 ‘가짜 알파 기각 엔진(Falsification Engine)’으로 탈바꿈시킨 7대 Hard Veto 헌법과, T+2 실행 지연 스트레스 테스트를 통과시키는 TDD 구현기를 공유합니다.


1. 프롤로그: “내가 만든 전략”이라는 최악의 인지 편향

퀀트 시스템을 개발하면서 제가 겪은 가장 뼈아픈 실수는 시장의 급락이 아니라 ‘내 코드에 대한 애착’이었습니다.

주말 내내 머리를 싸매고 수식과 피처를 조합해 만든 전략이 백테스트에서 마이너스를 내거나 위기 구간에서 무너지면, 뇌는 즉시 자기합리화 회로를 돌립니다:

  • “2020년 3월 코로나는 100년에 한 번 올까 말까 한 블랙 스완이었으니, 저 구간만 빼고 평가하자.”
  • “슬리피지 15bps는 너무 가혹해. 실전에서는 지정가로 잘 체결될 거야.”
  • “이동평균 기간을 20일에서 23일로 바꾸니까 샤프가 1.8로 뛰네? 이걸로 확정하자.”

이런 미세한 타협과 자기기만이 누적되는 순간, 백테스트는 과학적 검증이 아니라 과거 데이터에 끼워 맞춘 사기극(P-Hacking)으로 변질됩니다. 그리고 그 대가는 실전 계좌의 잔인한 반토막으로 돌아옵니다.

수익률을 쥐어짜는 백테스터는 위험합니다.

진짜 백테스터의 제1사명은 돈을 버는 전략을 찾는 것이 아니라, 실전에서 계좌를 파산시킬 전략 99개를 실전 투입 전에 가차 없이 죽여 없애는(Kill) 것이어야 합니다.


2. 아키텍처 설계: 7대 Hard Veto 헌법과 3단계 게이트웨이

저는 알고리즘의 실전 투입 여부를 결정하기 위해 주관적 해석을 완전히 배제한 3단계 평가 깔때기(Funnel Protocol, EVAL-QB-002)를 설계했습니다.

7대 Hard Veto 헌법과 3단계 알고리즘 채택·기각 게이트웨이
7대 Hard Veto 헌법과 3단계 알고리즘 채택·기각 게이트웨이
📐 원본 Mermaid 도식 구조 접기/펼치기
flowchart TD
    Run["전략 35년 시뮬레이션 완료 (24개 지표 산출)"] --> G1{"Stage 1: 7대 치명적 결함<br/>(Hard Veto) 적발 여부?"}
    
    G1 -->|"단 1건이라도 위반"| Kill["❌ 즉시 사형 (REJECTED)<br/>코드 영구 폐기 or 근본 재설계"]
    G1 -->|"7대 헌법 100% 무결점 통과"| G2{"Stage 2: 전략 아키타입별<br/>필수 합격 커트라인 충족?"}
    
    G2 -->|"기준 미달"| Kill
    G2 -->|"전 항목 합격"| G3{"Stage 3: 100점 만점<br/>종합 정량 스코어카드"}
    
    G3 -->|">= 85점 (Grade S/A)"| Pass["🏆 최종 채택 (ACCEPTED)<br/>Master Gate 날인 & 실전 승격"]
    G3 -->|"70 ~ 84점 (Grade B)"| Revise["⚠️ 조건부 보완 (1회 재심)"]
    G3 -->|"< 70점 (Grade C/F)"| Kill

7대 Hard Veto 즉시 기각 조항 (Automatic Kill Conditions)

아래 7개 조항 중 단 하나라도 적발되면 누적 수익률이 +1,000%라도 즉시 영구 기각(REJECTED)됩니다:

Veto ID 헌법 조항 명칭 정량적 즉시 기각 조건 (Kill Condition) 기각 근거 및 아키텍처 철학
VETO-01 시점/데이터 무결성 위반 미래 가격(trade_date > T) 또는 미공시 재무(filing_date > T) 단 1건이라도 참조 백테스트 수익률 전체가 타임머신 환상(Look-Ahead)임
VETO-02 실행 지연 알파 붕괴 시그널 발생 후 $T+2$ 시가 체결 시 샤프 유지율 $< 80%$ 중장기 구조적 알파가 아닌 일시적 단타 호가 노이즈
VETO-03 최근 시장(OOS) 알파 소멸 표본 외(2015~현재) 샤프 $< 0.60$ 또는 워크포워드 효율($text{WFE}$) $< 0.65$ 90년대에만 통하고 현대 알고리즘 시장에서 소멸된 전략
VETO-04 파라미터 과최적화 (절벽) 파라미터 $pm 15%$ 변경 시 이웃 안정성 $< 0.70$ 또는 $text{DSR} < 0.90$ 특정 뾰족한 숫자에만 끼워 맞춘 곡선 적합(Curve-Fitting)
VETO-05 마찰 비용 취약성 기본 수수료/슬리피지를 2배로 가중했을 때 순알파가 음수($<0$)로 전환 스프레드 확대 시 계좌가 수수료만 내다 파산
VETO-06 단타성 과잉 회전·소형주 평균 보유일 $< 10$일, 연회전 $> 600%$, 소형주(시총 $$1text{B}$미만) 수익 **$> 50%$** 실전 유동성 충격 재현 불가, No Day-Trading 헌법 위반
VETO-07 위기 구간 계좌 파산 낙폭 4대 금융위기 중 어느 한 번이라도 MDD 주식 $-30%$, 자산배분 $-18%$ 초과 실전 운용 시 심리적·금전적 파산으로 완주 불가

3. [TDD 핵심 발췌]: T+2 실행 지연 시 가짜 알파를 처형하는 심판관

7대 헌법 중 가장 교묘하고도 치명적인 함정이 바로 VETO-02 (실행 지연 알파 붕괴)입니다.

많은 개인 퀀트들이 $T$일 종가로 계산하여 $T+1$일 아침 시가(MOO)에 체결되는 전략을 만듭니다. 하지만 실전에서는 API 네트워크 지연, 슬리피지, 호가 공백으로 인해 주문이 밀려 $T+2$일에 체결될 수 있습니다.

진짜 펀더멘털과 거시 모멘텀에 기반한 ‘구조적 알파’라면 하루 늦게 산다고 해서 수익률이 무너지지 않습니다. 반면, 당일 종가 호가의 미세 노이즈나 일시적 수급에 기댄 ‘가짜 알파’는 체결이 하루만 밀려도 알파가 처참하게 붕괴합니다.

T+1 vs T+2 실행 지연 스트레스 테스트와 가짜 알파 붕괴
T+1 vs T+2 실행 지연 스트레스 테스트와 가짜 알파 붕괴
📐 원본 Mermaid 도식 구조 접기/펼치기
sequenceDiagram
    autonumber
    participant Engine as Backtest Engine
    participant Judge as HardVetoJudge
    participant Strategy as Alpha Strategy

    Engine->>Strategy: 1. 표준 실행 (T+1 MOO 시가 체결)
    Strategy-->>Engine: Sharpe = 1.85, CAGR = +42.5%
    Engine->>Strategy: 2. 강제 지연 스트레스 (T+2 MOO 시가 체결)
    Strategy-->>Engine: Sharpe = 0.58, CAGR = +8.4%
    
    Engine->>Judge: 3. 결과 전달 (audit_strategy)
    Note over Judge: T+2 유지율 = 0.58 / 1.85 = 31.4%<br/>기준치(80%) 미달 검출!
    Judge-->>Engine: 4. throw VetoViolationError (VETO-02 즉시 사형)
    Note over Engine: 전략 리더보드 퇴출 및 코드 영구 폐기

[RED] 체결이 하루 지연되면 성과가 폭락하는 전략을 즉시 사형시키는 실패 테스트

시그널 발생 후 다음 날($T+1$) 산 결과와 다다음 날($T+2$) 산 결과를 비교하여, 샤프 유지율이 80% 미만이면 가차 없이 VetoViolationError를 던져야 합니다.

# tests/test_hard_veto_judge.py
import pytest
from quant_backtester.evaluation.judge import HardVetoJudge, VetoViolationError

def test_veto_02_execution_delay_kills_fragile_alpha():
    # Case A: 겉보기엔 화려하지만 하루만 지연돼도 무너지는 가짜 단타 모멘텀 전략
    fragile_strategy_metrics = {
        "name": "Overfitted_Noise_Scalper_v1",
        "t1_metrics": {"cagr": 0.425, "sharpe": 1.85, "mdd": -0.142},
        "t2_metrics": {"cagr": 0.084, "sharpe": 0.58, "mdd": -0.386},  # 유지율 31.4%
        "is_metrics": {"sharpe": 1.90},
        "oos_metrics": {"sharpe": 0.65, "wfe": 0.68},
        "holding_days": 4.2,   # 단타 회전
        "annual_turnover": 7.5 # 750% 회전
    }

    judge = HardVetoJudge()

    # 타협 없이 VetoViolationError 예외를 발생시키고 즉시 사형 판정을 내려야 함
    with pytest.raises(VetoViolationError) as exc_info:
        judge.audit(fragile_strategy_metrics)

    assert "VETO-02" in str(exc_info.value)
    assert exc_info.value.veto_id == "VETO-02"
    assert "Execution Delay Retention (31.4%) < 80.0%" in str(exc_info.value)

[GREEN] 7대 헌법을 단 한 치의 오차 없이 집행하는 HardVetoJudge

어떤 감정이나 합리화도 개입할 수 없도록, 7개 검증 메서드를 순차 실행하여 위반 즉시 사형 예외(VetoViolationError)를 발생시킵니다.

# quant_backtester/evaluation/judge.py
from dataclasses import dataclass
from typing import Dict, Any, List

class VetoViolationError(Exception):
    def __init__(self, veto_id: str, rule_name: str, reason: str):
        self.veto_id = veto_id
        self.rule_name = rule_name
        self.reason = reason
        super().__init__(f"[{veto_id} 사형 선고: {rule_name}] {reason}")

class HardVetoJudge:
    def __init__(self, delay_retention_threshold: float = 0.80):
        self.delay_threshold = delay_retention_threshold

    def audit(self, result: Dict[str, Any]) -> bool:
        # VETO-01: 시점 무결성 (Look-Ahead 검증)
        if result.get("lookahead_leak_count", 0) > 0:
            raise VetoViolationError("VETO-01", "시점 무결성 위반", f"미래 데이터 누출 {result['lookahead_leak_count']}건 검출")

        # VETO-02: T+2 실행 지연 알파 유지율 검증
        t1_sr = result["t1_metrics"]["sharpe"]
        t2_sr = result["t2_metrics"]["sharpe"]
        retention = t2_sr / (t1_sr + 1e-9)
        if retention < self.delay_threshold:
            raise VetoViolationError(
                "VETO-02", "실행 지연 알파 붕괴",
                f"Execution Delay Retention ({retention*100:.1f}%) < {self.delay_threshold*100:.1f}%"
            )

        # VETO-06: 회전율 및 최소 보유 기간 검증
        if result.get("holding_days", 99) < 10.0:
            raise VetoViolationError("VETO-06", "단타성 과잉 매매", f"평균 보유일({result['holding_days']:.1f}일)이 10일 미만")

        # VETO-07: 위기 구간 극단적 낙폭 검증
        if result.get("crisis_mdd_stock", 0.0) < -0.30:
            raise VetoViolationError("VETO-07", "위기 계좌 파산", f"위기 구간 MDD({result['crisis_mdd_stock']*100:.1f}%)가 -30% 초과")

        return True # 7대 헌법 무결점 통과

4. [BENCHMARK] 진짜 알파 vs 가짜 알파의 실측 심판 리포트

실제로 동일한 연평균 수익률 대역에서 개발된 두 전략을 HardVetoJudge 심판대에 올렸을 때 생성된 공식 감사 영수증(latest_scorecard.json) 대조표입니다:

평가 항목 전략 A (단타 수급 모멘텀) 전략 B (CbOP 퀄리티 팩터 + 거시 헤지) 판정 기준 및 심판관 코멘트
겉보기 CAGR (T+1) +42.5% +21.4% A가 2배 높아 보이지만 환상에 불과함
지연 체결 CAGR (T+2) +8.4% +20.1% A는 체결 지연 시 수익률 80% 증발
T+1 샤프 지수 1.85 1.42 겉보기 위험조정수익
T+2 샤프 지수 0.58 1.34 B는 거의 변동 없이 유지
T+2 알파 유지율 31.4% (위반) 94.4% (통과) VETO-02 기준치(80%) 미달 ➔ A 즉시 사형
평균 보유 기간 4.2일 (위반) 42.5일 (통과) VETO-06 기준치(10일) 미달 ➔ A 2중 위반
2008 금융위기 MDD -38.6% (위반) -12.8% (통과) VETO-07 기준치(-30%) 초과 ➔ A 파산 확정
최종 판정 ❌ REJECTED (영구 폐기) ✅ ACCEPTED (실전 승격) B만 Master Leaderboard에 등재

전략 A는 개발자에게 연 40%가 넘는 달콤한 꿈을 꾸게 해 주었지만, HardVetoJudge의 무자비한 칼날 앞에서는 단 3초 만에 3개 조항 위반으로 사형 선고를 받았습니다.

반면 전략 B는 겉보기 수익률은 낮았지만, 실행 지연 94.4% 유지율과 2008년 위기 MDD -12.8%라는 압도적 강건성을 증명하며 실전 운용 자격을 획득했습니다.


5. 에필로그 & 다음 이야기: 이제 출정식(EVAL-QB-002)과 마스터 리더보드로 향합니다

이제 우리는 월 0원 데이터 레이크하우스(Lap 1)부터, 미래 참조를 원천 차단하는 데이터 포털(Lap 2), 잔인할 정도로 현실적인 체결 엔진(Lap 3), 2008년 금융위기에서도 오차 없는 복식부기 회계(Lap 4), 24개 입체 지표 채점기(Lap 5), 그리고 가짜 알파를 가차 없이 처형하는 7대 Hard Veto 심판관(Lap 6)까지 백테스터의 5대 핵심 모듈을 모두 완공했습니다.

백테스터는 단순한 장난감이 아닙니다.

나의 소중한 자본과 시간을 지키기 위해, 시장이라는 잔혹한 서킷에 나가기 전 알고리즘을 극한까지 담금질하는 우리만의 독자적인 ‘신뢰의 관제탑’입니다.

모든 모듈이 준비되었으니, 이제 AI 수석 아키텍트의 엄격한 아키텍처 평가 감사(EVAL-QB-002)를 최종 통과시키고, 백테스터 완공 선언과 함께 대망의 ‘마스터 리더보드(Master Leaderboard)’를 출범시킬 차례입니다.

💡 다음 이야기 예고:
[Lap 7] [출정식] AI 수석 아키텍트의 감사 보고서와 마스터 리더보드
“가짜 알파의 무덤 위에 세워진 신뢰의 관제탑.”
아키텍처 평가서 독립 감사 통과, 시즌 1 완공 선언 및 시즌 2 5대 전략(매크로 ETF, 밸류 팩터, 퀀타멘털 스윙, PEAD, 하이브리드 HRP) 출격식으로 찾아뵙겠습니다.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *