샤프 비율이란?
퀀트 투자에서 전략의 성과를 평가할 때 수익률만 보는 것은 절반만 보는 것입니다. 연 50% 수익을 냈더라도, 그 과정에서 계좌가 -40%까지 빠졌다면 좋은 전략이라 할 수 없습니다. 샤프 비율(Sharpe Ratio)은 수익률과 위험을 동시에 측정하는 지표로, 퀀트 투자의 가장 기본적인 성과 척도입니다.
공식은 간단합니다:
샤프 비율 = (전략 수익률 - 무위험 수익률) / 수익률의 표준편차
즉, 위험 한 단위당 얼마나 초과 수익을 냈는가를 나타냅니다. 숫자가 높을수록 같은 위험 대비 더 많은 수익을 낸 것입니다.
샤프 비율 해석 기준
| 샤프 비율 | 평가 | 실전 의미 |
|---|---|---|
| 0.5 미만 | 나쁨 | 리스크 대비 수익 부족, 전략 재검토 필요 |
| 0.5 ~ 1.0 | 보통 | 개선 여지 있음, 비용 최적화로 향상 가능 |
| 1.0 ~ 2.0 | 좋음 | 실전 운용 가능한 수준 |
| 2.0 ~ 3.0 | 매우 좋음 | 우수한 전략, 자금 배분 우선 대상 |
| 3.0 이상 | 의심 | 과적합 가능성 점검 필요 |
주의할 점은 백테스트에서 샤프 비율 3.0 이상이 나오면 오히려 의심해야 한다는 것입니다. 과적합이거나 거래 비용을 누락했을 가능성이 높습니다.
Python으로 샤프 비율 계산하기
실전에서 샤프 비율을 계산하는 Python 코드를 살펴보겠습니다.
import numpy as np
import pandas as pd
def sharpe_ratio(returns, risk_free_rate=0.035, periods=252):
"""
일간 수익률 시리즈로 연환산 샤프 비율 계산
Args:
returns: 일간 수익률 Series (예: 0.01 = 1%)
risk_free_rate: 연간 무위험 수익률 (기본 3.5%)
periods: 연간 거래일 수 (주식 252, 암호화폐 365)
"""
daily_rf = risk_free_rate / periods
excess_returns = returns - daily_rf
if excess_returns.std() == 0:
return 0
return np.sqrt(periods) * excess_returns.mean() / excess_returns.std()
# 사용 예시
daily_returns = pd.Series([0.01, -0.005, 0.008, -0.003, 0.012, ...])
sr = sharpe_ratio(daily_returns)
print(f"연환산 샤프 비율: {sr:.2f}")
핵심 포인트: 연환산(Annualized)
샤프 비율은 반드시 연환산해서 비교해야 합니다. 일간 샤프에 √252를 곱하는 이유는 변동성이 시간의 제곱근에 비례하기 때문입니다. 암호화폐처럼 365일 거래되는 시장이면 √365를 사용합니다.
샤프 비율의 함정 3가지
함정 1: 꼬리 리스크를 무시한다
샤프 비율은 수익률이 정규분포를 따른다고 가정합니다. 하지만 실제 시장에서는 급락(Fat Tail)이 정규분포보다 훨씬 자주 발생합니다. 평소 꾸준히 수익을 내다가 한 번의 급락으로 계좌가 반토막 나는 전략도 샤프 비율은 높게 나올 수 있습니다.
보완 지표: 소르티노 비율(Sortino Ratio)은 하락 변동성만 측정하므로, 꼬리 리스크를 더 잘 반영합니다.
def sortino_ratio(returns, risk_free_rate=0.035, periods=252):
"""하락 변동성만 사용하는 소르티노 비율"""
daily_rf = risk_free_rate / periods
excess_returns = returns - daily_rf
downside = excess_returns[excess_returns < 0]
if len(downside) == 0 or downside.std() == 0:
return float('inf')
return np.sqrt(periods) * excess_returns.mean() / downside.std()
함정 2: 거래 빈도에 따라 왜곡된다
일간 데이터로 계산한 샤프와 월간 데이터로 계산한 샤프는 다른 값이 나옵니다. 연환산 공식의 periods 값이 다르기 때문입니다. 전략을 비교할 때는 같은 시간 단위로 통일해야 합니다.
함정 3: 샘플 기간에 민감하다
강세장 6개월만 잘라서 샤프를 계산하면 당연히 높게 나옵니다. 최소 2~3년 이상, 상승장과 하락장을 모두 포함하는 기간에서 측정해야 의미가 있습니다.
실전 활용: 전략 비교와 자금 배분
전략 비교 시 샤프 비율 활용
여러 전략을 동시에 운용할 때, 샤프 비율은 어떤 전략에 더 많은 자금을 배분할지 결정하는 기준이 됩니다.
# 전략별 성과 비교
strategies = {
"모멘텀 전략": {"return": 0.25, "sharpe": 1.4, "mdd": -0.12},
"평균회귀 전략": {"return": 0.18, "sharpe": 1.8, "mdd": -0.08},
"브레이크아웃 전략": {"return": 0.35, "sharpe": 0.9, "mdd": -0.22},
}
# 수익률만 보면 브레이크아웃이 최고지만
# 샤프 비율로 보면 평균회귀가 가장 효율적
# → 평균회귀에 더 많은 자금 배분이 합리적
롤링 샤프 비율로 전략 건강 체크
60일 또는 90일 롤링 윈도우로 샤프 비율을 추적하면, 전략의 성능이 시간에 따라 어떻게 변하는지 모니터링할 수 있습니다. 롤링 샤프가 지속적으로 하락하면 전략이 시장 변화에 적응하지 못하고 있다는 경고 신호입니다.
# 60일 롤링 샤프 비율
rolling_sharpe = daily_returns.rolling(60).apply(
lambda x: np.sqrt(252) * x.mean() / x.std() if x.std() > 0 else 0
)
# 롤링 샤프가 0 아래로 내려가면 전략 재점검
alert = rolling_sharpe < 0
샤프 비율과 함께 봐야 할 지표들
샤프 비율 하나만으로 전략을 판단하면 안 됩니다. 아래 지표들을 종합적으로 확인하세요.
- 최대 낙폭(MDD) — 최악의 경우 얼마나 잃을 수 있는가
- 소르티노 비율 — 하락 리스크 대비 수익
- 승률(Win Rate) — 전체 거래 중 수익 거래 비율
- 손익비(Profit Factor) — 총 이익 / 총 손실
- 칼마 비율(Calmar Ratio) — 연 수익률 / MDD
정리: 샤프 비율 실전 체크리스트
- ☑️ 연환산 기준으로 계산하고 있는가
- ☑️ 거래 비용(수수료·슬리피지)을 반영한 수익률인가
- ☑️ 최소 2년 이상의 데이터를 사용했는가
- ☑️ 3.0 이상이면 과적합을 의심했는가
- ☑️ 소르티노·MDD 등 보완 지표도 확인했는가
- ☑️ 롤링 샤프로 시간에 따른 변화를 추적하는가
샤프 비율은 완벽한 지표는 아니지만, 퀀트 투자에서 가장 먼저 확인해야 할 성과 척도입니다. 올바르게 이해하고 한계를 인지한 채 활용하면, 전략 선택과 자금 배분에서 훨씬 합리적인 결정을 내릴 수 있습니다.
관련 글도 함께 읽어보세요: