페이퍼 트레이딩 실험의 통과 조건에 beats_qqq가 있었습니다. 같은 규칙·같은 비용의 QQQ 당일매매를 이겨야 한다는 조건입니다. 판정표에는 QQQ 당일매매 -8.93%라고 찍혀 있었고, 제 전략은 그것보다도 못했으니 어차피 FAIL이었습니다.
그런데 검증 중에 이상한 걸 봤습니다. 그 비교군의 왕복 거래 수: 0.
당신의 게이트에 있는 비교군은, 실제로 거래를 하고 있습니까?
68세션 전부 INSUFFICIENT_CASH
원인은 산수였습니다. 예산 100만원을 환전하면 약 $660, 현금 유보 2%를 빼면 $647. 평가 기간 QQQ의 최저 종가는 $661.73이었습니다. 정수 주식만 허용하는 규칙에서 QQQ는 단 하루도 1주를 살 수 없는 종목이었습니다. SPY($725~)도 마찬가지.
그래서 "QQQ 당일매매" 비교군은 68세션 내내 달러 현금으로 앉아 있었고, 판정표의 -8.93%는 트레이딩 성과가 아니라 원화로 평가한 달러 약세였습니다. 달러 기준 수익률 0.00%가 그 증거입니다. 유니버스가 "ETF 4개"라고 적혀 있었지만 실효는 2개였습니다.
beats_qqq는 "QQQ 당일매매를 이겼는가"가 아니라 "현금 방치를 이겼는가"를 재고 있었습니다. 이 실험은 그것에조차 22%p 뒤졌으니 판정은 안 바뀌었지만 — 만약 전략이 현금은 이기고 진짜 QQQ 당일매매에는 지는 성적이었다면, 이 게이트는 가짜 PASS를 줬을 겁니다.
값싼 수정의 유혹
발견하고 나면 고치고 싶은 방향이 셋 보입니다. 예산을 올린다, 유니버스를 줄인다, 소수점 매매로 바꾼다. 셋 다 결과를 본 뒤의 규칙 변경입니다. 사전등록한 실험 안에서 하면 안 됩니다.
제가 한 건 하나입니다. 판정을 쉽게 만들지 않는 방향의 검사 추가 — comparators_traded: 비교군의 왕복 체결이 0이면 게이트 전체를 FAIL 처리. 분모 없는 비교는 PASS로 셀 수 없다는 규칙입니다. 판정창을 사전등록해 두고 바를 옮기지 않는 것과 같은 원칙이고, 방향이 "통과를 어렵게"라서 사후 추가가 허용됩니다.
당신이라면 셋 중 뭘 골랐겠습니까 — 그리고 그 선택이 통과를 쉽게 만드는 방향은 아니었습니까?
자가진단 3개
- 게이트의 비교군이 실제로 체결하고 있습니까? 체결 수를 판정표에 함께 찍으십시오.
- 자본 × 유보율로 유니버스에서 가장 비싼 1주를 살 수 있습니까? 착수 전에 한 줄로 확인됩니다.
- 비교군 수익률이 이상하게 얌전하다면, 그것이 전략의 수익인지 통화의 수익인지 갈라 봤습니까?
솔직한 부분
이 결함은 백테스트가 켜지기 전에 잡을 수 있었습니다. min(예산, 최저가) 한 줄이면 됐습니다. 놓친 이유는 비교군을 "당연히 돌아가는 것"으로 취급했기 때문입니다. 전략 코드는 의심하면서 벤치마크 코드는 의심하지 않았습니다. 그런데 게이트의 분모는 벤치마크 쪽에 있습니다.
지금 딱 하나만 확인해 보세요. 당신 실험의 벤치마크 행에서 거래 횟수 열을 찾아보시기 바랍니다. 그 열이 없다면, 그게 첫 번째 발견입니다.