시장에 오래 돌아다니는 말이 두 개 있다. “갭은 메워진다"와 “갭 뜨면 쫓아가지 말고 눌림을 기다려라”. 둘은 같은 믿음의 다른 표현이다. 시가가 전날 종가에서 멀리 떨어져 열리면 장중에 그 거리를 되돌린다는 것.
8월 21일에 이 믿음을 9개월치 지수 데이터로 재봤고, 그 결과를 근거로 봇에 규칙 하나를 넣었다. 야간선물로 다음 날 갭을 미리 읽고, 지수가 갭 하락으로 열릴 것 같은 날은 시가에 나눠 사지 않고 종가에 한 번에 산다는 규칙이다. 그 뒤 열흘이 지났다. 지난 글에서 여섯 번 잰 지표 하나가 표본을 나누자 절반으로 줄어드는 걸 봤기 때문에, 이번에는 규칙을 만든 계산 자체를 표본을 늘려 다시 해봤다.
결론부터 적으면 넷이다. 18거래일 표본에서 야간선물과 다음 시가 갭의 방향은 16일 일치했지만 크기는 자주 달랐다. 큰 갭이 발생한 날의 시가→종가 평균은 갭과 같은 방향이었으나, 추세추종의 수익성을 확정할 근거는 부족했다. 보고서 종목의 지수 갭 하락일 시가→종가 평균 수익률은 약 -1%였다. 그리고 이 표본의 누적 로그수익은 밤에 집중됐고, 낮의 누적 로그수익은 반올림하면 0에 가까웠다. 모두 해당 표본의 관측이며 미래 성과 예측은 아니다.
2026-09-13 정정: 원본 계산 코드의
log1p(...).cumsum() * 100을 확인해 누적 로그수익률을 일반 수익률로 설명한 부분과 하루 수익률 합산식을 고쳤습니다. 8월 18일 요일 및 표본 밖 성과를 단정한 표현도 수정했습니다. 원시 데이터 전체를 다시 계산한 검증은 아니며 기존 통계치는 당시 표본의 관측값입니다.
무엇을 어떻게 셌나
계산 과정을 확인하려면 아래 계산식과 재현 자료에서 실행 코드와 가상 입력 예제를 받을 수 있다. 지수의 밤·낮 수익률 계산을 직접 확인하는 자료이며, 당시 원시 데이터 전체를 공개한 것은 아니다.
| 항목 | 조건 |
|---|---|
| 지수 | 코스피 시가·종가, 2025-06-04 ~ 2026-08-31, 304거래일 |
| ETF | KODEX 200(069500) 시가·종가, 같은 기간. 매매 비용은 왕복 0.05%로 가정 |
| 야간선물 | 봇이 매일 아침 기록한 코스피200 야간선물 종가와 그날 지수 시가 갭, 2026-08-05 ~ 08-31, 18거래일 |
| 보고서 종목 | 이 블로그 일일 보고서 49편의 verdict 390행(국내 종목, 43거래일) × 종목 일봉 |
용어를 하나만 정하자. 갭은 오늘 시가가 전날 종가에서 얼마나 떨어져 열렸는지, 장중은 시가에서 종가까지의 움직임이다. 단순수익률 기준으로 하루 수익률은 (1 + 갭 수익률) × (1 + 장중 수익률) - 1이다. 두 수익률의 합만 쓰면 곱항이 빠진다. 로그수익률로 바꾸면 ln(1 + 하루 수익률) = ln(1 + 갭 수익률) + ln(1 + 장중 수익률)로 정확히 더할 수 있다.
야간선물은 갭을 얼마나 미리 아는가
봇의 규칙은 “야간선물이 떨어졌으면 내일 지수도 갭 하락으로 열린다"는 전제 위에 서 있다. 처음 이 전제를 세울 때 표본은 12거래일이었고 거의 1:1로 보였다. 지금은 18거래일이다.
상관은 0.86, 부호가 맞은 날은 18일 중 16일(89%)이다. 방향 예보로는 쓸 만하다. 그런데 크기는 다르다. 평균 오차가 1.04%포인트이고, 18일 중 8일이 1%포인트 넘게, 3일이 2%포인트 넘게 틀렸다.
그 3일이 무엇이었는지 봇의 기록과 보고서를 맞춰 봤다.
| 날짜 | 야간선물 | 실제 갭 | 무슨 날이었나 |
|---|---|---|---|
| 8월 18일(화) | -0.36% | +2.51% | 광복절 대체휴일을 포함해 사흘 닫힌 뒤 첫 개장 |
| 8월 27일(목) | +0.64% | +3.04% | 엔비디아 실적이 새벽 5시 20분에 발표. 야간장은 6시에 마감 |
| 8월 31일(월) | -0.36% | -2.73% | 주말 사이 관세·중동 뉴스가 쌓인 뒤 첫 개장 |
셋 다 야간장이 닫힌 뒤, 혹은 마감 직전에 정보가 도착한 날이다. 27일은 특히 선명하다. 야간선물 10분봉을 보면 5시 20분에 -0.01%였다가 5시 40분에 +0.62%로 튀고 6시에 +0.64%로 끝났다. 발표 뒤 40분 동안 거래된 건 200계약 남짓이었다. 정보는 봤지만 소화할 시간과 참가자가 없었고, 주간장은 그 다섯 배 크기로 열렸다.
그러니 “야간선물로 갭을 안다"는 말은 이렇게 고쳐야 한다. 방향은 알고 크기는 모른다. 그리고 연휴·주말 뒤와 새벽 발표가 있는 날은 방향도 장담 못 한다.
갭은 메워지는가
이 절은 갭과 시가→종가 수익률의 관계를 분석한다. 장중에 전일 종가를 한 번이라도 터치했는지는 세지 않았다. 따라서 장중 고가·저가로 정의하는 ‘갭 메움 확률’을 계산한 결과로 읽어서는 안 된다.
304거래일에서 갭과 장중의 상관은 +0.17이다. 부호가 양수라는 게 핵심이다. 갭이 메워진다면 갭 상승 날 장중은 내려가야 하고 상관은 음수여야 한다. 반대로 나왔다.
구간을 나눠 보면 그림이 더 분명하다. 1% 넘게 갭 하락한 날 장중은 평균 -0.8~-0.9%였고, 2% 넘게 갭 상승한 날은 +0.47%였다. 갭이 열린 방향으로 장중도 더 갔다. 되돌림이 아니라 지속이다.
다만 한 가지 단서가 있다. 순위 상관은 0.07로 거의 0이다. ±0.5% 안의 작은 갭 99일은 장중과 아무 관계가 없고, 지속은 큰 갭에서만 나타난다. “갭이 지속된다"가 아니라 “큰 갭은 지속되는 편이다"가 정확한 문장이다.
그러면 갭 방향대로 사면 돈이 되나
지수는 살 수 없으니 KODEX 200으로 바꿔 재봤다. 갭이 일정 크기를 넘긴 날 시가에 갭 방향대로 사서(갭 하락이면 매도) 종가에 청산하고, 왕복 0.05%를 뺀다. 반대 방향, 즉 되돌림에 베팅하는 쪽도 같이 뒀다.
갭 2% 이상인 83일에서 추세추종은 하루 +0.34%, 되돌림 베팅은 -0.44%였다. 3% 이상 45일로 좁히면 +0.78% 대 -0.88%다. 방향은 일관되게 지속 쪽이다.
그런데 t값을 보면 1.1과 1.7이다. 우연과 구별할 수 있는 크기가 아니다. 되돌림 베팅이 전부 음수인 건 독립된 증거처럼 보이지만 실은 같은 숫자의 뒷면이다. 추세추종이 +0.34%면 되돌림은 비용을 두 번 뺀 -0.44%가 되는 게 산술이다. 그러니 이 그림이 말하는 건 하나다. 이 표본에서 비용을 뺀 되돌림 전략의 평균은 음수였지만, 이를 미래의 확정 손실로 일반화할 수는 없다. 추세추종의 수익성도 아직 확정할 수 없다.
여기서 열흘 전의 내가 틀린 지점이 나온다. 8월 21일에 9개월치로 처음 쟀을 때는 t가 2를 넘었다. 그래서 규칙을 넣었다. 그 뒤 여섯 거래일 동안 2% 넘는 갭이 세 번 왔고, 셋 다 되돌렸다. 25일은 -2.79%로 열어 장중 +3.65%, 27일은 +2.96%로 열어 -1.59%, 31일은 -2.54%로 열어 +3.03%. 사흘 평균 -2.81%다. 표본 83일 중 사흘이 t를 1.5에서 1.1로 끌어내렸다. (처음 계산에 쓴 시세 소스에는 빠진 거래일이 있었다. 같은 9개월을 지금 소스로 다시 재면 처음부터 t 1.5였다.)
한 가지 더. 2% 넘는 갭이 나온 날을 달로 세어 보면 2025년 6~9월은 0일이고, 2026년 3월 한 달만 17일이다. 이 전략의 표본 83일은 사실상 2026년 상반기의 고변동 국면 하나다. 국면이 하나면 그 국면이 끝날 때 전략도 끝난다.
밤과 낮
이 글에서 가장 큰 숫자는 여기 있다. 원본 계산 코드에서는 갭(밤)과 장중(낮)의 단순수익률 각각에 log1p를 적용하고 304일 동안 누적한 뒤 100을 곱했다. 아래 차트의 단위는 누적 로그수익률(%)이며, 투자금의 일반적인 누적 수익률과 다르다.
기존 글은 차트의 약 93이라는 값을 일반 수익률 +93%로 설명했지만, 이는 **누적 로그수익률 약 93%**였다. 일반 누적 수익률로 환산하는 식은 exp(누적 로그수익률 / 100) - 1이며, 93을 대입하면 약 +153%다. 이는 반올림한 차트 값의 환산 예시이지 원시 시세를 다시 계산한 확정값은 아니다. 차트에서 밤의 누적 로그수익은 약 93, 낮은 반올림하면 0에 가까웠다. 하루 평균으로 밤은 +0.32%(t 3.2, 승률 63.5%), 낮은 +0.02%(t 0.2)다.
이게 몇 달의 운인지 확인하려고 셋으로 나눴다.
| 기간 | 밤(오버나이트) | 낮(장중) |
|---|---|---|
| 2025-06 ~ 10 | +0.27%/일 (t 4.2) | +0.16% (t 1.9) |
| 2025-11 ~ 2026-03 | +0.11% (t 0.6) | +0.13% (t 0.7) |
| 2026-04 ~ 08 | +0.58% (t 2.5) | -0.21% (t -0.7) |
밤은 세 구간 모두 양수고 둘에서 유의하다. 낮은 어느 구간에서도 유의하지 않다. 가장 크게 오른 5일을 빼도 밤은 +0.23%(t 2.5)로 남는다. 요일로 보면 화·수·목 밤이 +0.41~0.55%, 월·금 밤이 +0.06~0.07%다.
이건 한국만의 현상이 아니다. 미국 지수에서도 수익이 거의 전부 장외 시간에 난다는 관찰은 2000년대 후반부터 반복해서 보고됐다. 설명은 여럿인데 — 밤사이 뉴스 위험을 떠안는 보상이라는 것, 개장 직후 유동성을 대는 쪽이 받는 프리미엄이라는 것 — 무엇이 맞는지는 아직 정리되지 않았다.
주의할 점이 둘 있다. 첫째, 밤을 “사려면” 매일 종가에 사고 시가에 팔아야 하고, 그 왕복 비용과 밤사이 갭 위험을 통째로 진다. 위 숫자는 비용 전이다. 둘째, 이 표는 지수다. 종목 단위에서는 다를 수 있다. 그래도 한 문장은 남는다. 이 표본에서 장중의 누적 로그수익은 반올림하면 0에 가까웠다. 이를 모든 장중 매매의 성과로 일반화하거나, 통계적으로 유의하지 않다는 이유만으로 실제 수익이 정확히 0이라고 단정해서는 안 된다.
보고서에 오른 종목은 갭 하락 날 어떻게 됐나
봇의 규칙이 실제로 겨누는 대상은 이 블로그 일일 보고서의 verdict 종목이다. 390행을 그날 지수가 갭 하락으로 열렸는지로 갈라, 시가에 사서 종가에 팔았을 때를 봤다.
분할매수 verdict 종목은 지수 갭 하락 날 시가→종가 -1.33%(t -2.2, 55건), 그렇지 않은 날 +0.40%였다. 그런데 이건 verdict의 문제가 아니다. 전체 390행을 같은 기준으로 가르면 갭 하락 날 -0.98%(t -3.0, 192건), 아닌 날 +0.06%다. 어떤 판정을 받았든, 지수가 갭 하락으로 열린 날 보고서 종목을 시가에 사면 종가까지 1% 가까이 잃었다. 종목 자체도 이미 -1.2% 갭 하락으로 열린 뒤였다.
“눌림을 기다린다"는 전략은 눌림이 어디선가 멈춘다는 전제를 깔고 있다. 갭 하락 날에는 그 전제가 틀린다. 시가가 눌림이 아니라 시작점이었다. 그래서 봇은 갭 하락이 예상되는 날 시가 분할을 접고 종가에 사도록 바꿨고, 이 부분은 표본을 늘려도 살아 있다.
단, 이 규칙의 앞단인 “야간선물로 갭 하락을 미리 안다"는 3장에서 흔들렸다. 8월 26일처럼 야간선물이 +1.20%인데 실제로는 -0.42%로 열린 날은 이 규칙이 잡지 못한다. 방향 일치율 89%면 규칙은 살지만, 열 번에 한 번은 반대로 열리는 걸 감수하는 규칙이다.
표를 스무 칸 봤으니 지난 글의 기준을 여기도 적용해야 한다. 눌림목 대기 종목의 갭 상승 날 3일 보유가 -3.8%(t -2.8)로 튀어나왔는데, 스무 칸 중 하나가 t 2를 넘는 건 아무 신호가 없어도 생기는 일이다. 채택하지 않는다.
그래서 어떻게 쓰나
| 질문 | 15개월치 답 | 확신 |
|---|---|---|
| 갭은 메워지나 | 이 표본에서 큰 갭은 지속 쪽 평균을 보였다 | 제한적: 한 시장·기간의 관측 |
| 갭 방향대로 사면 돈이 되나 | 방향은 맞지만 t 1.1. 표본은 2026년 한 국면 | 낮음 |
| 야간선물로 갭을 알 수 있나 | 표본에서 방향 일치 16/18일, 평균 오차 1.04%p. 오차 상한은 아님 | 제한적: 18일 표본 |
| 갭 하락 날 시가 매수 | 관측 표본 평균 약 -1% | 제한적: 같은 날 종목 간 상관과 표본 선택 영향 |
| 수익은 어디서 나나 | 표본의 누적 로그수익은 밤에 집중 | 제한적: 비용 전, 기간 밖 성과 미검증 |
봇에서는 갭 하락 날 종가 매수 규칙을 유지하고, ETF 갭 추세추종은 관측만 하는 상태로 둔다. 실제 매매 없이 신호와 결과만 쌓아 표본이 100을 넘고 t가 2를 넘는지 본다. 지금 t 1.1이 1.5로 회복되면 그때 다시 쓰고, 계속 내려가면 8월 21일의 t 2는 고변동 국면 하나가 만든 숫자였던 것이 된다.
방법 쪽에 남은 교훈은 지난 두 글과 이어진다. 첫 글은 표본이 작으면 착시가 생긴다였고, 둘째 글은 많이 재면 착시가 생긴다였다. 이번은 결론을 내린 뒤에도 표본은 계속 들어오고, 100 미만의 표본에서 t 2는 여섯 거래일에 무너질 수 있다는 것이다. 규칙을 넣은 날이 측정을 멈추는 날이 되면 안 된다.
계산식과 재현 자료
숫자를 읽는 데서 그치지 않고 계산 과정을 확인할 수 있도록 지수의 갭·장중 수익률 계산 코드를 공개한다. 별도 패키지나 계정 없이 Python 3.10 이상에서 실행할 수 있다.
- 계산 코드 내려받기 — reproduce.py
- 가상 입력 예제 — sample.csv
- 예제의 실행 결과 — sample-expected.json
- 입력 조건·실행 방법·한계 — README.txt
시가와 종가로 어떤 값을 계산하나
전 거래일 종가를 C_prev, 오늘 시가를 O, 오늘 종가를 C라고 두면 다음과 같다. 수익률은 계산할 때 소수로 사용한다. 예를 들어 0.01은 1%다.
| 계산 항목 | 식 | 뜻 |
|---|---|---|
갭 수익률 g | O / C_prev - 1 | 전일 종가에서 오늘 시가까지 |
장중 수익률 i | C / O - 1 | 오늘 시가에서 종가까지 |
| 하루 수익률 | (1 + g) × (1 + i) - 1 | 전일 종가에서 오늘 종가까지 |
| 누적 로그수익률(%) | 100 × Σ ln(1 + r) | 날짜별 로그수익률을 합산 |
| 일반 누적 수익률(%) | 100 × (exp(Σ ln(1 + r)) - 1) | 같은 기간의 복리 수익률 |
| 표본 t값 | 평균 / (표본표준편차 / √n) | 독립 표본을 가정한 참고 통계 |
갭이 +10%, 장중이 -10%이면 하루 수익률은 1.1 × 0.9 - 1 = -1%다. 두 비율을 단순히 더한 0%가 아니다. 같은 날의 갭·장중 로그수익률은 더할 수 있지만, 서로 다른 전략의 일반 수익률을 더해서 보유 수익률로 만들 수는 없다.
가상 가격으로 먼저 검산하기
제공하는 CSV는 계산 확인용 가상 가격이며 실제 코스피 시세가 아니다. 첫 행은 다음 날의 갭을 계산하기 위한 전일 종가다. 네 행을 입력하면 수익률 표본은 세 개가 된다.
python reproduce.py sample.csv
python reproduce.py sample.csv --daily-output sample-daily.csv
결과에서 gap.compound_pct는 +10%, intraday.compound_pct는 -10%, close_to_close.compound_pct는 -1%다. 각각의 누적 로그수익률은 약 9.531018%, -10.536052%, -1.005034%로 나온다. 소수점 끝자리에는 계산 오차가 있을 수 있다. 일별 출력에는 실제로 연결한 이전 행의 날짜도 남긴다.
실제 데이터로 바꿀 때
같은 지수의 날짜·시가·종가를 Date,Open,Close 열로 저장한다. 날짜는 오름차순이고 중복이 없어야 한다. 첫 분석일의 직전 거래일 종가가 포함된 행도 필요하다. 휴장일에 임의의 행을 추가하거나 빠진 거래일을 0으로 채우면 안 된다.
python reproduce.py my-kospi.csv --start 2025-06-04 --end 2026-08-31
my-kospi.csv는 독자가 준비한 실제 데이터 파일명이다. 코드가 시세를 자동으로 내려받지는 않는다. 당시 분석은 FinanceDataReader로 받은 코스피 시가·종가를 사용했다. 같은 기간이라도 수집 시점과 수정 이력, 누락 행이 다르면 숫자가 달라질 수 있다. 결과의 input_sha256은 어떤 입력 파일로 계산했는지 대조하는 값이며, 원자료의 정확성을 인증하는 값은 아니다.
어디까지 재현되는가
이 자료로 지수의 갭·장중·종가 간 수익률, 평균, 표본 t값, 상관, 누적 로그수익과 복리 환산을 계산할 수 있다. 본문에 사용한 304거래일 원시 자료와 야간선물 18일, 종목 판정 390행 전체가 포함된 것은 아니다. 따라서 가상 예제 실행을 본문 수치 전체의 재검증으로 해석해서는 안 된다. ETF 전략의 비용 차감과 구간별 분석도 이 코드의 범위 밖이다.
코드는 거래소 달력을 조회하지 않는다. 중간 거래일이 빠지면 여러 날의 변화를 하나의 갭으로 계산할 수 있으므로 입력 단계에서 달력과 대조해야 한다. 수익률은 비용 전이며 지수 자체를 같은 가격에 매매할 수 있다는 뜻도 아니다. t값은 자기상관과 다중검정을 보정하지 않았고, 시가·종가만으로 장중 갭 메움 여부를 판단하지 않는다.
이 글은 공개 시세 데이터와 자체 수집한 관측 기록을 정리한 것으로, 특정 종목이나 매매 시점에 대한 권유가 아닙니다. 오버나이트 수익률은 비용 전 숫자이고 밤사이 급변 위험을 포함합니다. 야간선물 표본은 18거래일로 짧습니다. 분석 방법과 데이터 출처는 소개 페이지에, 문의는 연락처에 있습니다.