2026년 10월 28일 · 옵션

시그널은 맞았다. 옵션 백테스트가 잘못된 만기 계약을 매수했다.

시그널은 맞았다. 옵션 백테스트가 잘못된 만기 계약을 매수했다.

화요일 오전 10:07, 리서치 에이전트가 한 지수 ETF에서 단기 강세 설정을 포착했다. 기초 시그널은 평범했다. 가격은 20바 평균선을 회복했고, 실현 변동성은 낮아지고 있었으며, 다음 세션에는 예정된 거시경제 지표 발표가 있었다. 제안된 거래는 만기까지 약 2주 남은 콜 스프레드였다.

백테스트는 이 거래를 선호했다. 페이퍼 전략은 주문을 내지 않았다. 주문을 비교해 보니 시그널 타임스탬프는 일치했고 기초자산 가격도 몇 센트 이내로 같았다. 달랐던 건 계약이었다. 백테스트는 과거 옵션 체인에서 가장 좋아 보이는 금요일 만기를 매수했지만, 페이퍼 프로세스는 그보다 1주 뒤에 있는 다음 상장 만기를 선택했다.

이 차이는 캘린더 조인에서 비롯됐다. 우리는 ‘만기까지 남은 일수’를 날짜의 속성으로 취급한 뒤, 목표일에 가장 가까운 만기의 계약을 골랐다. 과거 데이터의 만기 캘린더에는 우리가 테스트하던 날짜 이후에 추가된 주간물이 포함돼 있었다. 백테스트는 미래의 계약을 마치 별문제 없는 편의 기능인 것처럼 사용했다.

처음에는 시간대 버그를 의심했다. 옵션 만기일은 그런 버그가 생기기 쉬운 조건을 갖췄다. 시장 세션은 뉴욕에서 끝나고, 거래소 타임스탬프는 UTC로 저장될 수 있으며, 파이프라인에서 날짜를 부주의하게 형변환하면 자정 기준 날짜가 달라질 수 있다. 확인해 보니 타임스탬프는 정확했다. 그 계약은 그 화요일에 과거 유니버스에 존재하지 않았다.

여기서 얻은 첫 번째 교훈은 과거 옵션 체인에 시점별 상장 유니버스가 필요하다는 것이다. 계약의 만기일은 계약이 언제 끝나는지를 알려 준다. 언제 상장됐는지, 언제 거래할 수 있게 됐는지, 당시 시스템에서 선택할 수 있었는지는 알려 주지 않는다.

우리는 의사결정 타임스탬프에 이용할 수 있었던 정보를 기준으로 선택 단계를 다시 만들었다. 모든 후보 계약에 대해 의사결정 시점보다 늦지 않은 상장 타임스탬프, 신선도 기준을 넘지 않는 유효 호가, 전략이 주문을 제출할 수 있는 시장 세션을 요구했다. 순위를 매기기 전에 후보 집합도 기록했다. 마지막 조치가 중요했다. 이전 백테스트는 최종 선택만 보관했기 때문에 적격 계약 5개를 비교했는지, 아직 도래하지 않은 캘린더에서 조용히 골랐는지 알 수 없었다.

10:07시그널 의사결정 시각
1주만기 불일치
0선택된 계약의 과거 적격 상장 건수

다음으로 스프레드 가격 산정에 사용된 호가를 살펴봤다. 백테스트는 각 레그의 최신 호가를 따로 가져왔다. 콜 매도호가는 10:06:58 시점이었고, 숏 콜 매수호가는 10:04:11 시점이었다. 넓게 설정한 데이터 정책에 따르면 둘 다 최근 호가였지만, 그 사이에 시장이 움직였다. 서로 다른 시점의 레그 호가로 계산한 스프레드 중간값은 실제로 존재한 적 없는 시장을 나타낼 수 있다.

호가 규칙을 바꿔 양쪽 레그의 타임스탬프 차이가 2초 이내여야 하고, 역전 호가나 잔량이 0인 시장은 제외하도록 했다. 사용할 수 있는 과거 관측치는 줄었다. 대신 남은 가격은 더 믿을 만해졌다. 동기화된 호가가 없으면 오래된 가격으로 빈 구간을 채우지 않고 해당 후보를 이용 불가로 표시했다.

그다음은 순위 결정 규칙이었다. 에이전트는 호가 스프레드 비용이 가장 낮은 만기를 선택했다. 스프레드가 1계약뿐이고 호가가 오래된 경우를 생각하면 그럴듯한 규칙이 아니다. 우리는 목표를 명시했다. 최소 호가 잔량, 신선도, 상장 여부 검사를 통과한 계약 중 정의된 위험 단위당 기대 보상을 최대화한다. 이 사례에서 가장 가까운 적격 만기의 양쪽 레그 간 호가 폭은 $0.42였고, 더 늦은 만기의 호가 폭은 $0.31이었다. 더 저렴해 보이는 쪽은 숏 레그에 표시된 잔량도 1계약뿐이었다.

후보당시 만기 이용 가능 여부호가 경과 시간표시된 숏 레그 잔량결정
금요일 주간물아니요해당 없음해당 없음제외
다음 금요일예1.4초18계약적격
세 번째 금요일예9.8초1계약오래되고 잔량이 적어 제외

이 규칙을 적용해 당시 상황을 재현했다. 이제 백테스트는 페이퍼와 같은 만기를 선택하고 다른 계약이 제외된 이유도 기록했다. 그 결과 스프레드 진입 가격은 기존 과거 체결가보다 $0.11 불리해졌다. 그렇다고 전략에 가치가 없다는 뜻은 아니다. 이전 성과 수치에는 라이브 프로세스에서 재현할 수 없는 거래 선택이 포함돼 있었다는 뜻이다.

작은 골칫거리도 있었다. 거래소 심볼 형식 때문에 만기 버그가 데이터 품질 문제처럼 보일 수 있다. 한 공급업체의 주간물 코드는 월물 코드와 한 글자 달랐다. 나는 감사 로그에 원본 심볼을 정규화된 계약 키와 함께 보관한다. 깔끔한 방법은 아니지만, 단정해 보이는 조인을 너무 쉽게 믿지 않도록 해 준다.

옵션 백테스트를 만든다면 각 의사결정 시점의 전체 후보 집합을 계약별 상장 상태, 호가 타임스탬프, 잔량, 제외 사유와 함께 저장하자. 그런 다음 계약 선택을 해당 스냅샷을 입력으로 받는 결정론적 함수로 만들자. 만기 선택은 전략의 일부다. 백테스트에서 페이퍼에서는 선택할 수 없었던 계약이 보인다면, 시그널 비교는 이미 답이 달라진 뒤에 시작하는 셈이다.

옵션 백테스팅만기 선택시점별 데이터체결 모델링
← 전체 글