자체 페이퍼 트레이딩 스택에서 단일 전략의 1-minute BTCUSDT 무기한 계약 신호를 31일 동안 추적해 주문 1,418건을 측정했습니다. 바 마감부터 거래소가 주문을 확인할 때까지 걸린 시간의 중앙값은 195 ms였습니다. 99백분위수는 2,970 ms였습니다. 실현 변동성이 가장 높았던 1%의 분에서 중앙값은 840 ms였습니다. 그리고 그 이전 1년 동안 백테스트 설정에 들어 있던 지연 시간 상수는 0.
였습니다.이 숫자 중 3개는 뻔합니다. 0이 잘못된 값이라는 건 누구나 알고, 언젠가는 다른 값으로 바꿉니다. 그 값은 대개 누군가 감으로 고른 상수입니다. 100 ms, 250 ms, “보수적으로 500 ms로 하자.” 실제로 중요한 숫자는 840입니다. 지연 시간이 시장 상태에 따라 달라진다는 뜻이기 때문입니다. 지연이 길어지는 시장 상태는 신호가 무언가를 포착했다고 판단하는 바로 그 상태이기도 합니다.
195 ms는 어디에 쓰일까
단계별로 단조 시계 타임스탬프를 기록해 전체 시간 예산을 측정했습니다. 서버는 AWS ap-northeast-1 리전의 인스턴스로, 거래소 엔드포인트와 같은 리전에 있습니다. 코로케이션을 쓰지 않는 일반적인 개인 트레이더 환경으로는 꽤 유리한 조건입니다.
| 단계 | p50 | p95 | p99 |
|---|---|---|---|
| 바 마감 → WS kline-closed 이벤트 수신 | 128 ms | 402 ms | 1,940 ms |
| 파싱 및 피처 상태 업데이트 | 3 ms | 9 ms | 28 ms |
| 의사결정: 모델 평가 및 리스크 점검 | 11 ms | 22 ms | 60 ms |
| 주문 제출 → 거래소 확인 | 47 ms | 180 ms | 1,100 ms |
| 종단 간(합산값이 아닌 실측값) | 195 ms | 690 ms | 2,970 ms |
핵심으로 들어가기 전에 알아둘 점이 2가지 있습니다. 첫째, 중앙값은 더해지지 않습니다. 128 + 3 + 11 + 47 = 189이지만, 종단 간 실측 중앙값은 195입니다. 백분위수는 합산할 수 없습니다. 단계별 p99를 더해 지연 시간을 추정하면 3,128 ms가 나오지만 실제 p99는 2,970 ms입니다. 이 경우엔 차이가 작지만, 단계 간 상관관계가 반대 방향으로 작용하면 오차가 크게 벌어집니다. 전체 경로를 측정하세요.
둘째, 맨 위 행을 보세요. 중앙값 시간 예산의 3분의 2가 거래소에서 바 마감 통지를 받을 때까지 기다리는 데 쓰입니다. 네트워크도, 코드도, 주문 라우팅도 원인이 아닙니다. 거래소가 체결을 모아 kline을 만들고 분이 끝났다고 판단한 뒤 전송합니다. 전송 앞에는 대기열이 있고, 그 스트림의 모든 구독자가 이 대기열을 함께 씁니다.
840
신호를 만든 분의 실현 변동성을 기준으로 주문 1,418건을 구간별로 나누면 분포가 확연히 달라집니다.
| 신호 바 변동성 구간 | 주문 수 | 종단 간 p50 | 종단 간 p99 |
|---|---|---|---|
| 하위 사분위 | 201 | 141 ms | 488 ms |
| 중간 2개 사분위 | 796 | 183 ms | 1,210 ms |
| 상위 사분위 | 407 | 312 ms | 2,880 ms |
| 전체 분 중 상위 1% | 14 | 840 ms | 4,100 ms |
모든 단계가 함께 느려지고, 그 영향은 누적됩니다. 거래소의 집계 및 전송 대기열은 매칭 엔진 부하의 영향을 받습니다. 거래가 11,000건 발생한 분의 데이터는 거래 600건이 발생한 분보다 늦게 전송됩니다. 같은 시간 동안 우리 프로세스도 더 많은 호가 잔량 업데이트와 체결 정보를 처리하므로, 보통 3 ms 걸리는 피처 업데이트가 28 ms로 늘어납니다. REST 주문 경로는 다른 모든 참가자의 긴급 주문과 경쟁하고, 때때로 503 오류 후 재시도가 발생해 그 자체로 1초를 소모합니다. 표본에서 신호 바의 거래 수와 종단 간 지연 시간 간 상관계수는 0.41이었습니다. 아주 큰 값은 아니지만, 고정 상수를 쓰기엔 충분합니다.
첫 단계 검증을 통과하는 전략은 대부분 돌파, 반전, 가격 괴리, 청산 연쇄를 거래합니다. 이런 전략은 지연 시간이 가장 나쁜 구간에서 신호를 냅니다. 분당 가격이 40 bps 움직일 때만 발동하는 모멘텀 신호는 구조적으로 스택이 가장 느리게 작동하는 순간에만 처리됩니다.
한 번은 매일 밤 거의 같은 시간에 발생하는 3.6초짜리 이상치를 하루 종일 추적한 적이 있습니다. 원인은 logrotate였습니다. 프로세스가 쓰는 것과 같은 EBS 볼륨에서 2 GB 파일을 복사하며 크기를 0으로 만들어 이벤트 루프를 멈추고 있었습니다. 시장은 아무 잘못이 없었습니다. 먼저 측정하고, 그다음 시장 미시구조를 의심하세요.
체결에는 어떤 영향을 줄까
기다리는 동안 가격은 움직입니다. 무작위로 고른 분에서 중앙값 지연 시간 195 ms 동안 신호 방향에 불리하게 움직인 평균 폭은 약 1.1 bps였습니다. 312 ms가 걸린 상위 사분위 분에서는 5.8 bps, 상위 1% 분에서는 840 ms 동안 약 14 bps 불리하게 움직인 뒤에야 주문이 호가창에 도달했습니다.
BTC 무기한 계약에서는 스프레드 영향이 거의 없습니다. 84,000 가격에서 1틱은 0.012 bps이므로, 비용은 호가를 넘는 데서가 아니라 불리한 가격 움직임에서 발생합니다. 같은 전략을 중형 시가총액 무기한 계약에 적용하면 두 번째 비용이 커집니다. 표본에서 최우선 호가 스프레드는 조용한 분의 1.4 bps에서 상위 사분위 분의 6.2 bps로 넓어졌고, 해당 가격대의 잔량은 절반 넘게 줄었습니다. 같은 원인으로 발생한 가격 움직임, 넓어진 스프레드, 줄어든 잔량 비용을 한꺼번에 부담하게 됩니다.
동일한 31일 데이터를 고정 200 ms 대신 바별 조건부 지연 시간으로 재생하자, 백테스트의 평균 진입 가격이 3.1 bps 악화됐습니다. 이 변화는 거의 전부 거래의 9%에 집중됐습니다. 백테스트와 페이퍼 트레이딩 간 진입 가격 차이는 4.2 bps에서 0.9 bps로 줄었습니다. 해당 전략의 인샘플 Sharpe는 1.7에서 1.1로 낮아졌습니다. 이 수치가 정직한 값이고, 처음부터 그랬습니다.
그럼 설정에는 무엇을 넣어야 할까
단일 값이 아닙니다. 현재 저희는 이렇게 처리합니다.
- 설정하지 말고 표본을 추출하세요. 시뮬레이션할 주문마다 해당 바의 활동량을 반영한 실측 분포에서 지연 시간을 뽑습니다. 거래 수와 절대 수익률이면 충분하며, 둘 다 표준 kline에 이미 들어 있습니다. 거래소별, 주문 유형별로 월 1회 적합합니다.
- 꼬리 구간을 유지하세요. 로그정규분포를 적합하고 끝내지 마세요. p99는 재시도 폭증과 GC 일시 중단에서 나오며, 매끄러운 분포로는 재현되지 않습니다. 저희는 실측 분위수를 쓰고 p95 초과 꼬리는 재표본추출합니다.
- 취소에도 지연 시간을 적용하세요. 스톱 주문 교체나 헤지 취소에도 같은 지연이 적용됩니다. 시장이 빠르게 움직일 때는 취소 요청과 체결이 경주를 벌입니다. 시뮬레이터가 즉시 취소한다면 리스크 모델은 현실을 반영하지 못합니다.
- 오래된 신호 차단 조건을 추가하고 시뮬레이션하세요. 저희는 도착 시점에 바가 1.5초 넘게 지난 신호를 모두 버립니다. 실제 비용이 발생하는 동작입니다. 거래를 조용히 제외하므로 백테스트에서도 똑같은 거래를 제외해야 합니다.
- 페이퍼 트레이딩 결과로 재보정하세요. 실제 기준값은 페이퍼 트레이딩에서 얻을 수 있습니다. 모든 주문에서 4개 구간의 타임스탬프를 기록하고, 시뮬레이터의 가정과 분포를 매주 비교하세요.
다른 자산군에도 같은 문제가 있습니다. 미국 주식에서는 통합 시세 테이프의 집계 지연이 브로커 지연에 더해지고, 같은 구조적 이유로 메시지 처리량이 높을 때 지연이 커집니다. 예측 시장에서는 대부분의 거래소가 REST만으로 주문을 받습니다. 저희가 측정한 중앙값은 100 ms 미만이었지만, 결과 발표 이벤트가 발생해 참가자들이 한꺼번에 몰리면 수 초까지 늘어났습니다. 암호화폐 옵션에서는 기초자산이 움직인 바로 그 순간에 가격 산정 기준으로 삼은 호가가 2초 된 정보일 수 있습니다.
이 실수의 일반적인 형태는 실행 파라미터를 신호를 움직이는 동일한 상태 변수의 함수가 아니라 독립적인 상수로 취급하는 것입니다. 수수료는 안정적이고 펀딩도 안정적이지만, 지연 시간은 그렇지 않습니다. 여기서 숫자 하나만 기억한다면 비율을 기억하세요. 저희 p99는 중앙값의 15배이며, 신호는 p99에 가까운 구간에서 불균형적으로 많이 발생합니다.
4개 구간의 계측을 시작하세요. 오후 한나절이면 끝나는 작업이고, 파라미터를 한 주 더 탐색하는 것보다 전략에 대해 더 많은 것을 알려줄 겁니다.
← 전체 글


