2026년 9월 22일 · 선물

연속 선물 차트는 누구도 거래할 수 없었던 계약입니다

연속 선물 차트는 누구도 거래할 수 없었던 계약입니다

연속 선물 시계열은 만기가 돌아오는 계약들을 차례로 이어 하나의 과거 기록으로 만듭니다. 이 기록으로 신호를 연구할 수는 있지만, 가격 변화만으로 직접 거래 손익을 계산하면 롤오버 때마다 수익과 손실이 지어질 수 있습니다. 이 시계열만으로는 어떤 계약을 보유했는지 알 수 없습니다.

특히 가혹한 사례를 보겠습니다. 2020년 4월 20일 NYMEX WTI 원유입니다. 5월물은 배럴당 마이너스 $37.63에 결제됐습니다. 6월물은 플러스 $20.43에 결제됐습니다. 두 가격 모두 실제 가격이었습니다. 두 가격 사이의 $58.06도 실제 차이였습니다. 하지만 차트를 5월물에서 6월물로 바꿨다고 해서 롱 포지션이 그 차이만큼 벌지는 않았습니다.

이 연결 지점을 뜯어보겠습니다. 아래는 과거 결제 가격입니다. 이어지는 가상 회계 사례는 산술 오류를 드러내기 위한 것이며, 해당 가격에 주문이 체결될 수 있었다는 주장은 아닙니다.

CLK20과 CLM20: 차트에서 사라진 식별자

항목5월물6월물
계약 식별자CLK20CLM20
인도 월2020년 5월2020년 6월
4월 20일 결제 가격, 배럴당 달러−37.6320.43
계약 규모1,000 배럴1,000 배럴

티커 앞부분보다 월 코드가 중요합니다. K는 5월, M은 6월을 뜻합니다. 두 계약의 인도 의무와 가격은 서로 달랐습니다. 5월물은 이례적인 저장 공간 부족 압박 속에 만기가 다가오고 있었습니다. 6월물은 한 달을 더 확보하는 계약이었습니다.

데이터 제공업체의 연속 심볼은 이런 차이를 보기 좋게 짧은 표기로 감춥니다. 짧은 심볼은 좋습니다. 다만 거래 기록에 남은 식별자가 그것뿐이면 이야기가 달라집니다. 그때부터 디버깅은 고고학 발굴처럼 느껴집니다. 커피 맛은 더 나쁘고요.

연속 시계열을 만드는 방식도 하나로 정해져 있지 않습니다. 제공업체는 만기 며칠 전, 거래량이 역전되는 시점, 또는 다른 일정에 따라 롤오버할 수 있습니다. 많은 시계열은 4월 20일이 되기 전에 이미 5월물에서 6월물로 넘어갔습니다. 여기서는 실패가 잘 보이도록 두 결제 가격을 의도적으로 이어 붙였습니다. 특정 제공업체의 롤오버 방식을 설명하려는 것은 아닙니다.

1,000 배럴: 가격에 곱하는 계약 승수

표준 NYMEX WTI 선물 계약은 1,000 배럴을 나타냅니다. 따라서 가격이 $1 움직이면 한 계약 롱 포지션의 가치는 $1,000 변합니다. $0.01 틱은 $10입니다.

한 계약을 그대로 보유했을 때의 기본 계산식은 다음과 같습니다.

gross_pnl = contracts × 1,000 × (ending_price − starting_price)

이 계산은 가격이 0 아래로 내려가도 유효합니다. 반면 표시된 선물 가격의 백분율 수익률은 훨씬 쓸모가 떨어집니다. 가격이 0을 넘나들면 수익률이 정의되지 않거나 의미가 반대로 보일 수 있습니다. 전략 수익률은 계좌의 자산 가치와 현금 흐름 산정 방식으로 계산해야 합니다. 배럴 가격은 전략에 투입된 자본이 아닙니다.

$58.06: 연결 지점의 불연속

순진한 엔진이 5월물 결제 가격 다음에 6월물 결제 가격이 왔다고 보고, 상품이 바뀌지 않은 것처럼 공식을 적용한다고 해보겠습니다.

invented_pnl = 1 × 1,000 × (20.43 − (−37.63))
             = $58,060

이 비교에서는 시간의 흐름에 따른 가격 움직임이 전혀 없습니다. 두 가격은 같은 거래일의 서로 다른 계약 가격입니다. 엔진은 계약 간 가격 차이를 보유 기간 중 발생한 수익으로 잘못 처리한 것입니다.

실제 일별 시계열 연결에서는 어제의 구계약 가격과 오늘의 신계약 가격에 일반적인 시장 움직임도 섞입니다. 그래서 오류를 알아차리기 더 어렵습니다. 기록된 변동에는 구계약의 가격 움직임과 전환 시점의 계약 간 가격 차이가 함께 들어갑니다.

그렇다고 가상의 현금 “롤오버 비용”으로 $58,060을 차감하는 것도 모델을 고치지 못합니다. 선물은 표시된 명목 금액 전액을 내고 매수하는 상품이 아닙니다. 한 계약을 청산하고 다른 계약을 개시하면 포지션 변화, 실현 또는 정산 손익, 수수료, 체결 효과와 증거금 요건이 발생합니다. 두 계약의 가격 수준 차이가 자동으로 현금 차감액이 되는 것은 아닙니다.

+58.06: 과거 가격에 기록되는 백조정

연속 시계열을 만드는 일반적인 방식 중 하나는 롤오버 차이를 과거 가격에 더하는 것입니다. 이 방식에서는 5월물의 −37.63이 20.43으로 바뀌어 6월물과 점프 없이 이어집니다. 같은 과거 구간의 이전 관측값에도 58.06이 더해집니다.

구성 방식이 연결 지점에서 일어나는 일연구에 미치는 영향
미조정$58.06 차이가 남음지표가 계약 전환을 시장 움직임으로 해석할 수 있음
가산 백조정과거 구간에 58.06을 더함구간 내 달러 변동은 유지되지만 과거 가격 수준과 백분율 변동은 달라짐
비율 백조정과거 구간에 20.43 / −37.63을 곱함. 약 −0.543음수 계수가 구간 내 가격 변동의 부호를 뒤집음

마지막 행이 제가 “비율 조정”만으로는 충분한 데이터 명세가 아니라고 보는 이유입니다. 가격이 양수일 때 합리적으로 작동하는 방식이라도 가격이 0이거나 음수일 때 어떻게 처리할지 명시해야 합니다.

가산 조정에도 나름의 영향이 있습니다. 절대 가격 $30 아래에서 매수하는 신호는 이후 롤오버로 과거 가격 수준이 다시 쓰이면 달라질 수 있습니다. 빠른 이동평균과 느린 이동평균의 차이를 이용하는 신호는 두 구간에 같은 조정값이 적용되는 한 변하지 않을 수 있습니다. 조정 경계를 가로지르는 구간은 별도로 살펴봐야 합니다.

연구 결과와 함께 조정 방식, 롤오버 일정, 데이터 버전을 보관하세요. 조정된 가격 수준에 민감한 신호라면 각 의사결정 시점에 이용할 수 있었던 시계열을 재구성하세요. 현재 내려받은 데이터에는 당시에는 아직 발생하지 않은 롤오버의 조정값이 이미 반영되어 있을 수 있습니다.

연속 차트에서 빠진 두 주문 행

단순화한 장부를 보겠습니다. 롤오버 전 5월물 한 계약의 가격이 −30.00이었다고 가정합니다. 위에 나온 과거 결제 가격으로 5월물을 청산하고 6월물을 개시한 뒤, 6월물 가격이 21.00이 되었다고 가정하겠습니다. 가정한 체결 가격은 회계 예시를 위한 것입니다.

장부 항목계산총손익
5월물 롱 1계약을 −37.63에 청산1,000 × (−37.63 − (−30.00))−$7,630
6월물 롱 1계약을 20.43에 개시진입 시 가격 변동 없음$0
6월물 가격을 21.00으로 평가1,000 × (21.00 − 20.43)+$570
합계체결 비용과 수수료 전−$7,060

$58.06 차이는 별도의 수익이나 비용으로 어디에도 나타나지 않습니다. 일일 변동 증거금은 선물 손익이 현금에 반영되는 시점을 정할 뿐, 같은 손익을 한 번 더 만들어내지 않습니다.

실제 롤오버는 서로 독립된 두 주문이 아니라 캘린더 스프레드 주문으로 체결될 수 있습니다. 시뮬레이터는 어떤 방식을 가정하든 해당 체결과 비용을 포함해 표현하면서, 그 아래의 개별 계약 포지션도 유지해야 합니다.

제가 확인하는 기준은 간단합니다. 선물 거래 손익의 모든 금액은 계약 식별자, 수량, 승수, 그리고 그 계약에 속하는 두 가격으로 대조할 수 있어야 합니다. 롤오버 결정 시각과 사용한 입력값도 확인하고 싶습니다. 오늘 거래량이 마감된 뒤에야 알 수 있는 거래량 기준 규칙으로 같은 날 더 일찍 거래할 수는 없습니다.

맥락을 파악하려면 연속 가격선을 그리세요. 그 아래에는 실제 보유한 계약을 그리고, 전환 시점을 표시하세요. 전환 시점에 자산 곡선이 점프한다면 저는 먼저 이 두 주문 행을 살펴봅니다.

연속 선물백테스트선물 롤오버시장 데이터손익 회계
← 전체 글