백테스트에서 진입 신호는 아마 가장 영향이 작은 요소일 겁니다. 성과가 그저 그런 모멘텀 규칙 하나를 가져와 모든 진입과 청산 시각은 그대로 둔 채 보유 계약 수를 결정하는 함수만 바꾸면, 순샤프를 0.41에서 0.71로, 최대 낙폭을 31%에서 13%로 바꿀 수 있습니다. 거래는 같습니다. 체결도 같습니다. 전략만 달라집니다.
이 주장은 사람들을 불편하게 만듭니다. 그럴 만도 합니다. 룩백과 필터 임계값을 조정하는 데 들이는 시간 대부분이 작은 항을 만지는 데 쓰인다는 뜻이니까요. 실제 실행 결과를 보여 드리고, 비판도 일리 있는 부분은 인정하겠습니다. 이 주장이 틀리는 경우도 있는데, 제가 어느 쪽을 말하는지 알아둘 필요가 있습니다.
신호 하나, 보유 방식은 6가지
신호는 Binance USDⓈ-M의 ETHUSDT 무기한 계약, 1시간 봉 기준입니다. 12시간 EMA가 96시간 EMA 위에 있으면 매수하고, 아니면 포지션을 청산하며, 공매도는 하지 않습니다. 2022년 7월부터 2026년 6월까지입니다. 왕복 거래는 431회입니다. 양쪽 모두 taker 수수료 5.0 bps를 적용하고, 실제 포지션에 대해 8시간마다 펀딩비를 지급하거나 수취했으며, 슬리피지는 최우선 호가 잔량을 바탕으로 모델링했습니다. 일부러 단순한 신호를 골랐습니다. 누구도 적극적으로 옹호하지 않을 신호라서 깔끔한 검증 대상이 되기 때문입니다.
아래 모든 행은 진입과 청산 봉의 시각이 완전히 같습니다. 차이는 포지션 크기 조정 함수뿐입니다.
| 포지션 크기 조정 규칙 | 순샤프 | 최대 낙폭 | 연간 거래 명목 규모(평균 포지션 대비 ×) | 총 PnL 대비 비용 | 최대 레버리지 |
|---|---|---|---|---|---|
| 고정 명목 규모 $10k | 0.41 | 18.2% | 246× | 14% | 1.0× |
| 고정 비율, 자기자본의 100% | 0.44 | 30.8% | 251× | 15% | 1.0× |
| 20일 실현 변동성의 역수 | 0.68 | 14.1% | 690× | 29% | 4.4× |
| 연환산 변동성 목표 20%, 매시간 리밸런싱, 상한 없음 | 0.71 | 12.9% | 1,180× | 41% | 6.3× |
| 변동성 목표 20%, 무거래 밴드 20%, 레버리지 상한 3× | 0.66 | 15.3% | 402× | 19% | 3.0× |
| 60일 롤링 평균/분산 기준 하프 켈리 | 0.52 | 24.6% | 830× | 33% | 8.1× |
결과 차이를 보세요. 최저와 최고 행 사이에 샤프가 상대적으로 73% 차이 나고, 낙폭은 2.4배 차이 납니다. 이제 이 데이터셋에서 과적합이 뻔히 드러나지 않으면서 샤프를 0.30 움직이는 진입 신호 매개변수를 찾아보세요. 찾아봤습니다. EMA 쌍의 기간을 바꾸면 현실성 있는 전체 그리드에서 약 0.12 움직입니다. 그 변화 대부분은 표본 외에서 유지되지 않는 잡음입니다.
역변동성 방식은 왜 좋아 보이며, 그중 실제 효과는 얼마나 될까
작동 원리는 복잡하지 않습니다. 고정 명목 규모에서는 포지션 크기와 실현 변동성이 상관관계가 없으므로, 거래당 달러 기준 리스크는 그 주의 변동성에 비례합니다. 이 기간 ETH의 20일 실현 변동성은 연환산 31%에서 118% 사이였습니다. 고정 명목 규모 방식은 2023년 7월보다 2024년 3월에 달러 기준 리스크를 3.8× 더 감수했습니다. 신호에 확신이 더 커서가 아니라 시장이 더 요동쳤기 때문입니다. 낙폭 대부분은 변동성 상위 20% 구간에 집중됩니다. 역변동성 방식은 이 연동을 제거합니다. 그 결과 수익 흐름의 형태가 실제로 개선됩니다.
하지만 샤프 상승분의 일부는 측정상의 착시입니다. 두 요소를 구분하지 않으면 이후 의사결정을 잘못하게 됩니다. 샤프는 수익률의 표준편차로 나눕니다. 변동성 타기팅은 정의상 수익률의 표준편차를 안정화하는 작업입니다. 즉, 분모를 직접 최적화하는 셈입니다. 사전 변동성이 일정해지도록 포지션을 조정하는 규칙은 변동성 군집이 있는 거의 모든 수익 흐름에서 샤프를 높입니다. 엣지가 전혀 없는 흐름도 마찬가지입니다. 신호를 섞어 검증해 확인했습니다. 진입 시각을 무작위로 바꾸고 변동성 타기팅 오버레이는 유지하면, 평균이 0인 기반 수익률에서도 고정 명목 규모 대비 샤프가 약 0.06 상승합니다. 크지는 않지만 0은 아니며, 순전히 작동 방식에서 비롯된 효과입니다.
그래서 내부적으로 포지션 크기 조정 규칙을 비교할 때 샤프만 보지는 않습니다. 칼마 비율, 평균 투입 명목 규모당 순 PnL, 총수익에서 순수익으로 이어지는 비용 내역도 확인합니다. 이 세 가지를 함께 보면 분모를 건드리는 요령으로 수치를 부풀리기가 훨씬 어렵습니다.
변동성 추정치도 모델이라 데이터가 새어 들어갈 수 있다
좋은 포지션 크기 조정 결과가 가짜로 드러나는 가장 흔한 원인은 변동성 추정에 포지션 크기를 정할 봉의 정보가 들어가는 것입니다. 변동성 시계열에 중앙 정렬 윈도우를 쓰거나, 현재 진행 중인 봉까지 포함하는 리샘플링 뒤 pandas 기본값인 `rolling().std()`를 적용하거나, 전체 표본으로 표준화하면 데이터 누수가 생깁니다. 변동성이 지속성을 띠기 때문에 행 하나하나에서 누수 규모는 작고 자산 곡선도 그럴듯해 보여 미묘합니다. 중요한 주간에만 곡선이 약간 지나치게 매끄러워질 뿐입니다.
에이전트는 포지션 크기 조정 규칙을 페이퍼 트레이딩 대기열에 올리기 전에 다음 4가지를 확인합니다:
- 의사결정 시점에 이용 가능한 정보. 14:00에 시작하는 봉에 적용한 크기는 종가 시각이 ≤ 13:59:59.999인 데이터만으로 계산할 수 있어야 합니다. 무작위로 고른 의사결정 시점 200개에서 프레임을 잘라 크기 시계열을 다시 계산하고 차이를 비교해 이를 검증합니다.
- 추정기 룩백도 실제 매개변수로 취급. 변동성 20일 윈도우와 60일 윈도우는 서로 다른 전략입니다. 다른 모든 매개변수와 함께 룩백도 워크포워드 그리드에 넣습니다. 특정 윈도우 길이에서만 결과가 유효하다면, 이는 전략의 취약성에 관한 발견입니다.
- 최대치뿐 아니라 레버리지 경로도 확인. 총 레버리지 분포 전체를 출력합니다. 위의 무제한 변동성 타기팅 실행은 시간의 4%를 5× 초과 레버리지로 보냈습니다. 요약 표에는 절대 나오지 않지만 전략을 실제로 구현할 수 있는지를 완전히 좌우하는 부분입니다.
- 강건성 검증에 포지션 크기 조정 민감도 포함. 변동성 목표를 20%에서 25%로 바꿨을 때 샤프가 무너지면, 그 전략은 변동성 타기팅이 아니라 레버리지 수치에 맞춘 것입니다. 특정 숫자를 골라 엣지를 만들어낸 셈입니다.
레버리지 상한은 곁들이는 리스크 관리 장식이 아니라 전략 정의의 일부입니다. Binance의 ETHUSDT 티어는 포지션 명목 규모가 커지면 최대 레버리지를 낮추고, 유지증거금률도 함께 올라갑니다. 변동성 타기팅 규칙이 명목 규모 $400k에서 6.3×까지 올라가도록 허용하는 백테스트는 거래소가 해당 증거금으로 보유하도록 허용하지 않는 포지션을 묘사합니다. 표에서 상한을 둔 행은 샤프 0.05를 희생하지만, 둘 중 실제 상황을 반영하는 것은 그 행뿐입니다.
수익은 리밸런싱 과정에서 빠져나간다
비용 열을 보세요. 변동성 목표에 맞춰 매시간 리밸런싱한 방식은 표면상 샤프가 가장 높았지만 총 PnL의 41%를 거래소에 넘겼습니다. 평균 포지션 명목 규모의 연간 1,180×를 거래하면서 편도 5 bps에 스프레드와 시장 충격 비용까지 냈습니다. 단순한 해결책은 일정에 따라 리밸런싱 빈도를 줄이는 것입니다. 더 나은 해결책은 무거래 밴드입니다. 현재 포지션이 목표에서 일정 임계값보다 더 벗어날 때만 크기를 조정합니다.
밴드 20%를 적용하자 연간 거래 명목 규모가 1,180×에서 402×로 줄었습니다. 66% 감소입니다. 샤프 비용은 0.05였습니다. 지금까지 8개 신호에서 같은 결과를 확인했습니다. 15%~25% 밴드는 거래 회전율을 3분의 1로 낮추면서 리스크 관리 효과 대부분을 유지합니다. 10% 미만은 어차피 20일 윈도우로 추정하는 수량을 겉보기만 정교하게 만들려고 수수료를 내는 셈입니다. 표준오차가 15%인 수치에 소수점 셋째 자리까지 맞춰 리밸런싱할 수는 없습니다.
2월에 에이전트가 작성한 보고서에서 샤프 0.22 상승을 “개선된 진입 필터” 덕분이라고 분석한 적이 있습니다. 실제 변경 사항은 포지션 크기 조정 모듈의 한 줄이었습니다. 필터는 바뀌지 않았습니다. 이제 보고서 맨 위에 포지션 크기 조정 설정 해시를 출력하게 했습니다. 성과 원인 분석은 훈련이 필요한 일이고, 모델도 다른 누구 못지않게 깔끔한 이야기를 지어내기 때문입니다.
페이퍼 트레이딩에서 포지션 크기 조정 규칙은 어떻게 달라질까
백테스트와 페이퍼 트레이딩 사이의 차이가 가장 크게 벌어지는 지점입니다. 대부분은 단순한 산술 문제입니다. 변동성 반응형 포지션 크기 조정은 표본 전체에서 포지션 크기를 4~8배 범위로 움직입니다. 그 범위의 양 끝 모두 백테스트에서 모델링하지 않은 거래소 제약에 걸립니다.
작은 쪽에서는 수량 단위와 최소 명목 규모가 문제입니다. ETHUSDT 무기한 계약의 수량 단위는 0.001이고 최소 주문 규모는 $5입니다. 변동성이 낮은 구간의 포지션 크기가 0.0004 ETH라면 백테스트에서는 보유하지만 페이퍼 트레이딩에서는 아무 포지션도 잡지 못합니다. 언뜻 예외적인 상황 같지만, 변동성 타기팅 규칙은 가장 조용한 시장에서 가장작은 포지션을 취한다는 점을 생각해 보세요. 추세 신호에서는 그곳이 좋은 진입 지점인 경우가 많습니다. 큰 쪽에서는 포지션 한도와 증거금 티어가 문제이며, 6× 포지션에는 청산 모델을 백테스트에 넣지 않은 격리 증거금 관리도 필요합니다.
페이퍼 트레이딩 자산 곡선이 6주 동안 백테스트와 3% 이내로 따라가다가 급격히 벌어진 사례도 있었습니다. 원인은 반올림이었습니다. 주문 크기 계산기에서 스텝 단위로 반올림하지 않고 `int()`로 잘라냈는데, 평균 1.4스텝인 포지션에 이 방식이 적용됐습니다. 백테스트는 연속값으로 포지션 크기를 계산했지만 실제 크기 계산기는 작은 거래마다 의도한 포지션의 20-30%를 잃었습니다. 특이한 체결 모델도, 지연 시간 문제도 아니었습니다. 버림 처리였습니다.
비판이 옳은 지점
세 가지 반론은 타당합니다. 넘어가고 싶지 않습니다.
첫째이자 가장 중요한 점입니다. 포지션 크기 조정은 엣지를 배분할 뿐, 만들어내지는 못합니다. 현실적인 수수료와 펀딩비를 적용한 뒤 신호의 총 기대수익이 0 이하라면 표의 모든 규칙에서 손실이 납니다. 그럴듯한 규칙은 분산이 보기 좋게 나타나면서 손실이 날 뿐입니다. 이 기간에 작지만 양수인 순엣지가 있는 신호를 골랐습니다. 거래당 순수익이 −1.2 bps인 신호에 같은 6가지 규칙을 적용하면 순위는 유지되지만 모든 최종 자산은 시작 시점보다 낮습니다. 포지션 크기 조정은 무언가에 곱하는 배수입니다. 그 ‘무언가’는 여전히 필요합니다.
둘째, 변동성 타기팅에는 실제로 잘 알려진 실패 유형이 있습니다. 급격한 매도세의 저점에 가까워질수록 레버리지를 줄이고 반등한 뒤에 다시 늘립니다. 급격한 V자 반등에서는 고정 명목 규모 방식이 이기며, 때로는 큰 차이로 앞섭니다. 주식 시장의 2020년 3월과 암호화폐 시장의 2024년 8월 급락 후 반등 구간 모두 회복 구간에서 변동성 반응형 포지션 크기 조정에 불리했습니다. 제가 살펴본 ETH 4년 구간에는 V자형 급변동보다 변동성이 군집한 완만한 움직임이 더 많이 들어 있어 역변동성 방식에 유리합니다. 다른 구간에서는 순위가 일부 뒤집힙니다. 2020년 표를 앞세웠다면 이 주장을 더 약하게 했을 겁니다.
셋째, 포지션 크기 조정 규칙도 다른 요소처럼 과적합할 수 있습니다. 표에서 하프 켈리가 그 예입니다. 정교해 보이고 이론적 근거도 있지만, 두 번째로 큰 낙폭을 냈습니다. 잡음이 큰 수익률 시계열에서 롤링 평균을 추정하는 건 엉터리이고, 켈리 방식은 그 추정에 매우 민감하기 때문입니다. 기대수익 추정치를 입력값으로 쓰는 포지션 크기 조정 규칙은 추정치의 오차를 물려받아 증폭합니다. 분산 추정치만 쓰는 규칙은 훨씬 안정적입니다. 4년간의 시간별 데이터로 실제 추정할 수 있는 유일한 적률이 분산이기 때문입니다.
이 분석에서 기억할 점은 다음과 같습니다. 백테스트 결과가 예상 밖이면 신호에서 기발한 요소를 찾기 전에 포지션 크기 조정 모듈부터 확인하세요. 샤프를 보고할 때는 레버리지 경로와 비용 내역도 함께 제시하세요. 포지션 크기 결정에 크게 좌우되는 수치는 신호 자체의 특성이 아닙니다.
← 전체 글
