샤프 비율은 큰 상승과 큰 하락을 모두 변동성으로 계산합니다. 투자자가 반기는 상승까지 위험으로 보는 것이 불편하다면 손실 방향의 흔들림만 분모에 넣을 수 있습니다.
그 역할을 하는 지표가 소르티노 비율(Sortino Ratio)입니다. 초과수익을 전체 변동성이 아니라 목표수익률 아래의 하방편차로 나눕니다.
실제 자동매매 전략 6개에 적용하니 샤프 비율 0.64로 3위였던 CCI 역추세가 소르티노 비율 1.04로 6위까지 내려갔습니다. 반대로 ATR 돌파는 샤프 4위에서 소르티노 3위로 올라갔습니다.
같은 수익률 자료도 위험의 방향을 바꾸면 순위가 달라집니다. 이번 글에서는 인위적으로 결론을 만들지 않고, 동일 기간 LAB 전략의 실제 48개월 수익률에서 나타난 변화를 사용합니다.
성과지표 005 핵심 정리
- 샤프 비율: 초과수익을 전체 변동성으로 나눔
- 소르티노 비율: 초과수익을 목표수익률 아래의 하방편차로 나눔
- 평균수익률과 표준편차가 같아도 손실 분포가 다르면 소르티노 비율은 달라짐
- 목표수익률, 수익률 빈도와 하방편차 분모 기준을 함께 공개해야 함
- 손실 관측값이 적으면 소르티노 비율이 과도하게 커질 수 있음
1. 소르티노 비율은 어떤 질문에 답하는가
소르티노 비율이 답하는 질문은 다음과 같습니다.
목표보다 나빴던 흔들림 1단위를 감수하고 초과수익을 얼마나 얻었는가?
샤프 비율은 수익률 분포 전체의 표준편차를 위험으로 봅니다. 소르티노 비율은 최소허용수익률(MAR, Minimum Acceptable Return) 아래의 수익률만 부족분으로 계산합니다.
| 지표 | 분자 | 분모 | 위험으로 보는 움직임 |
|---|---|---|---|
| 샤프 비율 | 평균 초과수익 | 전체 변동성 | 상승과 하락 모두 |
| 소르티노 비율 | 평균 초과수익 | 하방편차 | 목표수익률 아래만 |
소르티노 비율이 높으면 목표보다 나빴던 움직임에 비해 평균 초과수익이 컸다는 뜻입니다. 손실 위험을 더 직접적으로 평가할 수 있지만, 손실의 최악 크기나 회복 기간을 알려주는 지표는 아닙니다.
2. 소르티노 비율 계산식
이번 글은 월간 목표수익률을 0%로 설정합니다. 계산 순서는 다음과 같습니다.
월간 부족분 = min(월간 수익률 - 목표수익률, 0)
연환산 하방편차 = 부족분 제곱 평균의 제곱근 × √12
연환산 평균 초과수익 = 월간 초과수익 평균 × 12
소르티노 비율 = 연환산 평균 초과수익 ÷ 연환산 하방편차
월 수익률이 +3%라면 목표 0%보다 높으므로 부족분은 0입니다. -2%라면 부족분은 -2%이고, 제곱한 값이 하방편차 계산에 들어갑니다.
목표수익률을 연 3%로 정한다면 월간 복리 기준으로 바꾼 뒤 사용해야 합니다. 이 경우 0%보다 높아도 월 목표에 못 미친 수익은 하방 위험으로 계산됩니다.
일부 라이브러리는 전체 관측값을 분모로 사용하고 다른 구현은 목표 아래의 관측값만 사용합니다. 이번 글은 변동성과 하방편차를 비교한 성과지표 003과 동일하게 전체 관측값을 분모로 사용합니다.
3. 평균과 변동성이 같아도 소르티노는 22.8배 차이
월 평균수익률 1%, 월 표준편차 4%로 완전히 같은 두 수익률 분포를 만들었습니다.
상승 꼬리형은 11개월 동안 매월 약 -0.15%를 기록하다가 한 달에 +13.70% 상승합니다. 하락 꼬리형은 11개월 동안 매월 약 +2.15%를 기록하다가 한 달에 -11.70% 하락합니다.

| 경로 | 누적수익률 | 연환산 산술평균 | 연환산 변동성 | 샤프 비율 | 하방편차 | 소르티노 비율 |
|---|---|---|---|---|---|---|
| 상승 꼬리형 | +11.78% | 12.00% | 13.86% | 0.87 | 0.51% | 23.39 |
| 하락 꼬리형 | +11.63% | 12.00% | 13.86% | 0.87 | 11.70% | 1.03 |
평균과 전체 변동성이 같으므로 샤프 비율은 둘 다 0.87입니다. 표준편차만 보면 큰 상승 한 번과 큰 하락 한 번이 같은 크기의 흔들림으로 처리됩니다.
소르티노 비율은 방향을 구분합니다. 상승 꼬리형의 11번 손실은 횟수는 많지만 크기가 매우 작아 하방편차가 0.51%입니다. 하락 꼬리형은 한 번의 -11.70%가 하방편차를 크게 높입니다.
이 예제의 소르티노 비율 23.39를 뛰어난 전략의 증거로 받아들이면 안 됩니다. 손실 표본이 작거나 손실 크기가 지나치게 작을 때 분모가 0에 가까워져 비율이 크게 부풀 수 있다는 경고 사례입니다.
4. Python으로 샤프·소르티노 비율 계산하기
아래 코드는 두 분포의 평균, 변동성과 샤프·소르티노 비율을 계산합니다. 실행에는 numpy가 필요합니다.
import numpy as np
def calculate_ratios(returns: np.ndarray, periods_per_year: int = 12, target_return: float = 0.0) -> dict[str, float]:
excess_returns = returns - target_return
annual_excess_return = np.mean(excess_returns) * periods_per_year
annual_volatility = np.std(returns, ddof=1) * np.sqrt(periods_per_year)
downside_deviation = np.sqrt(np.mean(np.minimum(excess_returns, 0.0) ** 2)) * np.sqrt(periods_per_year)
return {
"total_return": float(np.prod(1.0 + returns) - 1.0),
"sharpe_ratio": float(annual_excess_return / annual_volatility),
"sortino_ratio": float(annual_excess_return / downside_deviation),
}
mean_return = 0.01
monthly_standard_deviation = 0.04
distance = monthly_standard_deviation / np.sqrt(12)
examples = {
"상승 꼬리형": np.array([mean_return - distance] * 11 + [mean_return + 11 * distance]),
"하락 꼬리형": np.array([mean_return + distance] * 11 + [mean_return - 11 * distance]),
}
for name, returns in examples.items():
result = calculate_ratios(returns)
print(f"{name}: 누적수익률 {result['total_return']:.2%}, Sharpe {result['sharpe_ratio']:.2f}, Sortino {result['sortino_ratio']:.2f}")
실행 결과는 다음과 같습니다.
상승 꼬리형: 누적수익률 11.78%, Sharpe 0.87, Sortino 23.39
하락 꼬리형: 누적수익률 11.63%, Sharpe 0.87, Sortino 1.03
목표 아래의 수익률이 하나도 없다면 하방편차가 0이 되어 일반적인 소르티노 비율을 계산할 수 없습니다. 무한대처럼 표시하기보다 관측 기간과 목표 설정이 적절한지 먼저 확인해야 합니다.
5. 실제 LAB 전략의 소르티노 비율
SYSTEM LAB 14에서 사용한 여섯 자동매매 전략의 2022년 1월부터 2025년 12월까지 월간 수익률 48개를 사용했습니다.
국내 주식 30종목을 동일 비중으로 구성했고 매수와 매도에 각각 0.05% 비용을 반영했습니다. 샤프 비율과 소르티노 비율 모두 목표수익률 0%를 사용해 분자 조건을 같게 맞췄습니다.
| 전략 | 연환산 평균수익률 | 전체 변동성 | 하방편차 | Sharpe | 순위 | Sortino | 순위 |
|---|---|---|---|---|---|---|---|
| EMA 20·100 | 17.30% | 21.18% | 8.79% | 0.82 | 1 | 1.97 | 1 |
| EMA 35·120 | 16.79% | 20.82% | 9.26% | 0.81 | 2 | 1.81 | 2 |
| ATR 돌파 | 7.64% | 13.39% | 4.79% | 0.57 | 4 | 1.59 | 3 |
| 돈치안 돌파 | 7.20% | 13.51% | 5.44% | 0.53 | 6 | 1.32 | 4 |
| ROC 추세 | 10.51% | 18.86% | 8.00% | 0.56 | 5 | 1.31 | 5 |
| CCI 역추세 | 1.78% | 2.77% | 1.70% | 0.64 | 3 | 1.04 | 6 |
EMA 20·100과 EMA 35·120은 두 지표에서 모두 1위와 2위를 유지했습니다. 위험의 방향을 바꿔도 높은 평균수익이 변동성을 보상한 결과입니다.
ATR 돌파는 샤프 0.57로 4위였지만 소르티노 1.59로 3위가 됐습니다. 전체 변동성 13.39% 중 하방편차는 4.79%로 상대적으로 작았습니다.
돈치안 돌파도 샤프 6위에서 소르티노 4위로 올라갔습니다. 반면 CCI 역추세는 샤프 3위에서 소르티노 6위로 내려갔습니다.
6. CCI 역추세가 3위에서 6위로 내려간 이유
CCI 역추세의 전체 변동성은 2.77%로 매우 낮았습니다. 이 작은 분모 덕분에 연환산 평균수익률이 1.78%에 불과해도 샤프 비율은 0.64가 됐습니다.
하지만 하방편차는 1.70%로 전체 변동성의 약 61.6%였습니다. 여섯 전략 중 하방편차의 절대값은 가장 작지만, 평균수익 1.78%도 함께 작았기 때문에 소르티노 비율은 1.04에 그쳤습니다.
ATR 돌파는 48개월 중 28개월이 손실로 CCI 역추세의 19개월보다 많았습니다. 그런데 ATR 돌파의 하방편차는 4.79%, 연환산 평균수익률은 7.64%여서 소르티노 비율은 1.59입니다.
손실 월이 적다는 사실만으로 소르티노 비율이 높아지는 것은 아닙니다. 목표 아래로 내려간 크기와 평균 초과수익을 함께 계산해야 합니다.
7. 월간과 일간 수익률에서 순위가 달라진다
같은 자산곡선도 수익률 빈도를 바꾸면 하방편차에 포함되는 움직임이 달라집니다.
| 전략 | 월간 Sortino | 월간 순위 | 일간 Sortino | 일간 순위 |
|---|---|---|---|---|
| EMA 20·100 | 1.97 | 1 | 1.54 | 1 |
| EMA 35·120 | 1.81 | 2 | 1.50 | 2 |
| ATR 돌파 | 1.59 | 3 | 1.06 | 4 |
| 돈치안 돌파 | 1.32 | 4 | 0.95 | 5 |
| ROC 추세 | 1.31 | 5 | 1.09 | 3 |
| CCI 역추세 | 1.04 | 6 | 0.89 | 6 |
월간 기준에서는 ATR 돌파가 ROC 추세보다 높았지만 일간 기준에서는 ROC 추세가 3위로 올라가고 ATR 돌파가 4위로 내려갑니다.
월말까지 회복된 일중·일간 손실은 월간 수익률에서 사라집니다. 반대로 장기 투자자가 매일의 작은 움직임보다 월간 목표 달성을 중요하게 본다면 월간 자료가 목적에 더 맞을 수 있습니다.
어느 빈도가 항상 정답인 것은 아닙니다. 전략의 보유 기간과 실제 위험 관리 주기에 맞춰 선택하고, 서로 다른 빈도로 계산한 값을 한 표에서 직접 비교하지 않아야 합니다.
8. 소르티노 비율을 해석할 때 주의할 점
손실 표본이 적으면 값이 불안정하다
상승장이나 짧은 검증 구간에서는 목표 아래 관측값이 몇 개 없을 수 있습니다. 하방편차가 작아져 소르티노 비율이 비정상적으로 커질 수 있으므로 손실 관측 개수를 함께 확인해야 합니다.
목표수익률이 결과를 바꾼다
목표를 0%, 예금 수익률 또는 전략 요구수익률 중 무엇으로 설정했는지에 따라 분자와 분모가 동시에 변합니다. 같은 데이터라도 순위가 달라질 수 있습니다.
계산 구현이 같아야 한다
전체 관측값을 분모로 쓰는 방식과 손실 관측값만 분모로 쓰는 방식은 하방편차가 다릅니다. 라이브러리 이름만 보고 같은 소르티노 비율이라고 가정하면 안 됩니다.
한 번의 큰 손실을 충분히 설명하지 못할 수 있다
제곱 계산으로 큰 손실에 가중치를 주지만 최악의 손실 자체, 발생 시점과 회복 시간은 사라집니다. MDD와 낙폭 기간을 분리한 결과를 함께 확인해야 합니다.
높은 값이 높은 수익을 뜻하지 않는다
소르티노 비율은 효율입니다. 절대수익이 작고 하방편차가 더 작아도 값은 높게 나올 수 있으므로 누적수익률과 CAGR을 별도로 봐야 합니다.
9. 샤프와 소르티노를 함께 보는 순서
두 비율 중 하나만 선택하기보다 다음 순서로 보면 해석이 쉬워집니다.
- 누적수익률과 CAGR로 수익의 크기와 속도를 확인합니다.
- 샤프 비율로 전체 흔들림 대비 효율을 확인합니다.
- 소르티노 비율로 하락 방향만 보았을 때 순위가 바뀌는지 확인합니다.
- MDD와 낙폭 기간으로 최악의 깊이와 회복 시간을 확인합니다.
샤프보다 소르티노가 훨씬 높다면 상승 방향 변동성이 전체 표준편차를 키웠을 가능성이 있습니다. 차이가 작다면 전체 변동성에서 하방 위험이 차지하는 비중이 큰지 확인할 수 있습니다.
다음 성과지표 006에서는 CAGR을 MDD 절댓값으로 나누는 칼마 비율을 계산하겠습니다. 평소 흔들림이 아니라 관측 기간의 최대 낙폭으로 수익 효율을 평가하면 전략 순위가 어떻게 달라지는지 확인할 예정입니다.
10. 정리
첫째, 소르티노 비율은 평균 초과수익을 목표수익률 아래의 하방편차로 나눈 값입니다. 상승 변동성을 위험에서 제외한다는 점이 샤프 비율과 다릅니다.
둘째, 평균과 전체 변동성이 같은 두 분포도 손실 방향이 다르면 샤프 비율은 0.87로 같고 소르티노 비율은 23.39와 1.03으로 갈릴 수 있습니다.
셋째, 실제 LAB 전략에서 CCI 역추세는 샤프 3위에서 소르티노 6위로 내려갔습니다. 목표수익률, 계산 빈도, 하방편차 분모와 손실 관측 개수를 함께 확인해야 합니다.
이 글은 학습과 정보 제공을 위한 자료이며 특정 종목이나 전략의 매수·매도를 권유하지 않습니다. 데이터와 계산 조건을 바꾸면 결과도 달라질 수 있으며 최종 투자 판단과 책임은 투자자 본인에게 있습니다.