2026년 10월 20일 · 리서치

선물 포지션 롤오버 비용을 반영하자 전략은 더 이상 통하지 않았다

선물 포지션 롤오버 비용을 반영하자 전략은 더 이상 통하지 않았다

화요일 아침, 원유 선물 추세 전략은 만기가 임박한 계약을 매수 보유하고 있었습니다. 신호는 우리가 요청한 대로 정확히 작동하고 있었습니다. 추세가 긍정적인 동안 포지션을 유지했습니다. 백테스트에는 소폭의 수익이 표시됐습니다. 모의 계좌에는 매도, 다음 계약 매수, 수수료 2회, 그리고 차트가 보여준 것보다 불리한 진입 가격이 기록됐습니다.

신호에 이상한 일이 생긴 것은 아니었습니다. 백테스트는 “선물 가격”을 하나의 연속된 값처럼 처리했습니다. 하지만 계좌에서는 서로 다른 주문장에서 서로 다른 가격으로 한 계약을 청산하고 다른 계약을 열어야 했습니다.

롤오버 구간을 통과한 포지션을 검토하다가 차이를 발견했습니다. 이 전략은 유동성이 풍부한 근월물 계약을 사용하고, 달력 규칙에 따라 다음 월물로 옮길 때까지 보유했습니다. 그 규칙은 합리적이었습니다. 하지만 그에 따른 회계 처리는 그렇지 않았습니다.

연속 선물 시계열은 계약 간 가격 차이를 없애도록 과거 가격을 조정한 상태였습니다. 그래서 추세를 계산하는 차트로는 유용했습니다. 하지만 이 시계열에는 기존 계약을 청산하거나 새 계약을 매수할 수 있는 실제 가격이 전혀 없었습니다. 백테스트는 롤오버 구간에서 거래를 평가할 때 조정된 가격을 사용한 뒤, 포지션이 그대로 이어진 것처럼 거래를 재개했습니다.

신호를 만드는 데는 연속 시계열이 유용한 측정값일 수 있습니다. 하지만 체결 가격으로는 허구입니다. 롤오버는 2건의 거래로 이뤄지며, 계약 간 스프레드는 매끄럽게 없애 버릴 장식용 가격 변동이 아니라 시장 구조의 일부입니다.

2개 레그선물 포지션 청산 및 재진입에 필요
2개 주문장각각 고유한 매수호가, 매도호가와 잔량 보유
1개 신호아예 바뀌지 않을 수도 있음

상장된 두 계약을 사용해 해당 상황을 재구성했습니다. 기존 월물의 매수호가는 79.98, 매도호가는 80.00이었습니다. 다음 월물의 매수호가는 80.42, 매도호가는 80.45였습니다. 매수 포지션을 청산하려면 기존 계약을 매수호가에 매도한 다음, 새 계약을 매도호가에 매수해야 했습니다. 체결 가능한 양쪽 호가 기준으로 캘린더 스프레드는 44센트였습니다.

그렇다고 44센트가 곧바로 손실을 뜻하는 것은 아니었습니다. 두 계약은 인도 월이 달랐고, 스프레드에는 보유 비용, 보관료, 금융 비용과 공급 전망이 반영돼 있었습니다. 롤오버 후에도 포지션을 유지하면 새 계약의 가격 변동에 계속 노출됩니다. 호가된 스프레드 전체를 수수료처럼 내는 것은 아닙니다. 다만 전략은 기존 계약을 청산하고 새 계약에 진입한 사실을 손익에 반영해야 합니다. 수익률을 계산할 때 두 가격을 같은 상품의 가격인 것처럼 비교하면 손익을 만들어 내거나 지워 버릴 수 있습니다.

리플레이에서는 각 작업을 분리했습니다. 연속 시계열은 계속 추세 신호를 생성했습니다. 계약별 가격은 평가와 주문에 사용했습니다. 롤오버 시 시뮬레이터는 만기 임박 월물에 청산 주문을, 다음 월물에 진입 주문을 보냈습니다. 각 계약의 수수료를 적용하고 각 주문장의 스프레드와 가용 잔량을 반영했습니다.

첫 번째 리플레이도 모의 계좌 기록과 맞지 않았습니다. 주문은 순차적으로 제출됐는데 두 체결을 같은 타임스탬프에 맞춰 처리했기 때문입니다. 기존 월물의 청산은 체결됐지만, 매수 주문이 주문장에 도달하기 전에 다음 월물의 매도호가가 움직였습니다. 거래소가 지원한다면 롤오버를 캘린더 스프레드 주문으로 실행할 수 있고, 아니면 그 사이에 익스포저가 생기는 2개 레그로 실행할 수 있습니다. 두 방식은 서로 다른 체결 가정을 전제로 합니다. 비교에는 모의 계좌에서 실제로 사용한 주문 순서를 적용했습니다.

그다음에는 캘린더 규칙 자체가 구체적이지 않다는 점을 알아차렸습니다. “만기 5일 전 롤오버”는 정확해 보이지만, 공휴일로 거래 일정이 바뀌거나 유동성이 더 일찍 이동할 수 있고 계약마다 만기 기준도 다를 수 있습니다. 한 곳에서는 달력 일수를, 다른 곳에서는 영업일수를 세도록 코드를 작성했습니다. 모의 전략은 최종 거래일 전 5번째 거래 세션에 롤오버했지만, 백테스트는 최종 거래일 5일 전에 롤오버했습니다.

롤오버 날짜는 거래 규칙입니다. 거래소 캘린더와 롤오버를 촉발하는 이벤트를 명시하세요. 그렇지 않으면 백테스트와 계좌가 결국 보유 계약을 다르게 판단하게 됩니다.

롤오버 지침을 바꿔 계약의 최종 거래일을 기준으로 삼고, 해당 거래소 캘린더의 세션을 세며, 포지션을 옮기기 전에 최소 유동성 조건을 확인하도록 했습니다. 이 기준은 실용적인 안전장치일 뿐, 더 나은 체결을 보장하지는 않습니다. 거래량과 미결제약정은 주문이 실제로 어떻게 체결될지 알려주는 불완전한 지표입니다. 리플레이마다 인수인계 과정을 설명할 수 있도록 선택된 계약과 양쪽 레그의 가격을 기록했습니다.

이 변경을 적용한 뒤 전략의 과거 수익률은 낮아졌습니다. 차이는 단 한 번의 막대한 롤오버 손실에서 비롯된 것이 아니었습니다. 올바른 계약과 거래 세션을 선택하고, 양쪽 레그의 실제 수수료를 반영하고, 각 주문장에서 청산과 진입 가격을 따로 책정한 결과가 조금씩 쌓였습니다. 유동성이 특히 낮았던 롤오버 한 번은 비용이 컸습니다. 평균에 묻히지 않도록 그대로 드러내 두었습니다.

선물 백테스트에서 연속 차트를 사용한다면 그 차트가 어디에 쓰이는지 확인하세요. 신호에 일관된 입력값을 제공할 수는 있습니다. 하지만 실제로 매수하거나 매도할 수 있었던 계약을 대신할 수는 없습니다. 만기를 넘기는 모든 포지션에 대해 리서치 기록에는 기존 계약, 새 계약, 롤오버 조건, 체결 모델, 그리고 그에 따른 두 현금 흐름을 식별할 수 있어야 합니다.

그 화요일 거래는 복잡한 실패 사례가 아니었습니다. 계좌가 보유 자산을 바꿔야 했던 순간을 건너뛴 탓에 차트상 수익성 있어 보였던 거래였습니다. 리플레이에 그 순간을 다시 반영하자 결과는 덜 그럴듯해졌지만 훨씬 더 유용해졌습니다.

선물롤오버 비용백테스팅시장 미시구조거래 비용
← 전체 글