수익률은 한 숫자로 끝나지 않는다
투자 성과를 말할 때 가장 먼저 보는 숫자는 수익률이다. 100만 원이 110만 원이 되면 10%를 벌었다. 여기까지는 쉽다. 하지만 퀀트 투자에서 수익률은 단순히 얼마나 벌었는가만 뜻하지 않는다. 언제 벌었는지, 얼마나 흔들렸는지, 중간에 얼마나 크게 잃었는지까지 함께 봐야 한다.
예를 들어 두 전략이 모두 1년에 20% 수익을 냈다고 하자. A 전략은 거의 매달 조금씩 올라 20%에 도달했다. B 전략은 중간에 -40%까지 빠졌다가 마지막 두 달에 급등해 20%가 되었다. 최종 수익률만 보면 둘은 같다. 그러나 실제 투자자가 느끼는 고통은 전혀 다르다.
그래서 전략을 평가할 때는 수익률과 리스크를 함께 봐야 한다. 이 장의 목표는 복잡한 수식을 외우는 것이 아니다. 백테스트 결과를 봤을 때 이 전략이 정말 좋은 전략인지, 아니면 좋아 보이기만 하는 전략인지 판단하는 눈을 기르는 것이다.
AI 생성 이미지
단순 수익률: 가장 직관적인 변화율
단순 수익률은 가장 많이 쓰는 수익률이다.
단순 수익률 = 오늘 가격 / 어제 가격 - 1
주가가 10,000원에서 11,000원이 되면 수익률은 10%다. 다시 11,000원에서 9,900원이 되면 수익률은 -10%다. 여기서 중요한 점이 있다. +10%와 -10%는 서로 상쇄되지 않는다.
10,000원이 10% 오르면 11,000원이다. 여기서 10% 내리면 9,900원이다. 처음보다 100원 손해다. 수익률은 더하기가 아니라 곱하기로 쌓인다.
간단한 주가 예제로 계산해보자.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'date': ['1일', '2일', '3일', '4일'],
'close': [10000, 11000, 9900, 10395]
})
df['simple_return'] = df['close'].pct_change()
dfpct_change()는 이전 값 대비 변화율을 계산한다. 결과는 대략 다음과 같다.
1일: 계산 불가
2일: 10%
3일: -10%
4일: 5%
단순 수익률은 이해하기 쉽고 실제 투자 성과를 설명할 때도 편하다. 대부분의 백테스트와 투자 보고서에서 기본으로 쓰인다. 다만 여러 기간의 수익률을 단순히 평균 내면 실제 누적 성과와 달라질 수 있다.
로그 수익률: 분석하기 편한 수익률
로그 수익률은 다음과 같이 계산한다.
로그 수익률 = log(오늘 가격 / 어제 가격)
처음 보면 낯설다. 굳이 왜 로그를 쓸까? 이유는 기간별 수익률을 더하기 쉽게 만들기 위해서다. 단순 수익률은 곱해서 누적해야 하지만, 로그 수익률은 더하면 누적 로그 수익률이 된다.
df['log_return'] = np.log(df['close'] / df['close'].shift(1))
df일상적인 투자 판단에서는 단순 수익률만 알아도 충분하다. 그러나 통계 분석, 시계열 모델, 머신러닝 데이터셋을 만들 때는 로그 수익률이 자주 등장한다. 특히 하루 수익률처럼 값이 작을 때는 단순 수익률과 로그 수익률의 차이가 크지 않다.
이 책에서는 두 가지를 이렇게 구분해도 좋다.
투자자가 보는 성과: 단순 수익률
분석과 모델링에 자주 쓰는 값: 로그 수익률
중요한 것은 이름이 아니라 용도다. 수익률을 계산할 때 어떤 방식으로 계산했는지 일관되게 관리해야 한다.
누적 수익률: 돈이 실제로 얼마나 불었는가
단기 수익률보다 더 중요한 것은 누적 수익률이다. 투자자는 매일의 수익률을 따로따로 받는 것이 아니라, 전날의 자산 위에서 다음 날 수익률을 경험한다.
누적 수익률은 다음처럼 계산한다.
df['cum_return'] = (1 + df['simple_return']).cumprod() - 1
df여기서 cumprod()는 누적 곱을 뜻한다. 첫날 이후 수익률이 10%, -10%, 5%라면 누적 성과는 이렇게 계산된다.
1.10 × 0.90 × 1.05 - 1 = 0.0395
즉 누적 수익률은 3.95%다. 단순히 10%, -10%, 5%를 평균 내면 1.67%지만, 실제 돈은 3.95% 늘었다. 평균 수익률과 누적 수익률은 다르다.
백테스트에서 가장 먼저 그려야 할 그래프가 바로 누적 수익률 곡선이다. 흔히 자산 곡선, 에쿼티 커브라고 부른다. 이 그래프를 보면 전략이 어떻게 돈을 벌었는지 한눈에 알 수 있다. 꾸준히 우상향했는지, 오랫동안 횡보했는지, 특정 시기에만 급등했는지 확인할 수 있다.
변동성: 흔들림은 비용이다
변동성은 수익률이 얼마나 흔들리는지를 나타낸다. 보통 일간 수익률의 표준편차로 계산한다. 표준편차는 값들이 평균에서 얼마나 흩어져 있는지를 보여주는 통계량이다.
returns = df['simple_return'].dropna()
daily_vol = returns.std()
annual_vol = daily_vol * np.sqrt(252)주식시장은 보통 1년에 약 252거래일이 있다고 가정한다. 그래서 일간 변동성에 252의 제곱근을 곱해 연율화 변동성을 구한다. 연율화는 하루 단위 값을 1년 기준으로 바꾸는 것이다.
변동성이 높다는 것은 반드시 나쁘다는 뜻은 아니다. 많이 흔들리는 자산은 크게 오를 수도 있다. 문제는 투자자가 그 흔들림을 견딜 수 있느냐다.
예를 들어 두 전략의 기대 수익률이 모두 연 15%라고 하자.
A 전략: 연 변동성 10%
B 전략: 연 변동성 35%
둘 다 평균적으로는 같은 수익률을 기대할 수 있다. 그러나 B 전략은 계좌가 크게 출렁일 가능성이 높다. 투자자는 하락 구간에서 전략을 의심하고, 중간에 포기할 수 있다. 전략이 장기적으로 괜찮아도 투자자가 끝까지 버티지 못하면 의미가 없다.
변동성은 숫자로 표현된 심리적 압박이다.
최대 낙폭 MDD: 투자자가 실제로 겪는 고통
변동성이 흔들림을 말한다면, 최대 낙폭은 고점 대비 얼마나 크게 빠졌는지를 말한다. 영어로 Maximum Drawdown, 줄여서 MDD라고 부른다.
예를 들어 계좌가 1,000만 원에서 1,500만 원까지 올랐다가 900만 원으로 떨어졌다고 하자. 최종적으로는 다시 회복할 수도 있다. 하지만 투자자는 1,500만 원을 본 뒤 900만 원까지 떨어지는 경험을 한다.
이때 낙폭은 다음과 같다.
900만 원 / 1,500만 원 - 1 = -40%
MDD는 전체 투자 기간 중 가장 큰 낙폭이다.
df['wealth'] = (1 + df['simple_return']).cumprod()
df['peak'] = df['wealth'].cummax()
df['drawdown'] = df['wealth'] / df['peak'] - 1
mdd = df['drawdown'].min()cummax()는 지금까지의 최고값을 계속 기록한다. 현재 자산이 과거 최고점보다 얼마나 낮은지 계산하면 낙폭이 나온다. 그중 가장 낮은 값이 MDD다.
MDD가 중요한 이유는 회복이 어렵기 때문이다.
-10% 손실을 회복하려면 약 11.1% 수익이 필요하다.
-30% 손실을 회복하려면 약 42.9% 수익이 필요하다.
-50% 손실을 회복하려면 100% 수익이 필요하다.
손실은 내려갈 때보다 올라올 때 더 큰 수익률을 요구한다. 그래서 좋은 전략은 단순히 많이 버는 전략이 아니라 크게 망가지지 않는 전략이다.
MDD와 함께 회복 기간도 봐야 한다. 회복 기간은 고점을 회복하는 데 걸린 시간이다. 어떤 전략은 MDD가 -20%로 비슷해도 3개월 만에 회복하고, 어떤 전략은 3년 동안 회복하지 못한다. 실제 투자에서는 두 전략의 체감 난이도가 전혀 다르다.
샤프 비율: 위험 대비 성과를 보는 도구
수익률만 보면 위험을 놓친다. 변동성만 보면 성과를 놓친다. 샤프 비율은 이 둘을 함께 보는 대표적인 지표다.
샤프 비율 = 초과 수익률 / 변동성
초과 수익률은 전략 수익률에서 무위험 수익률을 뺀 값이다. 무위험 수익률은 보통 국채나 예금처럼 상대적으로 안전한 자산의 수익률을 뜻한다. 초보 단계에서는 단순화를 위해 무위험 수익률을 0으로 두고 계산해도 된다.
risk_free_rate = 0
annual_return = (1 + returns).prod() ** (252 / len(returns)) - 1
annual_vol = returns.std() * np.sqrt(252)
sharpe = (annual_return - risk_free_rate) / annual_vol두 전략을 비교해보자.
A 전략: 연 수익률 12%, 연 변동성 10%, 샤프 비율 1.2
B 전략: 연 수익률 12%, 연 변동성 30%, 샤프 비율 0.4
최종 수익률은 같지만 A 전략이 더 효율적이다. 같은 수익을 얻기 위해 감당한 흔들림이 더 작기 때문이다.
다만 샤프 비율도 완벽하지 않다. 변동성을 위험의 대표값으로 쓰기 때문에 큰 폭락, 긴 회복 기간, 수익률 분포의 비대칭성을 충분히 설명하지 못할 수 있다. 어떤 전략은 평소에는 안정적이다가 드물게 크게 무너진다. 이런 전략은 샤프 비율만 보면 좋아 보일 수 있다.
따라서 샤프 비율은 유용하지만 단독으로 쓰면 안 된다. 누적 수익률, MDD, 회복 기간, 거래 횟수, 벤치마크 대비 성과와 함께 봐야 한다.
승률보다 중요한 것
초보 투자자는 승률에 끌린다. 10번 중 7번 이기는 전략은 좋아 보인다. 하지만 승률만으로는 전략을 판단할 수 없다.
다음 두 전략을 보자.
| 전략 | 승률 | 평균 이익 | 평균 손실 | 해석 |
|---|---|---|---|---|
| A | 70% | 1% | -5% | 자주 이기지만 한 번 질 때 크게 잃음 |
| B | 40% | 4% | -1% | 자주 지지만 이길 때 크게 벌고 질 때 작게 잃음 |
A 전략의 기대값은 0.7 × 1% + 0.3 × -5% = -0.8%다. 승률은 높지만 기대값은 마이너스다.
B 전략의 기대값은 0.4 × 4% + 0.6 × -1% = 1.0%다. 승률은 낮지만 기대값은 플러스다.
투자에서 중요한 것은 얼마나 자주 맞히느냐가 아니라, 맞혔을 때 얼마나 벌고 틀렸을 때 얼마나 잃느냐다. 이를 손익비라고 한다. 손익비는 평균 이익을 평균 손실로 나누어 생각할 수 있다.
AI 예측 모델을 만들 때도 같은 문제가 생긴다. 모델의 방향 예측 정확도가 55%라고 해서 바로 좋은 전략이 되는 것은 아니다. 상승을 맞혔을 때 얻는 수익이 작고, 하락을 틀렸을 때 손실이 크면 투자 성과는 나쁠 수 있다. 그래서 머신러닝 모델도 정확도만 보면 안 된다. 예측을 실제 매매 규칙으로 바꾸고, 그 결과를 백테스트해야 한다.
수익률 곡선에서 봐야 할 것들
백테스트 결과를 볼 때 표 하나로 끝내면 안 된다. 반드시 수익률 곡선을 봐야 한다. 숫자는 전략의 요약이고, 곡선은 전략의 경험이다.
수익률 곡선에서 확인할 것은 다음과 같다.
첫째, 장기간 우상향하는가. 특정 한두 번의 거래로만 성과가 만들어졌다면 재현 가능성이 낮을 수 있다.
둘째, 하락 구간이 너무 깊거나 길지 않은가. MDD가 크고 회복 기간이 길면 실제 운용이 어렵다.
셋째, 벤치마크보다 나은가. 한국 주식 전략이라면 코스피나 코스닥, 미국 주식 전략이라면 S&P 500 같은 기준과 비교해야 한다. 전략이 20% 벌었더라도 같은 기간 시장이 40% 올랐다면 좋은 전략이라고 말하기 어렵다.
넷째, 수수료와 세금을 반영해도 남는가. 작은 수익을 자주 얻는 전략은 거래비용에 약하다. 백테스트에서는 좋아 보였지만 실제 매매에서는 수익이 사라질 수 있다.
다섯째, 내가 견딜 수 있는가. 어떤 전략은 장기적으로 우수해도 1년 이상 시장보다 못할 수 있다. 그 기간을 버틸 수 없다면 그 전략은 나에게 맞지 않는다.
좋은 전략은 편안한 전략이 아니다
여기서 오해하면 안 된다. 좋은 전략은 항상 편안한 전략이 아니다. 모든 전략에는 손실 구간이 있다. 아무리 훌륭한 전략도 매일 돈을 벌지는 못한다.
중요한 것은 손실이 존재한다는 사실을 미리 알고, 그 손실이 전략의 정상 범위인지 판단하는 것이다. 백테스트는 미래를 보장하지 않는다. 하지만 과거에 이 전략이 어떤 방식으로 흔들렸는지 보여준다. 투자자는 그 흔들림을 보고 자신이 감당할 수 있는지 판단해야 한다.
전략을 평가할 때는 다음 질문을 던져보자.
누적 수익률은 시장보다 나은가?
변동성은 내가 감당할 수 있는 수준인가?
MDD가 발생했을 때 중간에 포기하지 않을 수 있는가?
회복 기간이 너무 길지는 않은가?
샤프 비율은 비슷한 전략보다 나은가?
승률이 아니라 손익비와 기대값이 좋은가?
성과가 특정 구간에만 몰려 있지는 않은가?
이 질문에 답할 수 있어야 전략을 비교할 수 있다.
이 장의 핵심
투자 전략을 평가하는 일은 최고 수익률을 찾는 일이 아니다. 감당 가능한 수익률을 찾는 일이다.
단순 수익률은 하루하루의 변화율을 보여준다. 로그 수익률은 분석과 모델링에 편리하다. 누적 수익률은 실제 자산이 얼마나 늘었는지 보여준다. 변동성은 전략의 흔들림을 나타내고, MDD는 투자자가 겪을 수 있는 가장 큰 고통을 보여준다. 샤프 비율은 같은 수익률이라도 더 적은 위험으로 얻은 성과를 구분하게 해준다.
승률은 생각보다 덜 중요하다. 더 중요한 것은 손익비, 낙폭, 회복 기간, 수익률 곡선의 안정성이다.
앞으로 우리는 파이썬으로 주식 데이터를 가져오고, 직접 수익률과 리스크 지표를 계산할 것이다. 그다음 투자 아이디어를 전략으로 바꾸고 백테스트한다. 이때 이 장에서 배운 지표들이 전략을 판단하는 기준이 된다.
좋은 퀀트 투자자는 많이 맞히는 사람이 아니다. 자신이 감당할 수 있는 위험 안에서, 검증 가능한 방식으로 투자 아이디어를 실험하는 사람이다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
