처음 자동매매를 돌리기 시작했을 때, 저는 매월 특정 날짜만 되면 시스템이 이상하게 작동한다고 느꼈습니다. 청산이 연속으로 뜨거나, 반대로 진입 신호가 쏟아졌다가 바로 반전되는 상황이 반복됐습니다. 나중에 확인해보니 대부분 Deribit BTC 옵션 만기일 전후였습니다. 크립토 옵션 시장이 커지면서 이 날짜는 이제 단순한 파생상품 이벤트가 아니라, 현물과 선물 시장 전체에 영향을 미치는 변동성 트리거가 됐습니다. 이번 칼럼에서는 제가 직접 관찰하고 검증 중인 옵션 만기일 전후 패턴과, 이를 자동매매 시스템에 어떻게 녹여넣고 있는지 솔직하게 공유합니다.
옵션 만기일이 크립토 시장에 미치는 영향, 왜 이렇게 커졌나
Deribit 기준으로 BTC 옵션은 매주 금요일, 매월 마지막 금요일, 분기 말 세 가지 주기로 만기가 돌아옵니다. 이 중 월말 만기는 미결제약정(OI) 규모가 특히 크고, 분기 말 만기는 수십억 달러 단위의 포지션이 한꺼번에 정산됩니다. 2024년 이후로 크립토 옵션 시장 규모가 급격히 커지면서 이 만기 이벤트가 현물 가격에 미치는 영향도 무시할 수 없는 수준이 됐습니다. 제가 4시간봉 기준으로 관찰한 결과, 옵션 만기일 48시간 전부터 시장에서 두 가지 현상이 나타나는 경향이 있었습니다. 첫 번째는 ‘Max Pain’ 가격대 근처로 현물 가격이 끌려가는 움직임입니다. Max Pain은 옵션 매도자 입장에서 손실이 최소화되는 가격으로, 대형 마켓메이커가 이 구간으로 가격을 유도하려는 포지션을 잡는다는 논리입니다. 두 번째는 만기 직전 24시간 동안 변동성이 급격히 줄어드는 구간이 생긴다는 점입니다. 이를 흔히 ‘IV 수렴’이라고 표현하는데, 내재변동성이 수렴하면서 실제 가격도 좁은 범위에서 횡보하다가, 만기 이후 방향을 확 틀어버리는 패턴을 여러 차례 목격했습니다. 물론 이 패턴이 항상 재현되지는 않습니다. 거시경제 이벤트가 겹칠 경우 Max Pain 논리 자체가 무력화되기도 합니다. 그래서 저는 이것을 ‘확신’이 아닌 ‘확률 조정’ 도구로 활용하고 있습니다.
만기일 전후 변동성 패턴, 제가 직접 분류한 3가지 국면
관찰을 계속하면서 저는 옵션 만기일 전후 패턴을 크게 세 국면으로 분류하기 시작했습니다. 이 분류 자체가 완벽한 모델은 아니지만, 자동매매 시스템의 필터 조건을 설계할 때 기준점 역할을 합니다. 첫 번째 국면은 만기 72~48시간 전, 저는 이것을 ‘포지션 쏠림 구간’이라고 부릅니다. 이 시기에는 Deribit의 OI 변화와 펀딩비 방향이 한쪽으로 쏠리는 경향이 있습니다. 제 시스템에서는 이 구간에 신규 진입 사이즈를 자동으로 70%로 줄이도록 설정해두고 있습니다. 두 번째 국면은 만기 24시간 전부터 만기 당일 오전(UTC 기준 08:00 전후)까지로, ‘횡보-압축 구간’입니다. 이때는 가격 움직임이 좁아지고 거래량도 줄어드는 경우가 많습니다. 추세 추종 전략 입장에서는 최악의 환경이기 때문에, 이 구간에는 진입 신호가 발생하더라도 ATR 기준으로 변동성이 평균 대비 40% 미만일 경우 건너뛰는 로직을 추가했습니다. 세 번째 국면은 만기 이후 4~12시간으로, ‘방향 재설정 구간’입니다. 포지션 정산 압력이 사라지고 시장 참여자들이 새 방향을 잡기 시작하는 이 시점에 트렌드 신호가 잘 터지는 경향이 있습니다. 저는 이 구간에서는 반대로 포지션 사이즈 제한을 해제하고, 신호가 나오면 평소 기준 그대로 진입하도록 설정합니다. 다만 이 모든 설정은 Jesse 프레임워크 내 커스텀 필터 함수로 구현했고, 아직 충분한 샘플을 쌓는 중입니다.
자동매매 시스템에 만기일 필터를 실제로 구현하는 방법
이론은 있는데 어떻게 코드로 넣느냐가 항상 문제입니다. 제가 현재 사용하는 방식을 구체적으로 설명하겠습니다. 우선 만기일 정보를 자동으로 가져오는 것이 첫 번째 과제였습니다. Deribit 공개 API의 /public/get_instruments 엔드포인트를 호출하면 현재 상장된 옵션 목록과 만기일(expiration_timestamp)을 JSON 형태로 받을 수 있습니다. 저는 이 데이터를 매일 자정에 Flask 서버에서 가져와 SQLite에 저장하고, Jesse 전략 파일에서 해당 DB를 참조하는 방식으로 연동했습니다. 핵심 코드 구조는 단순합니다. 현재 캔들의 타임스탬프가 만기일 72시간 이내인지 확인하고, 그 결과에 따라 position_size_multiplier 값을 조정합니다. 예를 들어 72~48시간 구간이면 0.7, 24시간 이내면 0.5, 만기 후 12시간 이내면 1.0으로 되돌리는 식입니다. 두 번째로 중요한 점은 분기 만기와 월 만기를 구분해서 다르게 처리한다는 것입니다. 분기 만기(3월, 6월, 9월, 12월 마지막 금요일)는 미결제약정 규모가 훨씬 크기 때문에, 이 경우에는 position_size_multiplier를 추가로 0.1씩 더 줄입니다. 실제로 2025년 3월 분기 만기 때 이 필터 없이 돌렸다가 짧은 시간 내에 비정상적인 변동성을 맞은 경험이 있습니다. 그 이후로 이 분기 구분 로직은 제 시스템에서 필수 요소가 됐습니다. 아직 장기 검증 중이지만, 적어도 이 필터가 만기일 전후 무분별한 진입을 막아주는 역할은 하고 있다는 것이 저의 현재 관찰 결과입니다.
💬 운영자 한마디
저는 옵션 만기일 패턴을 ‘공식’처럼 쓰지 않습니다. 시장이 늘 패턴을 배반하기 때문입니다. 다만 이런 이벤트가 있다는 사실을 인식하고, 시스템의 리스크 노출을 조금 줄이는 것과 무방비로 두는 것 사이에는 분명한 차이가 있다고 생각합니다. 지금도 샘플을 쌓는 중이고, 충분한 데이터가 모이면 다시 공유하겠습니다.
— J_River · autoprofit 운영자
✅ 이번 주 체크리스트
- Deribit /public/get_instruments API로 이번 달 BTC 옵션 만기일 확인하기
- 만기일 72시간 전부터 포지션 사이즈를 70% 이하로 줄이는 로직 검토하기
- ATR 기준 변동성이 평균 40% 미만일 때 진입 신호 스킵 조건 추가하기
- 분기 만기(3, 6, 9, 12월)는 일반 월 만기보다 사이즈 제한을 10% 추가 적용하기
- 만기 이후 4~12시간 구간에서 기존 전략 필터 제한 해제 여부 백테스트로 확인하기
- Deribit Max Pain 가격을 매일 자동으로 수집해 DB에 쌓는 스크립트 작성하기
- 만기일 이벤트와 거시 이벤트(FOMC, CPI 등)가 겹치는 날짜는 별도 예외 처리 검토하기
옵션 만기일은 크립토 자동매매를 운영하는 사람이라면 반드시 캘린더에 표시해두어야 할 이벤트입니다. 무조건 쉬는 게 정답이 아니라, 시스템이 이 날짜를 인식하고 스스로 대응하게 만드는 것이 진짜 자동화라고 저는 생각합니다.
※ 본 콘텐츠는 운영자 개인의 경험과 연구를 바탕으로 한 정보 제공 목적이며, 특정 종목에 대한 투자 권유나 매매 시그널이 아닙니다. 암호화폐 및 자동매매는 원금 손실 가능성이 있는 고위험 활동이며, 모든 투자 판단과 그 결과에 대한 책임은 투자자 본인에게 있습니다.