본문 바로가기

Quant

파이썬 퀀트 – 수집한 종가 데이터로 CAGR, MDD 계산하기

반응형

퀀트 투자에서 전략의 수익성을 제대로 판단하려면, 단순히 “올랐다, 떨어졌다”는 말로는 부족합니다.
실제 성과를 정량적으로 평가하는 지표들이 필요합니다.

대표적인 두 가지 성과 지표가 바로
**CAGR (Compound Annual Growth Rate, 연복리 수익률)**과
**MDD (Maximum Drawdown, 최대 낙폭)**입니다.

이 지표들은 퀀트 전략이 단기 수익률은 좋아 보여도
장기적으로 지속 가능했는지, 손실 구간이 얼마나 컸는지를 보여주는 핵심 도구입니다.

이번 글에서는 **파이썬(Python)**을 사용해
이미 수집한 종가 데이터를 기반으로
CAGR과 MDD를 직접 계산하고 시각화하는 방법을 알려드리겠습니다.

파이썬 CAGR, MDD 계산

 

1. 먼저 지표 개념부터 정확히 이해하자

✅ CAGR (연복리 수익률)

CAGR은 투자 시작일부터 종료일까지의 전체 수익률을, 매년 같은 비율로 발생한 것처럼 환산한 수익률입니다.
수익률의 ‘속도’를 보여주는 지표로, 퀀트 전략의 장기 성과 비교에 매우 유용합니다.

CAGR 공식:
(최종자산/초기자산)(1/투자연수)−1(최종 자산 / 초기 자산)^(1 / 투자 연수) - 1

예를 들어, 5년 동안 자산이 100에서 200으로 증가했다면
CAGR은 약 14.87%입니다. 매년 14.87%씩 불어난 것과 같은 효과란 뜻이죠.

✅ MDD (최대 낙폭)

MDD는 투자 중 최고점에서 최저점까지 자산이 얼마나 하락했는지를 백분율로 나타낸 지표입니다.

MDD 공식:
(최고점대비최저점하락률)(최고점 대비 최저점 하락률)
즉,
(최고값−최저값)/최고값(최고값 - 최저값) / 최고값

수익률이 높더라도 MDD가 너무 크면 감당하기 어려운 손실 구간이 존재했다는 뜻입니다.


2. 수집한 종가 데이터로 수익률 시계열 만들기

먼저, Investing.com이나 네이버 금융 등에서
CSV 형태로 저장한 일별 종가 데이터를 불러옵니다.

import pandas as pd

# 종가 데이터 불러오기
df = pd.read_csv("samsung_10yr_close.csv")
df["Date"] = pd.to_datetime(df["Date"])
df = df.sort_values("Date")
df = df.reset_index(drop=True)

 

▶️ 누적 수익률 계산

투자 시작일 기준으로 누적 수익률을 계산합니다.
가장 처음 날의 종가를 기준점으로 삼습니다.

df["Cumulative Return"] = df["Close"] / df["Close"].iloc[0]

 

이제 이 데이터를 기반으로 CAGR과 MDD 계산을 해보겠습니다.


3. CAGR과 MDD 계산 함수 구현 (파이썬 코드)

✅ CAGR 계산

def calculate_cagr(dataframe):
    start_value = dataframe["Close"].iloc[0]
    end_value = dataframe["Close"].iloc[-1]
    
    start_date = dataframe["Date"].iloc[0]
    end_date = dataframe["Date"].iloc[-1]
    
    days = (end_date - start_date).days
    years = days / 365.25
    
    cagr = (end_value / start_value) ** (1 / years) - 1
    return cagr

 

✅ MDD 계산

def calculate_mdd(dataframe):
    cum_returns = dataframe["Cumulative Return"]
    peak = cum_returns.cummax()
    drawdown = (cum_returns - peak) / peak
    mdd = drawdown.min()
    return mdd

 

✅ 실행

cagr = calculate_cagr(df)
mdd = calculate_mdd(df)

print("연복리 수익률 (CAGR): {:.2%}".format(cagr))
print("최대 낙폭 (MDD): {:.2%}".format(mdd))
 

예시 출력:

 
연복리 수익률 (CAGR): 13.26%
최대 낙폭 (MDD): -28.74%

4. 시각화와 해석 – 수익률 그래프 함께 그리기

단순 숫자만 보는 것보다
시각화하면 전략의 흐름을 한눈에 파악할 수 있습니다.

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))
plt.plot(df["Date"], df["Cumulative Return"], label="누적 수익률")
plt.title("퀀트 전략 누적 수익률 곡선")
plt.xlabel("날짜")
plt.ylabel("수익률 (배)")
plt.legend()
plt.grid(True)
plt.show()

 

이 그래프는 시간이 흐르며 전략이 어떻게 성장했고,
어떤 구간에서 손실이 발생했는지 시각적으로 보여줍니다.

👉 만약 MDD가 -50% 가까이 나왔다면,
전략이 과거에 큰 손실을 경험했다는 뜻이고
심리적으로도 견디기 어렵다는 신호입니다.

👉 반면 CAGR이 15% 이상인데 MDD는 10% 이하면
해당 전략은 **높은 수익 대비 리스크가 낮은 ‘우수한 전략’**이라고 볼 수 있습니다.


✅ 마무리: 퀀트는 수익률보다 ‘수익의 질’이 중요하다

많은 투자자들이 “어떤 전략이 수익이 높았는가?”에만 집중합니다.
하지만 퀀트에서는 그 수익이 얼마나 안정적으로 이어졌는가가 훨씬 중요합니다.

그래서 CAGR과 MDD는 단순 수익률 이상의 의미를 가집니다.
CAGR은 시간 대비 성장률,
MDD는 최악의 손실을 보여주는 위험관리 지표이기 때문입니다.

파이썬으로 이 지표들을 계산하는 과정을 익히면
단순히 ‘감’에 의존한 전략이 아닌,
데이터에 기반한 전략 검증 루틴을 갖출 수 있습니다.

다음 글에서는
Sharpe Ratio(샤프 지수),
Sortino Ratio(소르티노 지수)
수익의 '질'을 나타내는 심화 지표들도 함께 다뤄보겠습니다.