로그수익률 계산법: 단순수익률과 결과가 달라지는 이유

오늘 10% 오르고 내일 10% 내리면 원금으로 돌아올 것처럼 보입니다. 하지만 100원이 110원이 된 뒤 10% 하락하면 가격은 99원입니다. 수익률을 단순히 더할 때 생기는 오차입니다.

단순수익률과 로그수익률은 같은 가격 변화를 서로 다른 방식으로 표현합니다. 어느 하나가 항상 더 정확한 것이 아니라, 기간을 연결하는 방법과 최종 결과를 해석하는 방법이 다릅니다.

이 글의 핵심

  • 단순수익률은 기간별 값을 곱해서 누적합니다.
  • 로그수익률은 기간별 값을 더할 수 있지만, 그 합은 아직 단순 누적수익률이 아닙니다.
  • 실제 투자 수익률로 읽으려면 로그수익률 합에 exp(x)-1을 적용해야 합니다.

단순수익률과 로그수익률은 무엇이 다른가

단순수익률은 현재 가격을 이전 가격으로 나눈 뒤 1을 뺍니다.

단순수익률 = 현재 가격 ÷ 이전 가격 - 1

로그수익률은 두 가격의 비율에 자연로그를 적용합니다. 단순수익률을 이미 계산했다면 ln(1 + 단순수익률)로도 같은 값을 구할 수 있습니다.

로그수익률 = ln(현재 가격 ÷ 이전 가격) = ln(1 + 단순수익률)

하루처럼 짧은 기간에 등락폭이 작으면 두 값은 비슷합니다. 등락폭이 커질수록 차이가 커지므로, 계산 결과에 어떤 수익률을 사용했는지 밝혀야 합니다.

가격 변화 단순수익률 로그수익률
100 → 110 +10.00% +9.53%
100 → 150 +50.00% +40.55%
150 → 75 -50.00% -69.31%

50% 상승과 50% 하락을 더하면 왜 틀릴까

100원이 150원으로 오른 뒤 75원으로 내려왔다고 가정하겠습니다. 두 기간의 단순수익률은 +50%와 -50%입니다. 이를 더하면 0%지만 실제 가격은 100원에서 75원으로 줄었으므로 누적수익률은 -25%입니다.

단순수익률은 더하는 대신 성장 배수를 곱해야 합니다.

(1 + 0.50) × (1 - 0.50) - 1 = -0.25

같은 경로의 로그수익률은 +40.55%와 -69.31%이며 합은 -28.77%입니다. 이 값은 로그 단위의 누적값입니다. 실제 수익률로 바꾸면 -25%가 됩니다.

exp(-0.2877) - 1 = -0.25

단순수익률과 로그수익률의 누적 방법 비교

차트 위쪽은 단순수익률의 산술합이 실제 결과와 어긋나는 이유를 보여 줍니다. 아래쪽 두 선은 단순수익률을 복리로 누적한 값과 로그수익률을 더한 뒤 다시 변환한 값입니다. 계산이 맞으면 두 선은 겹칩니다.

로그수익률을 사용하는 이유는 시간 가법성이다

로그수익률의 가장 실용적인 성질은 여러 기간의 값을 더할 수 있다는 점입니다. 가격 비율의 곱이 로그 안에서는 합으로 바뀌기 때문입니다.

예를 들어 일별 로그수익률을 모두 더하면 전체 기간의 로그수익률이 됩니다. 일별·주별·월별 분석을 같은 방식으로 연결하거나 시계열 모형에서 변화를 다룰 때 편리합니다.

반면 최종 계좌 수익률, 종목별 투자금의 손익, 여러 자산을 섞은 포트폴리오 수익률은 단순수익률이 더 직접적입니다. 특히 여러 종목의 로그수익률을 투자 비중으로 더한 값은 일반적으로 포트폴리오의 실제 단순수익률과 같지 않습니다. 로그수익률의 가법성은 시간 방향에 적용되는 성질이지 모든 합산 문제에 적용되는 규칙이 아닙니다.

삼성전자 일봉으로 두 누적값을 비교했다

삼성전자 수정주가 일봉을 2021년 1월부터 2025년 12월까지 고정해 계산했습니다. 첫 종가는 약 74,428원, 마지막 종가는 약 119,521원이었으며 총 1,222개 관측값을 사용했습니다.

계산 방법 결과 해석
처음과 마지막 가격 비교 +60.59% 실제 기간 수익률
일별 단순수익률 복리 누적 +60.59% 가격 비교와 일치
일별 단순수익률 산술합 +65.08% 복리 효과를 반영하지 못함
일별 로그수익률 합 +47.37% 로그 단위 누적값
로그수익률 합을 exp(x)-1로 변환 +60.59% 실제 기간 수익률과 일치

단순수익률을 올바르게 곱한 결과와 로그수익률을 올바르게 변환한 결과의 최대 차이는 10⁻¹⁴보다 작아 부동소수점 오차 수준이었습니다. 두 방식이 서로 다른 투자 결과를 만드는 것이 아니라, 같은 가격 경로를 다른 단위로 나타낸다는 뜻입니다.

로그수익률이라고 정규분포가 되는 것은 아니다

로그 변환은 가격 비율의 곱을 합으로 바꾸고 -100% 근처의 비대칭을 다루기 쉽게 만듭니다. 그렇다고 실제 주식 수익률이 자동으로 정규분포가 되는 것은 아닙니다.

같은 삼성전자 표본에서 일별 로그수익률의 왜도는 0.19, 초과첨도는 2.53이었습니다. 정규분포의 왜도와 초과첨도 기준값은 각각 0이므로 이 표본에도 비대칭과 두꺼운 꼬리가 남아 있습니다. 표본과 기간이 바뀌면 숫자도 달라지지만, 로그 변환만으로 급등락과 변동성 집중이 사라진다고 가정해서는 안 됩니다.

Rama Cont의 금융수익률 실증 연구도 여러 시장의 수익률에서 두꺼운 꼬리와 변동성 군집 같은 통계적 특징을 정리합니다. 통계 모형을 선택할 때는 수익률 이름보다 실제 분포를 먼저 확인해야 합니다.

파이썬으로 계산할 때는 누적과 변환을 함께 적는다

먼저 필요한 패키지를 설치합니다.

TEXT
pip install numpy yfinance

아래 코드는 삼성전자 수정주가를 받아 단순수익률과 로그수익률을 계산하고, 두 누적 결과가 같은지 확인합니다. 차트 생성과 파일 저장 코드는 포함하지 않았습니다.

PYTHON
import numpy as np
import yfinance as yf

price_data = yf.download(
    "005930.KS",
    start="2021-01-01",
    end="2026-01-01",
    auto_adjust=True,
    progress=False,
)
close_price = price_data["Close"].squeeze().dropna()

simple_return = close_price.pct_change(fill_method=None).dropna()
log_return = np.log1p(simple_return)

total_return_from_prices = close_price.iloc[-1] / close_price.iloc[0] - 1
compounded_simple_return = (1 + simple_return).prod() - 1
summed_log_return = log_return.sum()
converted_log_return = np.expm1(summed_log_return)

print(f"가격으로 계산한 누적수익률: {total_return_from_prices:.2%}")
print(f"단순수익률 복리 누적: {compounded_simple_return:.2%}")
print(f"로그수익률 합: {summed_log_return:.2%}")
print(f"로그수익률 합의 변환값: {converted_log_return:.2%}")

pandas.Series.pct_change()는 이름과 달리 10을 곱하거나 100을 곱한 백분율이 아니라 소수 형태의 변화율을 반환합니다. pandas 공식 문서도 이를 fractional change로 설명합니다.

np.log1p(x)ln(1+x), np.expm1(x)exp(x)-1을 계산합니다. 작은 값에서도 직접 더하고 빼는 것보다 수치적으로 안정적인 함수입니다. 자세한 정의는 NumPy log1p 문서에서 확인할 수 있습니다.

어떤 수익률을 써야 할까

목적 우선 사용할 값 확인할 점
계좌 손익과 투자 성과 보고 단순수익률 기간별 값을 복리로 누적
가격 시계열의 기간 합산 로그수익률 합을 실제 수익률로 다시 변환
여러 종목의 포트폴리오 수익률 종목별 단순수익률 투자 비중과 리밸런싱 반영
분포·변동성 모형 목적에 맞는 수익률 정규성을 먼저 가정하지 않고 검정

수익률을 선택할 때는 퀀트 분석에는 로그수익률처럼 도구를 먼저 정하지 않는 편이 좋습니다. 최종 투자 성과를 보여 줄지, 시간에 따라 값을 합산할지, 여러 자산을 결합할지를 먼저 정하면 계산 방식도 분명해집니다.

계산할 때 자주 생기는 네 가지 오류

  1. 일별 단순수익률을 그대로 더해 누적수익률이라고 표시합니다.
  2. 로그수익률 합을 변환하지 않고 계좌 수익률처럼 읽습니다.
  3. 여러 종목의 로그수익률을 비중 합산해 실제 포트폴리오 수익률로 사용합니다.
  4. 결측 가격을 자동으로 채워 거래가 없던 날의 수익률을 0으로 만듭니다.

수익률 계산은 짧지만 입력 가격과 누적 규칙이 다르면 백테스트 전체 결과가 달라집니다. 수정주가, 결측치, 거래일 정렬도 수익률 식과 함께 기록해야 합니다.


이 글은 수익률 계산 방법을 설명하기 위한 교육용 자료입니다. 예시는 특정 종목의 매수·매도 추천이나 미래 수익을 의미하지 않으며, 실제 투자 판단과 책임은 투자자 본인에게 있습니다.