2026년 9월 16일 · 백테스팅

주식 백테스트에서 공매도 신호를 찾았습니다. 실제로 주식을 빌릴 수 있었을까요?

주식 백테스트에서 공매도 신호를 찾았습니다. 실제로 주식을 빌릴 수 있었을까요?

Maya님,

급격한 시초가 갭을 공매도하고 최대 3거래일 동안 보유하는 미국 주식 전략을 만들었습니다. 시뮬레이터에는 수수료와 스프레드 비용을 반영하고 거래 참여율에도 제한을 둡니다. 갭 임계값을 조정하느라 오후를 또 보내기 전에, 더 기본적인 질문에 답해야 합니다. 계좌에서 그 주식을 빌릴 수 있었을까요?

증권 대차가 진입을 제한하거나 보유 비용을 바꾸는 경우에는 공매도 백테스트에 대차 모델이 필요합니다. 이 모델에는 과거 대차 가능 여부, 이용 가능한 수량, 대차 비용, 리콜에 대한 대응이 들어가야 합니다. 연간 고정 수수료만으로는 그중 한 부분만 다룰 수 있습니다.

이 사례에서는 대차 누락으로 거래 구성 자체가 달라질 수 있습니다. 큰 갭을 보인 소형주가 대차 물량이 부족하거나 비용이 비싼 종목일 수도 있습니다. 대차 불가 거래를 제거하면 같은 전략의 규모만 작아질 거라고 가정할 수는 없습니다.

매도 주문보다 먼저 확인할 주문

다음 시뮬레이션 신호를 떠올려 보세요. 주당 $10에 1,000주를 매도합니다. 가격 데이터상 거래량은 충분합니다. 이는 체결 여력을 어느 정도 알려줍니다. 하지만 브로커가 고객 계좌에 제공할 수 있는 주식 재고에 대해서는 거의 알려주지 않습니다.

일반적인 미국 주식 공매도에서는 브로커가 매도를 체결하기 전에 관련 대차 확인 요건을 충족해야 합니다. 시뮬레이터에서는 개념을 구분해야 합니다. 대차 확인은 주식을 빌릴 수 있다고 판단할 근거를 제공하지만, 전체 보유 기간 동안 주식을 확정적으로 확보해 주지는 않습니다.

과거 브로커 응답시뮬레이션에서의 조치
수용 가능한 제시 금리로 1,000주 이용 가능요청 수량을 체결 가능성 검사 단계로 진행
300주만 이용 가능전략이 부분 배정을 허용한다면 주문을 300주로 제한
이용 가능한 주식 없음진입을 거부하고 대차 거부로 기록
과거 관측 자료 없음진입 가능 여부를 미확인으로 표시하고 민감도 분석에 포함

300주만 가능한 경우에 어떻게 할지 수익률을 보기 전에 정해야 합니다. 그렇지 않으면 수익 난 거래는 부분 배정을 받아들이고, 손실 난 거래는 규모가 너무 작아 신경 쓸 필요 없다고 여기게 됩니다.

용어는 담백하게 정하세요. 데이터베이스 열 이름을 locate_status이라고 해 두면 6개월 뒤에도 무슨 뜻인지 알 수 있습니다. shortable_magic이라고 이름 붙이면 자잘한 유지보수 문제가 하나 생깁니다. 연구 노트북에는 꼭 이런 게 하나씩 생기곤 하죠.

3거래일 보유 기간에 주말이 들어갈 수 있습니다

금요일에 $10,000어치 공매도하고 월요일에 청산한다고 가정해 보겠습니다. 이 예에서는 브로커가 달력일 기준 3일분 대차 비용을 부과하고, 365일을 연간 기준으로 삼으며, 수수료 산정 잔고가 $10,000으로 유지된다고 가정합니다. 이는 명시적인 모델링 가정입니다. 실제에 가깝게 구현하려면 브로커의 실제 비용 발생 및 평가 기준이 필요합니다.

연환산 대차 금리일일 비용3일 비용진입 시 명목 금액 대비 비율
30%$8.22$24.660.247%
100%$27.40$82.190.822%
360%$98.63$295.892.959%

계산식은 수수료 산정 잔고 × 연환산 금리 × 일수 ÷ 365입니다. 실제 원장에는 다른 일수 기준, 일일 금리 재산정, 담보 기준 또는 별도의 대차 확인 수수료가 필요할 수 있습니다. 공매도 대금에 적용되는 크레딧이 있다면 그것도 별도로 반영해야 합니다.

주가가 2% 하락하면 총 가격 이익은 $200입니다. 360% 예시에서는 체결 비용을 고려하기도 전에 대차 비용으로 이미 그보다 많은 금액을 지출했습니다. 이런 가정 아래 해당 거래를 제외하는 데 복잡한 통계적 논증은 필요하지 않습니다.

하지만 진입 시점의 금리 필터로 보유 비용이 확정되는 것은 아닙니다. 포지션을 보유하는 동안 대차 금리는 바뀔 수 있습니다. 매일 적용되는 조건에 따라 비용을 누적하세요. 진입 시점의 의사결정에 실제로 활용할 수 있었던 판단에는 진입 시점의 호가를 적용하세요.

브로커 관점의 데이터가 필요합니다

종목, 브로커 또는 대차 제공처, 이용 가능 상태, 제시 수량과 금리를 포함한 타임스탬프 기록이 필요합니다. 관측 자료를 받은 시각을 보존하세요. 아침 진입 후에 전달된 야간 파일로는 그날 아침의 의사결정을 정당화할 수 없습니다.

수량의 의미도 파악해야 합니다. 참고용 재고 피드에는 여러 고객이 공유하는 재고가 표시될 수 있습니다. 그 수량이 반드시 고객 계좌에 배정된다는 약속은 아닙니다. 실제 대차 확인 요청과 응답이 있다면 피드와 함께 보존하세요.

과거 대차 데이터가 없어도 신호는 연구할 수 있습니다. 대차 가능성을 전제로 한 결과라고 표시하고, 진입 가능 여부와 금리 가정이 결과를 어떻게 바꾸는지 보여주세요. 오늘의 용이 대차 목록으로 과거에도 공매도가 가능했음을 입증할 수는 없습니다.

유용한 스트레스 테스트는 종목 특성을 반영합니다. 대차 제약에 가장 크게 노출된 종목의 거래를 제거하거나 수량을 제한하고, 해당 종목의 금리를 여러 수준으로 바꿔 보세요. 진입 거래의 10%를 무작위로 삭제하면 문제를 완전히 놓칠 수 있습니다. 가장 좋아 보이는 가격 움직임이 특히 대차하기 어려운 종목에 몰려 있을 수 있습니다.

청산 규칙이 모든 청산을 통제하지는 않습니다

최대 보유 기간을 3거래일로 정했습니다. 대차 제공처와 브로커는 그 전략 문서에 서명하지 않았습니다.

리콜이 발생하면 대체 대차로 이어질 수도 있고, 브로커 절차에 따라 강제 청산될 수도 있습니다. 모든 리콜을 즉시 시장가 매수로 처리해서는 안 됩니다. 발생 가능한 결과를 모델링하고, 기록이 있다면 실제 알림과 기한을 재현하세요.

그런 기록이 없다면 대체 대차 실패 가정과 강제 청산 시점을 명확히 정한 별도의 스트레스 시나리오를 보고하세요. 청산 시 체결 비용도 포함하세요. 이 시나리오가 과거 증거에 근거한 재구성과 구분되도록 하세요.

다음 실행에서는 각 후보 거래의 경로를 추적할 수 있게 하세요. 요청 주식 수, 대차 판단, 배정 주식 수, 체결 주식 수, 일별 대차 비용, 청산 사유를 기록합니다. 대차 제약이 전략의 수익 우위가 발생하는 것으로 보이는 지점을 제거하는지 확인할 수 있도록 거부된 후보도 결과에 남기세요.

그런 다음 시뮬레이션에서 수익이 가장 컸던 10건을 다시 살펴보세요. 각 거래 옆에 주식을 빌릴 수 있었고 포지션을 계속 보유할 수 있었음을 뒷받침하는 근거를 적으세요. 그 자리가 비어 있다면 다음 연구 과제가 무엇인지 알 수 있습니다.

공매도주식 대차주식백테스팅
← 전체 글