수익률이 크게 오르는 날과 크게 내리는 날은 모두 평균에서 멀리 떨어진 움직임입니다. 표준편차로 변동성을 계산하면 두 움직임을 같은 흔들림으로 봅니다.
하지만 투자자가 피하고 싶은 위험은 대개 예상보다 많이 오른 날이 아니라 돈을 잃은 날입니다. 그렇다면 상승으로 발생한 변동성까지 위험으로 계산하는 것이 맞을까요?
1년 누적수익률이 같은 두 경로를 만들어 비교하니 상승 급등형의 연환산 변동성은 12.00%, 손실 포함형은 8.29%였습니다. 변동성만 보면 상승 급등형이 더 위험합니다. 반면 하방편차는 각각 0.00%와 5.86%여서 위험 순위가 완전히 뒤집힙니다.
MDD와 전고점 회복 기간을 분리한 성과지표 002에 이어 이번에는 수익률이 평소 얼마나 흔들렸는지, 그중 하락 방향의 흔들림은 얼마였는지 나눠 보겠습니다.
성과지표 003 핵심 정리
- 변동성: 기간별 수익률이 평균에서 얼마나 넓게 흩어졌는가
- 하방편차: 수익률이 목표수익률 아래로 내려간 정도는 얼마인가
- 변동성은 큰 상승과 큰 하락을 모두 위험으로 계산함
- 하방편차는 목표수익률을 어떻게 정하는지에 따라 값이 달라짐
- 두 지표는 위험의 다른 면을 보므로 전략 순위가 바뀔 수 있음
1. 변동성은 어떤 질문에 답하는가
투자 성과에서 말하는 변동성은 보통 기간별 수익률의 표준편차입니다.
수익률은 평균에서 대체로 얼마나 멀리 흔들렸는가?
월간 수익률이 매달 1% 부근에 모여 있다면 변동성은 낮습니다. 어떤 달은 +15%, 다른 달은 -12%처럼 넓게 움직이면 변동성은 높습니다.
표준편차는 방향을 구분하지 않습니다. 평균보다 10%포인트 높은 수익과 10%포인트 낮은 수익은 모두 제곱한 뒤 계산되므로 같은 크기의 흔들림으로 반영됩니다.
이 성질은 자산 가격의 불확실성을 하나의 숫자로 요약할 때 유용합니다. 반면 투자자가 손실만 위험으로 생각한다면 큰 상승까지 불리한 값으로 처리되는 한계가 있습니다.
2. 변동성 계산과 연환산
월간 수익률을 사용하는 경우 계산 순서는 다음과 같습니다.
월간 변동성 = 월간 수익률의 표본 표준편차
연환산 변동성 = 월간 변동성 × √12
일간 수익률이라면 일반적으로 거래일 수 252의 제곱근을 곱합니다.
연환산 변동성 = 일간 수익률 표준편차 × √252
제곱근 연환산은 각 기간의 수익률이 독립적이고 변동성이 일정하다는 가정을 포함합니다. 수익률에 자기상관이 강하거나 시장 국면에 따라 변동성이 크게 달라지면 단순 연환산 값이 실제 1년 위험을 정확히 나타내지 못할 수 있습니다.
계산할 때는 가격 자체가 아니라 수익률을 사용해야 합니다. 주가 10만 원과 1만 원의 가격 차이는 변동성 위험을 직접 설명하지 않지만, 각각의 등락률은 같은 단위로 비교할 수 있습니다.
3. 하방편차는 손실 방향만 측정한다
하방편차(Downside Deviation)는 목표수익률보다 낮은 관측값만 부족분으로 계산합니다. 목표수익률은 최소허용수익률(MAR, Minimum Acceptable Return)이라고도 부릅니다.
이번 글에서는 월간 목표수익률을 0%로 설정합니다.
월 수익률이 +3%라면 부족분 0%
월 수익률이 -2%라면 부족분 -2%
하방편차 = 모든 월의 부족분 제곱 평균의 제곱근
연환산할 때는 변동성과 마찬가지로 월간 값에 √12를 곱합니다.
목표를 월 1%로 바꾸면 결과도 달라집니다. 수익률이 +0.5%인 달은 돈을 잃지 않았지만 목표보다 0.5%포인트 부족했기 때문에 하방 위험에 포함됩니다.
따라서 하방편차 숫자를 비교할 때는 다음 조건이 같아야 합니다.
- 수익률 빈도: 일간·주간·월간
- 목표수익률 또는 MAR
- 전체 관측값을 분모로 쓰는지, 목표 아래 관측값만 쓰는지
- 연환산에 사용한 기간 수
4. 같은 +12% 수익인데 위험 순위가 뒤집힌다
두 경로의 1년 누적수익률을 모두 +12%로 맞췄습니다.
상승 급등형은 11개월 동안 0%에 머물다가 마지막 달에 12% 상승합니다. 손실 포함형은 10개월 동안 2%씩 오르고 두 달 동안 각각 약 4.15% 하락합니다.

| 경로 | 누적수익률 | 연환산 변동성 | 연환산 하방편차 |
|---|---|---|---|
| 상승 급등형 | +12.00% | 12.00% | 0.00% |
| 손실 포함형 | +12.00% | 8.29% | 5.86% |
변동성은 마지막 달의 +12% 급등을 큰 흔들림으로 계산합니다. 그래서 손실이 한 번도 없는 상승 급등형의 위험이 더 높게 나옵니다.
하방편차는 0% 아래로 내려간 달만 계산합니다. 상승 급등형은 하방편차가 0%이고, 두 번의 손실을 겪은 손실 포함형은 5.86%입니다.
어느 결과가 맞고 다른 결과가 틀린 것은 아닙니다. 변동성은 전체 불확실성을, 하방편차는 목표 아래의 결과를 측정합니다. 지표에 넣은 위험의 정의가 다르기 때문에 순위도 달라집니다.
5. Python으로 변동성과 하방편차 계산하기
아래 코드는 별도 데이터 파일 없이 두 경로의 누적수익률, 변동성과 하방편차를 계산합니다. 실행에는 numpy가 필요합니다.
import numpy as np
def calculate_metrics(returns: np.ndarray, periods_per_year: int = 12, target_return: float = 0.0) -> dict[str, float]:
shortfall = np.minimum(returns - target_return, 0.0)
return {
"total_return": float(np.prod(1.0 + returns) - 1.0),
"annual_volatility": float(np.std(returns, ddof=1) * np.sqrt(periods_per_year)),
"downside_deviation": float(np.sqrt(np.mean(shortfall**2)) * np.sqrt(periods_per_year)),
}
loss_return = np.sqrt(1.12 / 1.02**10) - 1.0
examples = {
"상승 급등형": np.array([0.0] * 11 + [0.12]),
"손실 포함형": np.array([0.02] * 10 + [loss_return, loss_return]),
}
for name, returns in examples.items():
result = calculate_metrics(returns)
print(f"{name}: 누적수익률 {result['total_return']:.2%}, 변동성 {result['annual_volatility']:.2%}, 하방편차 {result['downside_deviation']:.2%}")
실행 결과는 다음과 같습니다.
상승 급등형: 누적수익률 12.00%, 변동성 12.00%, 하방편차 0.00%
손실 포함형: 누적수익률 12.00%, 변동성 8.29%, 하방편차 5.86%
하방편차가 0%라고 해서 미래 손실 가능성까지 0이라는 뜻은 아닙니다. 관측 기간에 목표수익률보다 낮은 값이 없었다는 의미일 뿐입니다.
6. 실제 LAB 전략 48개월 수익률 비교
SYSTEM LAB 14에서 사용한 여섯 자동매매 전략을 같은 조건으로 다시 계산했습니다.
비교 기간은 2022년 1월부터 2025년 12월까지 48개월입니다. 국내 주식 30종목을 동일 비중으로 구성했고 매수와 매도에 각각 0.05% 비용을 반영했습니다.
일간 수익률을 월간 수익률로 복리 집계한 뒤 표본 표준편차와 목표수익률 0% 기준 하방편차를 계산했습니다. 두 값은 각각 √12를 곱해 연환산했습니다.
| 전략 | 누적수익률 | 변동성 | 하방편차 | 손실 월 |
|---|---|---|---|---|
| EMA 20·100 | +83.26% | 21.18% | 8.79% | 25개월 |
| EMA 35·120 | +79.97% | 20.82% | 9.26% | 25개월 |
| ROC 추세 | +42.44% | 18.86% | 8.00% | 24개월 |
| 돈치안 돌파 | +28.85% | 13.51% | 5.44% | 24개월 |
| ATR 돌파 | +31.19% | 13.39% | 4.79% | 28개월 |
| CCI 역추세 | +7.20% | 2.77% | 1.70% | 19개월 |
전체 변동성과 하방편차의 큰 순서는 비슷했습니다. CCI 역추세는 두 값이 모두 가장 낮았고, EMA 계열은 두 값이 모두 높은 편이었습니다.
하지만 상위 두 전략의 순서는 바뀌었습니다. 변동성 기준으로는 EMA 20·100이 21.18%로 1위였지만 하방편차 기준으로는 EMA 35·120이 9.26%로 1위였습니다.
7. EMA 두 전략의 위험 순위가 바뀐 이유
EMA 20·100과 EMA 35·120은 모두 48개월 중 25개월이 음수였습니다. 손실 발생 횟수만으로는 차이가 없습니다.
EMA 20·100의 최고 월 수익률은 +22.83%로 EMA 35·120의 +21.53%보다 컸습니다. 이 상승 폭은 전체 변동성을 높이는 방향으로 작용합니다.
반면 하방편차는 최악의 한 달만 보지 않고 모든 목표 미달 수익률의 제곱을 평균합니다. EMA 20·100의 최악 월은 -10.62%, EMA 35·120은 -10.40%로 전자가 조금 더 나빴지만, 음수 월 전체를 합쳐 계산한 하방편차는 EMA 35·120이 더 컸습니다.
이 결과는 다음 차이를 보여줍니다.
- 변동성: 상승 월과 하락 월을 포함한 전체 분포의 폭
- 하방편차: 목표 아래로 내려간 횟수와 크기를 결합한 부족분
최고 수익과 최악 손실 한 개씩만 비교해서는 두 지표의 차이를 설명할 수 없습니다. 수익률 분포 전체를 계산해야 합니다.
8. 하방편차를 해석할 때 주의할 점
목표수익률에 따라 값이 바뀐다
목표를 0%로 두면 손실만 측정하지만, 예금 금리나 전략의 요구수익률을 목표로 두면 작은 양의 수익도 부족분에 포함됩니다. 서로 다른 MAR로 계산한 하방편차를 직접 비교하면 안 됩니다.
계산 라이브러리마다 분모가 다를 수 있다
이번 글은 전체 48개월을 분모로 사용했습니다. 일부 구현은 목표보다 낮았던 달만 분모로 사용합니다. 후자는 같은 데이터에서도 더 큰 값이 나올 수 있습니다.
빈도에 따라 결과가 달라진다
일간에는 손실이 있었어도 월말까지 회복하면 월간 하방편차에는 그 과정이 사라집니다. 단기 위험을 관리한다면 일간, 장기 전략을 비교한다면 월간처럼 목적에 맞는 빈도를 사용해야 합니다.
낮은 하방편차가 높은 성과를 뜻하지 않는다
CCI 역추세의 하방편차는 1.70%로 가장 낮았지만 누적수익률도 +7.20%로 가장 낮았습니다. 위험 숫자만 작다고 좋은 전략으로 결정할 수 없습니다.
극단적 손실과 회복 시간은 따로 확인한다
하방편차는 여러 손실을 평균한 값입니다. 한 번의 큰 꼬리 손실, MDD와 전고점 아래에 머문 기간은 별도로 확인해야 합니다.
9. 두 지표는 어디에 연결되는가
변동성과 하방편차는 다음 위험조정 성과지표의 분모로 사용됩니다.
| 지표 | 위험 측정값 | 해석 질문 |
|---|---|---|
| 샤프 비율 | 전체 변동성 | 전체 흔들림 1단위당 초과수익은 얼마인가 |
| 소르티노 비율 | 하방편차 | 나쁜 흔들림 1단위당 초과수익은 얼마인가 |
| 칼마 비율 | MDD 절댓값 | 최대 낙폭 1단위당 CAGR은 얼마인가 |
같은 100% 수익을 기간으로 보정한 CAGR, 손실의 깊이와 시간을 나눈 MDD·낙폭 기간과 함께 보면 수익성·평소 흔들림·최악 손실을 서로 다른 축으로 확인할 수 있습니다.
다음 성과지표 004에서는 수익률을 전체 변동성으로 나누는 샤프 비율을 계산하겠습니다. 수익률이 높은 전략과 변동성이 낮은 전략 중 어느 쪽의 위험 대비 효율이 좋은지 실제 LAB 전략으로 비교하겠습니다.
10. 정리
첫째, 변동성은 상승과 하락을 모두 포함한 수익률 분포의 폭이고 하방편차는 목표수익률 아래의 부족분만 측정합니다.
둘째, 같은 +12% 수익이어도 상승 급등형은 변동성 12.00%·하방편차 0.00%, 손실 포함형은 변동성 8.29%·하방편차 5.86%로 위험 순위가 반대로 나타날 수 있습니다.
셋째, 실제 LAB 전략에서도 EMA 20·100과 EMA 35·120의 위험 1·2위가 바뀌었습니다. 지표를 비교할 때는 수익률 빈도, 목표수익률, 분모와 연환산 조건을 함께 확인해야 합니다.
이 글은 학습과 정보 제공을 위한 자료이며 특정 종목이나 전략의 매수·매도를 권유하지 않습니다. 데이터와 계산 조건을 바꾸면 결과도 달라질 수 있으며 최종 투자 판단과 책임은 투자자 본인에게 있습니다.