가상 예제 · 계산 과정 공개

밤과 낮의 수익률을 더하면 안 되는 이유

전일 종가·시가·종가 세 값으로 갭과 장중 수익률을 분해합니다. 가상 CSV와 실행 코드로 더하기에서 생기는 오차를 확인합니다.

2026-10-09 개편: 이전 글의 확인되지 않은 성과 수치·단정적 설명을 내려놓고, 아래 가상 입력으로 직접 계산하는 학습 글로 다시 썼습니다. 실제 시장에서 얻은 성과가 아닙니다. 수정 전 원문과 변경 이유를 확인할 수 있습니다.

전일 종가 100, 오늘 시가 110, 오늘 종가 99인 가상의 하루를 생각해 봅시다. 시가가 10% 높게 출발했고 장중에는 10% 내렸습니다. 둘을 더하면 0%지만, 전날부터 보유한 사람의 평가액은 100에서 99로 줄었습니다. 서로 다른 기준 금액으로 계산한 두 비율을 바로 더한 것이 문제입니다.

세 가격으로 세 수익률 만들기

구간계산결과
갭: 전일 종가 → 오늘 시가110 / 100 − 1+10%
장중: 오늘 시가 → 오늘 종가99 / 110 − 1−10%
하루: 전일 종가 → 오늘 종가99 / 100 − 1−1%

첫 구간은 100원이 기준이고, 두 번째는 110원이 기준입니다. 갭 수익률을 g, 장중 수익률을 d라고 하면 하루 수익률은 (1+g) × (1+d) − 1 = g+d+g×d입니다. 예제에서 빠뜨린 g×d는 0.1×−0.1 = −0.01, 즉 −1%포인트입니다.

이 공식은 투자 전략이 아니라 같은 세 가격을 다르게 표현한 항등식입니다. 언제 갭이 메워지는지, 장중에 얼마나 깊게 하락했는지, 주문이 체결되는지는 알려 주지 않습니다. 시가와 종가가 같아도 그 사이 가격 경로는 여러 가지일 수 있습니다.

로그를 쓰면 무엇이 달라질까

로그수익률은 가격 비율에 자연로그를 취합니다. 예제의 갭은 ln(1.1), 장중은 ln(0.9)입니다. 합은 ln(0.99)로, 하루 로그수익률과 정확히 같습니다. 100을 곱해 적으면 약 +9.5310, −10.5361, −1.0050입니다.

마지막 −1.0050을 일반 수익률 −1.0050%라고 읽으면 다시 단위가 섞입니다. 일반 수익률로 돌아오려면 exp(로그수익률)−1을 계산합니다. 가산 가능한 편리함과 독자가 익숙한 수익률 표현은 별개입니다.

공개 예제로 직접 재현하기

아래 입력은 실제 코스피 시세가 아닌 계산을 확인하기 위해 만든 가상 가격입니다. 첫 행은 다음 날 수익률의 기준 종가를 제공하므로 네 행에서 수익률 세 행이 나옵니다.

날짜시가종가
2026-08-24100110
2026-08-25121121
2026-08-26121108.9
2026-08-27108.9108.9

입력 CSV, Python 코드, 기대 출력을 같은 폴더에 받으세요. Python 3.10 이상에서 외부 패키지 없이 실행합니다.

python reproduce.py sample.csv

출력에서 갭의 누적 복리는 +10%, 장중은 −10%, 전체는 −1%입니다. max_compounding_identity_error는 0입니다. 날짜 필터를 쓴다면 필터 시작일 이전 종가도 필요합니다. 첫날의 갭을 계산할 기준을 잃으면 표본이 의도와 달라집니다.

같은 계산을 실제 자료에 적용하기 전

가격 조정 방식이 섞였는지, 행이 중복됐는지, 누락된 거래일이 있는지 먼저 확인합니다. 이 예제 코드는 직전 입력 행을 전일로 사용할 뿐 거래소 달력까지 검증하지 않습니다. 배당과 분할로 가격의 의미가 바뀌는 자료라면 조정 기준도 기록해야 합니다.

지수의 밤사이 변화가 곧 ETF로 얻을 수 있는 수익은 아닙니다. 실제로 거래할 상품, 주문 시점, 비용과 미체결을 별도로 모델링해야 합니다. 다음에는 반복 거래와 비용을 같은 기준으로 비교하는 예제를 읽어 보세요.