투자금 1억 원이 2억 원이 됐다면 누적수익률은 100%입니다. 숫자만 보면 훌륭한 결과지만, 그 수익을 2년 만에 만들었는지 10년 만에 만들었는지는 전혀 다른 이야기입니다.
누적수익률은 최종적으로 얼마나 벌었는지 알려주지만 그 결과를 만드는 데 걸린 시간은 반영하지 않습니다. 기간이 다른 투자와 전략을 비교하려면 수익을 같은 연 단위 속도로 바꿔야 합니다.
그 역할을 하는 지표가 CAGR(Compound Annual Growth Rate), 연평균 복리수익률입니다. 시작과 끝 사이에서 자산이 매년 같은 복리 속도로 성장했다고 가정했을 때의 연간 수익률입니다.
같은 100% 누적수익률도 2년에 달성하면 CAGR은 41.42%, 10년에 달성하면 7.18%입니다. 결과의 크기는 같지만 수익의 속도는 약 5.8배 차이 납니다.
성과지표 001 핵심 정리
- 누적수익률: 시작 자산이 최종적으로 얼마나 늘었는가
- CAGR: 그 증가를 매년 같은 복리 속도로 환산하면 얼마인가
- 100% 수익을 2년에 달성한 CAGR 41.42%, 10년에 달성한 CAGR 7.18%
- 비교 기간이 같으면 누적수익률과 CAGR의 전략 순위는 바뀌지 않음
- CAGR만으로 중간 낙폭과 회복 기간은 알 수 없음
1. CAGR은 어떤 질문에 답하는가
CAGR이 답하는 질문은 하나입니다.
이 투자가 매년 일정한 복리수익률로 성장했다고 가정하면 연평균 몇 %인가?
은행 금리처럼 실제로 매년 같은 수익이 발생했다는 뜻은 아닙니다. 첫해에 크게 오르고 다음 해에 하락했더라도 시작 자산과 최종 자산, 전체 기간이 같으면 CAGR은 하나의 일정한 속도로 압축됩니다.
따라서 CAGR은 서로 다른 기간의 성과를 비교할 때 유용합니다.
| 비교 상황 | 누적수익률만으로 충분한가 | CAGR의 역할 |
|---|---|---|
| 같은 전략의 3년 성과와 10년 성과 | 부족함 | 연 단위 속도로 환산 |
| 운용 시작일이 다른 두 펀드 | 부족함 | 기간 차이 보정 |
| 같은 4년 동안 운용한 두 전략 | 순위 비교는 가능 | 연평균 속도로 표현 |
| 중간 입출금이 반복된 계좌 | 부적합 | IRR·XIRR 같은 현금흐름 지표 필요 |
CAGR은 기간 차이를 제거하지만 위험 차이까지 제거하지는 않습니다. 같은 CAGR이라도 한 전략은 완만하게 성장하고 다른 전략은 큰 손실을 여러 번 겪을 수 있습니다.
2. CAGR 계산식
계산에 필요한 값은 세 개입니다.
- 시작 자산
- 최종 자산
- 투자 기간(년)
공식은 다음과 같습니다.
CAGR = (최종 자산 ÷ 시작 자산)^(1 ÷ 투자 연수) - 1
시작 자산이 100, 최종 자산이 200이라면 자산 배수는 2입니다.
| 투자 기간 | 계산 | CAGR |
|---|---|---|
| 2년 | 2^(1/2) – 1 | 41.42% |
| 10년 | 2^(1/10) – 1 | 7.18% |
2년 투자에서는 매년 41.42%씩 복리로 성장해야 100이 200이 됩니다. 10년 투자에서는 매년 7.18%씩 성장하면 같은 200에 도달합니다.
투자 기간에 정확히 1년 단위가 들어맞지 않으면 전체 경과 일수를 365.25로 나눠 연수를 계산할 수 있습니다. 시작일과 종료일을 어떻게 포함하는지에 따라 아주 작은 차이가 생길 수 있으므로 비교 대상에 같은 방식을 적용해야 합니다.
3. 연평균 수익률과 CAGR은 다르다
CAGR을 각 연도 수익률의 단순 평균으로 계산하면 안 됩니다.
첫해 +50%, 둘째 해 -20%인 투자를 생각해보겠습니다.
| 구분 | 값 |
|---|---|
| 1년 차 | +50% |
| 2년 차 | -20% |
| 연 수익률 단순 평균 | +15% |
| 2년 누적수익률 | +20% |
| CAGR | +9.54% |
100은 첫해에 150이 되고 둘째 해에 20% 하락해 120이 됩니다. 두 해의 수익률을 단순 평균하면 15%지만, 100을 2년 만에 120으로 만드는 실제 복리 속도는 연 9.54%입니다.
수익과 손실이 곱셈으로 누적되기 때문에 산술평균은 자산 성장률을 그대로 설명하지 못합니다. CAGR은 시작값과 최종값을 연결하는 기하평균에 가깝습니다.
4. Python으로 누적수익률과 CAGR 계산하기
별도 패키지 없이 실행할 수 있습니다.
def calculate_total_return(start_value: float, end_value: float) -> float:
if start_value <= 0.0:
raise ValueError("시작 자산은 0보다 커야 합니다.")
return end_value / start_value - 1.0
def calculate_cagr(start_value: float, end_value: float, years: float) -> float:
if start_value <= 0.0 or end_value <= 0.0:
raise ValueError("시작 자산과 최종 자산은 0보다 커야 합니다.")
if years <= 0.0:
raise ValueError("투자 기간은 0년보다 길어야 합니다.")
return (end_value / start_value) ** (1.0 / years) - 1.0
examples = [
{"name": "2년 투자", "start": 100.0, "end": 200.0, "years": 2.0},
{"name": "10년 투자", "start": 100.0, "end": 200.0, "years": 10.0},
]
for example in examples:
total_return = calculate_total_return(example["start"], example["end"])
cagr = calculate_cagr(example["start"], example["end"], example["years"])
print(f"{example['name']}: 누적수익률 {total_return:.2%}, CAGR {cagr:.2%}")
실행 결과는 다음과 같습니다.
2년 투자: 누적수익률 100.00%, CAGR 41.42%
10년 투자: 누적수익률 100.00%, CAGR 7.18%
최종 자산이 0 이하라면 일반적인 CAGR을 계산할 수 없습니다. 레버리지 전략처럼 계좌가 음수가 될 수 있는 경우에는 CAGR 하나보다 파산 여부와 손실 경로를 먼저 확인해야 합니다.
5. 같은 수익률 100%, 도착 속도는 다르다

왼쪽 위 그래프는 시작 자산 100이 200에 도달하는 두 복리 경로입니다. 2년 경로는 가파르게 올라가고 10년 경로는 완만하게 진행됩니다.
오른쪽 위 막대는 같은 누적수익률을 연 단위로 바꾼 결과입니다. 누적수익률 표에는 둘 다 100%로 표시되지만 CAGR을 놓으면 41.42%와 7.18%로 차이가 드러납니다.
이것이 CAGR을 사용하는 가장 중요한 이유입니다. 최종 수익률이 같다는 사실만으로 수익 창출 속도까지 같다고 판단하면 안 됩니다.
6. 비교 기간이 같으면 전략 순위는 바뀌지 않는다
이번에는 자동매매 중지·재개 규칙을 검증한 SYSTEM LAB 14의 여섯 전략을 다시 사용했습니다. 모두 같은 약 4년 동안 운용했기 때문에 누적수익률을 CAGR로 바꿔도 순위가 그대로 유지됩니다.
| 순위 | 전략 | 누적수익률 | CAGR |
|---|---|---|---|
| 1 | EMA 20·100 | +83.26% | +16.41% |
| 2 | EMA 35·120 | +79.97% | +15.88% |
| 3 | ROC 추세 | +42.44% | +9.28% |
| 4 | ATR 돌파 | +31.19% | +7.05% |
| 5 | 돈치안 돌파 | +28.85% | +6.56% |
| 6 | CCI 역추세 | +7.20% | +1.76% |
같은 양의 투자 기간에서는 누적수익률을 CAGR로 바꾸는 함수가 단조 증가합니다. 누적수익률이 더 높은 전략은 CAGR도 더 높기 때문에 순위가 역전되지 않습니다.
따라서 같은 기간의 전략을 비교하면서 CAGR이 누적수익률과 다른 전략을 골라줄 것이라고 기대하면 안 됩니다. 이때 CAGR의 역할은 총수익을 이해하기 쉬운 연 단위 속도로 바꾸는 것입니다.
전략 순위를 다르게 볼 수 있게 만드는 것은 MDD, 변동성, 샤프 비율처럼 수익 경로와 위험을 반영하는 지표입니다.
7. CAGR이 숨기는 세 가지
중간의 큰 손실
100이 50까지 떨어졌다가 200이 된 경로와 100에서 완만하게 200이 된 경로는 시작값, 최종값과 기간이 같으면 CAGR도 같습니다. 투자자가 실제로 견뎌야 했던 낙폭은 전혀 다릅니다.
수익이 발생한 순서
초반에 큰 수익이 나고 오랫동안 정체된 전략과 마지막에 한 번 급등한 전략도 CAGR이 같을 수 있습니다. CAGR은 시작점과 끝점 사이의 흔들림을 모두 지웁니다.
외부 현금흐름
운용 중간에 추가 입금과 출금이 있었다면 최종 잔액은 투자 성과만으로 만들어진 값이 아닙니다. 이 경우 단순 CAGR 대신 현금흐름 시점을 반영하는 IRR·XIRR 또는 시간가중수익률을 검토해야 합니다.
8. 짧은 기간의 CAGR은 과장될 수 있다
한 달 동안 5% 수익이 났다고 가정해보겠습니다. 이 속도가 1년 내내 반복된다고 연환산하면 약 79.6%가 됩니다.
하지만 한 달의 우연한 수익을 12개월 동안 반복할 수 있다는 보장은 없습니다. 표본 기간이 짧을수록 CAGR은 작은 변화도 매우 큰 연간 숫자로 확대합니다.
따라서 CAGR 옆에는 최소한 다음 조건을 적어야 합니다.
- 전체 측정 기간
- 시작일과 종료일
- 비용 반영 여부
- 외부 입출금 여부
- 검증 구간과 표본외 구간의 구분
높은 CAGR보다 먼저 그 숫자가 몇 년의 기록에서 나왔는지 확인해야 합니다.
9. CAGR과 함께 볼 지표
CAGR은 수익성과 시간만 연결합니다. 전략을 평가하려면 다른 축이 필요합니다.
| 함께 볼 지표 | 보완하는 질문 |
|---|---|
| MDD | 고점에서 얼마나 깊게 무너졌는가 |
| 낙폭 기간 | 손실 상태가 얼마나 오래 이어졌는가 |
| 변동성 | 일별·월별 수익이 얼마나 흔들렸는가 |
| 칼마 비율 | CAGR이 최대 낙폭을 충분히 보상했는가 |
| 시장 노출 | 그 수익을 얻기 위해 자본을 얼마나 오래 사용했는가 |
누적수익률은 비슷하지만 MDD가 1.6배 달랐던 성과표 비교처럼 최종 수익이 비슷해도 투자 과정은 달라질 수 있습니다.
다음 성과지표 002에서는 MDD의 깊이뿐 아니라 낙폭이 시작된 뒤 전고점을 회복할 때까지 걸린 기간을 함께 계산하겠습니다. 같은 -20% 손실이어도 한 달 만에 회복한 전략과 2년 동안 원금을 회복하지 못한 전략은 체감 위험이 다릅니다.
10. 정리
첫째, 누적수익률은 수익의 크기이고 CAGR은 그 수익을 만든 연평균 복리 속도입니다. 같은 100% 수익도 2년이면 41.42%, 10년이면 7.18%입니다.
둘째, 비교 기간이 같은 전략에서는 누적수익률과 CAGR의 순위가 바뀌지 않습니다. CAGR은 위험조정 지표가 아니라 기간 조정 지표입니다.
셋째, CAGR은 중간 낙폭, 변동성, 회복 기간과 외부 현금흐름을 보여주지 않습니다. 전략을 선택할 때는 MDD와 위험조정 성과를 함께 확인해야 합니다.
이 글은 학습과 정보 제공을 위한 자료이며 특정 종목이나 전략의 매수·매도를 권유하지 않습니다. 데이터와 계산 조건을 바꾸면 결과도 달라질 수 있으며 최종 투자 판단과 책임은 투자자 본인에게 있습니다.