수익률보다 먼저 봐야 할 것: 손실 경로와 거래비용
근거와 검증 범위 — 가상 수익률·비용 계산 예제
본문의 코드와 수치는 교육용 가상 수익률·비용 가정에 대한 계산입니다. 실제 전략 성과나 시장 거래비용을 측정한 값이 아니며, 실주문의 스프레드·슬리피지·시장충격은 별도 확인이 필요합니다.
같은 수익률이라면 어떤 경로로 벌었고, 실제 거래비용을 차감한 뒤에도 성과가 남는지 확인한다
지난 4편에서는 결과를 보기 전에 가설과 검증 절차를 고정하고 시간 순서에 따라 백테스트하는 방법을 다뤘다. 그러나 그 절차를 통과했다고 평가가 끝나는 것은 아니다. 이제 그 결과를 얻는 동안 얼마나 잃었고, 얼마나 크게 포지션을 바꿨으며, 비용을 차감한 뒤에도 성과가 남는지 확인해야 한다.
처음에는 백테스트 결과를 열면 가장 높은 누적수익률부터 봤다. 최종 자산가치가 가장 큰 전략이 가장 좋은 전략처럼 보였다. 하지만 같은 최종수익률이라도 손실이 몰린 순서와 회복 과정은 다를 수 있고, 백테스트가 생략한 수수료와 체결가격의 차이는 실제 결과를 낮출 수 있다.[S7] [S9] [S10]
그래서 지금은 질문을 이렇게 바꿨다.
같은 수익률이라면 어떤 경로로 벌었고, 그 결과가 거래 가능한 규모와 비용을 반영한 뒤에도 남는가?
이 글의 코드와 숫자는 모두 교육·연구용 가상 예제다. 실제 전략의 성과나 시장의 거래비용을 나타내지 않으며, 특정 종목 추천·매매 지시·수익 보장 또는 투자 조언이 아니다.
수익률부터 정확히 읽기: 더하기와 복리는 다르다
두 기간 동안 +10%, -10%를 차례로 기록했다고 가정해 보자.
| 기간 | 수익률 | 자산가치 |
|---|---|---|
| 시작 | — | 100 |
| 1기 | +10% | 110 |
| 2기 | -10% | 99 |
기간별 수익률을 단순히 더하면 결과는 0%다.
+10% - 10% = 0%하지만 실제 자산가치는 수익률이 차례로 곱해진다. 100에서 10% 상승하면 110이 되고, 그다음 10% 하락은 100이 아니라 110을 기준으로 계산된다.
1.10 × 0.90 - 1 = -1%따라서 최종 자산가치는 99이고 복리 누적수익률은 -1%다. 복리는 원금뿐 아니라 앞서 발생한 수익과 손실이 반영된 자산가치에 다음 수익률을 적용하는 구조다.[S1]
이 차이 때문에 백테스트에서는 적어도 다음 값을 구분해야 한다.
- 기간별 수익률의 단순 합
- 실제 자산가치의 누적수익률
- 관측기간을 1년 단위로 환산한 연환산 복리수익률
연환산 복리수익률은 일반적으로 최종 자산가치에 관측 연수의 역수를 거듭제곱해 계산할 수 있다.[S1] 다만 관측 빈도, 시작일과 종료일, 전체 기간, 비용 차감 여부와 계산식을 함께 밝혀야 한다. 특히 짧은 표본을 기계적으로 연환산한 숫자는 미래 1년의 예상수익률이 아니다.[S5]
비용도 같은 맥락에서 봐야 한다. 오늘 차감한 비용은 오늘 수익률만 낮추는 것이 아니라 이후 복리 계산의 기반이 되는 자산가치도 줄인다.[S1] [S7]
변동성은 손실만 재는 값이 아니다
변동성은 일반적으로 기간별 수익률이 평균을 중심으로 얼마나 흩어졌는지를 표준편차로 요약한다. 평균보다 낮은 수익률뿐 아니라 평균보다 높은 수익률의 편차도 함께 반영한다.[S2]
따라서 “변동성이 높다”와 “손실이 컸다”는 같은 말이 아니다. 큰 상승이 자주 발생해도 변동성은 높아질 수 있다.[S2]
변동성이 알려 주는 것은 기간별 수익률의 전반적인 흔들림 정도다. 동일한 빈도와 계산식을 사용한다면 여러 전략의 흔들림을 비교하는 데 유용하다. 반면 다음 질문에는 직접 답하지 못한다.
- 고점에서 저점까지 얼마나 깊게 하락했는가?
- 손실이 몇 기간 연속됐는가?
- 이전 고점을 회복하는 데 얼마나 걸렸는가?
- 평가 종료 시점에도 손실이 회복되지 않았는가?
- 극단적인 꼬리손실이 앞으로 얼마나 발생할 수 있는가?
변동성을 표시할 때는 일별·주별·월별 중 어떤 수익률을 사용했는지, 단순수익률인지 로그수익률인지, 표본 또는 모집단 표준편차인지, 어떤 방식으로 연환산했는지를 공개해야 한다. 손실 방향을 더 직접적으로 살펴보려면 최대 낙폭이나 하방편차 같은 보완 지표가 필요하다.[S2]
최대 낙폭은 가장 깊은 하락을 보여 준다
최대 낙폭(maximum drawdown)은 지정한 평가기간 안에서 누적 자산가치의 고점부터 그 이후 저점까지 발생한 가장 큰 비율 손실이다.[S3]
이 글에서는 낙폭을 다음과 같이 계산하고 음수로 표시한다.
낙폭 = 현재 자산가치 / 이전 최고 자산가치 - 1예를 들어 이전 최고 자산가치가 100이고 이후 저점이 80이라면 낙폭은 -20%다.
최대 낙폭은 “과거 백테스트에서 고점 대비 얼마나 깊게 내려갔는가?”를 직관적으로 보여 준다. 그러나 단 하나의 최악 구간만 요약하므로 낙폭이 몇 번 발생했는지, 얼마나 오래 지속됐는지, 언제 회복했는지, 평가가 끝날 때까지 회복하지 못했는지를 모두 설명하지는 않는다.[S3]
따라서 최대 낙폭 옆에는 다음 정보를 함께 기록하는 편이 낫다.
- 평가 시작일과 종료일
- 일별·주별·월별 등 계산 빈도
- 낙폭의 고점일과 저점일
- 이전 고점 회복일
- 회복하지 못했다면 평가 종료일까지의 underwater 기간
최대 낙폭은 지정된 과거 평가기간에 관측된 고점과 저점 사이의 손실을 요약한 값이다.[S3] 과거 경로에서 회복한 기록이 있더라도 이 지표만으로 미래의 회복 가능성을 입증할 수는 없다.
재현 실험 1: 같은 최종수익률, 다른 손실 경로
다음은 실제 시장 자료가 아닌 6개월짜리 교육용 가상 수익률이다. 두 경로에는 똑같은 여섯 개의 월별 수익률이 들어 있지만 순서가 다르다.
| 경로 | 월별 수익률 순서 |
|---|---|
| A: 손실 집중 | +10%, +8%, -12%, -8%, +7%, +6% |
| B: 손실 분산 | +7%, +8%, -12%, +6%, +10%, -8% |
계산 가정은 다음과 같다.
- 빈도: 월별
- 표본 수: 6개월
- 무위험수익률: 월 0%
- 변동성: 월별 표본 표준편차(
ddof=1)에√12를 곱해 연환산 - Sharpe ratio: 월평균 수익률을 월별 표본 표준편차로 나누고
√12를 곱함 - 최대 낙폭: 시작 자산가치 1을 포함한 누적 자산가치에서 계산
- 낙폭 표기: 음수
import numpy as npimport pandas as pdpaths = pd.DataFrame({ "A_손실집중": [0.10, 0.08, -0.12, -0.08, 0.07, 0.06], "B_손실분산": [0.07, 0.08, -0.12, 0.06, 0.10, -0.08],})def path_metrics(r): wealth = pd.concat( [pd.Series([1.0]), (1 + r).cumprod()], ignore_index=True, ) drawdown = wealth / wealth.cummax() - 1 return pd.Series({ "최종 누적수익률": wealth.iloc[-1] - 1, "연환산수익률": wealth.iloc[-1] ** (12 / len(r)) - 1, "연환산변동성": r.std(ddof=1) * np.sqrt(12), "최대낙폭": drawdown.min(), "Sharpe": r.mean() / r.std(ddof=1) * np.sqrt(12), })result = paths.apply(path_metrics).Tprint(result)실행 결과는 다음과 같다.
| 경로 | 최종 누적수익률 | 연환산수익률 | 연환산 변동성 | 최대 낙폭 | Sharpe |
|---|---|---|---|---|---|
| A: 손실 집중 | 9.0879% | 19.0017% | 32.3790% | -19.0400% | 0.6795 |
| B: 손실 분산 | 9.0879% | 19.0017% | 32.3790% | -12.0000% | 0.6795 |
같은 기간별 수익률을 순서만 바꿨으므로 복리곱과 최종 누적수익률은 같다. 수익률 표본 자체도 같기 때문에 산술평균, 표준편차와 위 방식으로 계산한 Sharpe ratio 역시 같다.
하지만 A에서는 -12%와 -8%가 연속해서 발생한다. 첫 손실 뒤 줄어든 자산가치에 다시 손실이 적용돼 최대 낙폭이 -19.04%까지 깊어진다. B의 최대 낙폭은 -12%다.
최종수익률·변동성·Sharpe ratio가 같아도 고점 대비 손실 경로는 다를 수 있다는 뜻이다. 최대 낙폭도 손실의 지속기간과 회복기간을 전부 보여 주지는 않으므로 누적 자산가치 곡선과 회복 여부를 함께 확인해야 한다.[S3]
여기서 연환산수익률 19.0017%는 불과 6개월의 가상 표본을 같은 속도가 유지된다는 계산 규칙으로 확장한 값이다. 미래 1년 성과에 대한 예측으로 해석해서는 안 된다. 자기상관과 표본 특성을 고려하지 않은 단순 연환산 Sharpe에도 같은 주의가 필요하다.[S5]
이 결과는 두 가상 배열의 계산 결과일 뿐 실제 전략의 성과나 위험 특성으로 일반화할 수 없다.
Sharpe ratio는 출발점이지 단독 판정표가 아니다
Sharpe ratio는 평균 초과수익을 그 차이수익률의 표준편차로 나눈 위험조정 성과 지표다.[S4]
Sharpe ratio= 평균(전략수익률 - 비교수익률) / 표준편차(전략수익률 - 비교수익률)입문자 관점에서는 “감수한 변동성 한 단위당 어느 정도의 평균 초과수익을 얻었는가?”라고 읽을 수 있다. 다만 여기서 위험은 손실만을 뜻하지 않는다. 분모가 표준편차이므로 상승과 하락 방향의 흔들림을 함께 반영한다.[S2] [S4]
Sharpe ratio를 비교하려면 적어도 다음 조건을 밝혀야 한다.
- 수익률 측정 빈도
- 평가 시작일과 종료일
- 관측치 수
- 사용한 무위험 또는 비교수익률
- 비용 차감 전인지 후인지
- 연환산 방식
- 자기상관 조정 여부
표본 Sharpe ratio의 평균과 표준편차는 모두 관측 자료에서 추정한 값이다. 표본 기간과 측정 빈도, 수익률의 시계열 의존성과 분포에 따라 추정오차가 달라질 수 있다.[S5]
특히 월별 Sharpe에 √12를 곱하는 연환산은 언제나 성립하는 규칙이 아니다. 월별 수익률에 자기상관이 있다면 이 단순 변환은 왜곡된 값을 만들 수 있다.[S5] 비정상적인 분포와 꼬리위험까지 Sharpe 하나로 충분히 설명할 수 있다는 근거도 확인되지 않았다.
“관측치가 몇 개 이상이면 Sharpe가 안정적이다”라고 말할 수 있는 보편적인 최소 표본 길이 역시 이번 연구에서는 확인하지 못했다. 따라서 Sharpe ratio 하나로 전략의 순위를 확정하기보다 최대 낙폭, 손실 지속기간, turnover와 비용 민감도를 함께 읽어야 한다.[S3] [S5] [S6]
거래 횟수와 turnover는 다르다
거래 횟수는 주문·체결·리밸런싱 같은 사건의 수다. Turnover는 일정 기간 포트폴리오 가치에 비해 얼마나 많은 포지션이 교체됐는지를 나타내는 규모 기반 측정치다.[S6]
한 번의 리밸런싱에서 포지션의 10%만 바꾼 경우와 전체를 바꾼 경우는 거래 횟수로는 모두 1회일 수 있다. 그러나 거래 규모와 그에 따른 비용 노출은 같지 않다.
미국 SEC의 펀드 공시 turnover는 원칙적으로 회계연도 매수액과 매도액 중 작은 금액을 월평균 포트폴리오 증권가치로 나눈다.[S6] 반면 이 글의 연구용 백테스트에서는 다음과 같은 가중치 변화량을 사용한다.
turnover_t = Σ_i |w_i,t - w_i,t-1|두 공식은 동일하지 않다. 따라서 turnover라는 이름만 보고 숫자를 직접 비교하기보다 사용한 정의와 계산식을 공개해야 한다.[S6]
turnover를 보고할 때는 다음 내용을 함께 밝히는 편이 좋다.
- 분자와 분모
- 기간별 산식과 합산 방식
- one-way 또는 two-way 해석
- 최초 현금 상태에서의 진입 포함 여부
- 현금 이동 처리
- 숏 포지션과 파생상품 처리
- 연환산 여부
이 시리즈의 다음 편에서는 재현성을 위한 프로젝트 내부 규칙으로 다음 정의를 사용할 예정이다.
월별 turnover = Σ_i |w_i,t - w_i,t-1|비용 = one-way 비용률 × 월별 turnover최초 현금 포지션에서의 진입을 포함하고, 한 자산의 포지션이 +1에서 -1로 바로 바뀌면 turnover를 2로 계산한다. 이는 규제 표준이 아니라 예제와 이후 기준선을 일관되게 비교하기 위한 내부 계산 규칙이다.
SEC는 높은 portfolio turnover가 더 높은 거래비용과 과세계좌에서의 세금 증가 가능성을 나타낼 수 있다고 설명한다.[S6] 다만 그 설명만으로 개별 백테스트의 정확한 비용이나 세금을 계산할 수는 없다.
거래비용을 한 단어로 뭉치지 않기
백테스트에서 “거래비용 10bp”라고 적는 것만으로는 무엇을 차감했는지 알기 어렵다. 수수료, 세금, bid-ask spread, 슬리피지와 시장 충격은 발생 원인과 계산 기준이 다르다.
| 항목 | 이 글에서 사용하는 의미 | 계산할 때 공개할 내용 |
|---|---|---|
| 수수료 | 중개·거래 서비스에 명시적으로 지불하는 비용[S7] [S12] | 비용 자료의 적용 대상과 포함 범위 |
| 세금 | 이번 연구에서는 시장·상품·계좌별 세율과 적용 조건을 하나의 값으로 검증하지 못함 | 해당 사례에 적용되는 조건을 별도로 확인 |
| Bid-ask spread | 매수호가와 매도호가의 차이에서 생기는 간접 비용[S8] | 사용한 호가 시점과 거래 방향 |
| 슬리피지 | 명시한 기준 가격과 실제 평균 체결가격의 차이[S9] | 기준가격, 체결가격과 차감 범위 |
| 시장 충격 | 큰 주문이 제한된 호가 깊이를 소진하며 평균 체결가격을 바꿀 수 있는 효과[S11] | 주문 규모와 호가 깊이 |
수수료가 직접 청구되는 비용이라면 bid-ask spread는 즉시 사고팔 때 부담할 수 있는 간접 비용이다. Bid는 구매자가 지불하려는 최고 가격이고 ask는 판매자가 받으려는 최저 가격이며, 두 가격의 차이가 spread다.[S8]
시장가 주문은 체결 가능성을 높이지만 주문을 제출할 때 기대한 가격에 반드시 체결된다는 보장은 없다. 따라서 슬리피지를 계산할 때는 어떤 기준가격과 실제 체결가격을 비교했는지 명시해야 한다.[S9]
비용 항목을 따로 추정할 때는 각 항목의 포함 범위가 서로 겹치는지 확인해야 한다. 이번 연구만으로 spread나 시장 충격이 특정 슬리피지 산식에 항상 포함된다고 일반화할 수는 없다. 따라서 사용한 기준가격, 각 항목의 정의와 차감 범위를 공개해 중복 차감 여부를 독자가 확인할 수 있게 해야 한다.
이번 연구에서는 시장·상품·계좌별 세율과 실제 수수료 수준을 하나의 값으로 검증하지 못했다. 따라서 특정 사례에 적용할 때는 관련 비용 자료와 제도의 적용 조건을 별도로 확인해야 한다. “수수료 0”이라는 표현도 다른 비용이나 중개사의 다른 수익원이 없다는 뜻은 아니다.[S12]
그러므로 특정 세율이나 비용률을 모든 시장에 적용되는 값처럼 제시할 수 없다. 아래에서 사용하는 0·5·10·20bp도 검증된 실제 비용 범위가 아니라 비용 민감도를 확인하기 위한 교육용 시나리오다.
포지션이 커져도 비용은 같은 비율일까?
고정 bp 비용은 포지션 변화가 클수록 더 많은 비용이 발생한다는 구조를 간단히 표현한다. 여러 전략을 동일한 규칙으로 비교하는 첫 민감도 분석으로는 유용하다.
하지만 실제 주문의 결과는 주문 규모와 호가 깊이, 유동성, 주문 방식 및 실제 체결가격과 관련될 수 있다. 주문 규모가 제한된 호가 깊이에 비해 크면 여러 가격 수준에서 체결돼 평균 체결가격이 달라질 수 있으며, 주문 방식과 체결 장소도 지불가격과 총 거래비용에 영향을 줄 수 있다.[S9] [S10] [S11]
진열된 물량이 충분한 상품을 하나 사는 것과 진열된 물량 전부를 사려는 것이 같은 단가로 끝난다고 가정할 수 없는 것과 비슷하다.
고정 bp 모형을 현실의 주문비용으로 확장하기 전에 적어도 다음 조건을 구분해 확인해야 한다.[S9] [S10] [S11]
- 주문 규모
- 각 가격 수준의 호가 깊이
- 시장의 유동성
- 시장가·지정가 등 주문 방식
- 기대 또는 기준 가격과 실제 체결가격
따라서 작은 교육용 예제의 고정 bp 결과를 대규모 주문의 현실적인 체결비용으로 일반화해서는 안 된다. 고정 bp 모형이 알려 주는 것은 “같은 turnover에서 비용 가정을 바꾸면 결과가 얼마나 민감하게 변하는가?”까지다.
반대로 다음 항목은 이 단순 모형만으로 결정할 수 없다.
- 실제 주문의 평균 체결가격
- 주문 크기에 따른 시장 충격의 함수와 계수
- 미래 시점의 호가 깊이와 유동성
부분 체결·미체결과 주문 참여율을 백테스트 비용에 어떻게 연결할지에 관한 보편적인 방법은 이번 연구에서 확인하지 못했다. 이 항목들을 모델에 추가하려면 별도의 실행자료와 검증된 가정이 필요하다.
모든 시장과 자산에 공통으로 적용할 수 있는 시장 충격 함수와 계수 역시 이번 연구에서 확인되지 않았다. 실제 운용 가능성을 더 구체적으로 평가하려는 경우에는 주문 규모, 호가 깊이와 실행가격을 추가로 점검하고 이를 반영한 보수적 시나리오를 설계할 수 있다.[S10] [S11]
재현 실험 2: 0·5·10·20bp를 적용하면 무엇이 남는가
이번에는 동일한 가상 전략 수익률과 포지션 변화에 서로 다른 비용률을 적용한다. 자료는 실제 전략이나 시장에서 가져온 것이 아니다.
계산 가정은 다음과 같다.
- 빈도: 월별, 총 12개월
gross_return: 해당 월의 비용 차감 전 수익률- 포지션:
-1,0,1단위 - 최초 포지션: 현금
0 - 월별 turnover:
abs(position[t] - position[t-1]) - 최초
0 → 1진입 포함 1 → -1전환이 있다면 turnover2- 비용률: 거래된 명목 포지션 한 단위에 부과하는 one-way 비용
- 순수익률:
gross_return - turnover × cost_rate - 무위험수익률: 월 0%
- 변동성: 월별 표본 표준편차(
ddof=1)에√12를 곱함 - Sharpe: 월평균 수익률을 월별 표본 표준편차로 나눈 뒤
√12를 곱함 - 자기상관 조정: 하지 않음
- 최대 낙폭: 시작 자산가치 1을 포함하고 음수로 표시
표시된 비용은 one-way 기준이다. 같은 가격에 진입하고 청산하는 단순 왕복 거래는 turnover 합계가 2이므로 표시된 bp의 두 배가 차감된다. 예를 들어 one-way 5bp를 적용하면 0 → 1 → 0 왕복에서 합계 10bp가 차감되는 방식이다.
이번 고정 bp에는 수수료·세금·spread·슬리피지·시장 충격을 분리하지 않고 하나의 가상 비용률로 합쳤다. 실제 데이터에 적용할 때는 어떤 항목을 포함했는지 명시해야 한다.
import numpy as npimport pandas as pddf = pd.DataFrame({ "gross_return": [ 0.025, -0.015, 0.030, 0.010, -0.020, 0.040, -0.010, 0.020, 0.015, -0.025, 0.035, 0.010, ], "position": [1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 0, 1],})# 최초 진입 전 포지션은 0이며 최초 진입도 turnover에 포함한다.previous = df["position"].shift(1, fill_value=0)df["turnover"] = (df["position"] - previous).abs()def metrics(monthly_return): wealth = (1 + monthly_return).cumprod() running_peak = pd.concat([ pd.Series([1.0]), wealth.reset_index(drop=True), ]).cummax().iloc[1:].reset_index(drop=True) drawdown = ( wealth.reset_index(drop=True) / running_peak - 1 ) years = len(monthly_return) / 12 annualized_return = wealth.iloc[-1] ** (1 / years) - 1 annualized_volatility = ( monthly_return.std(ddof=1) * np.sqrt(12) ) sharpe = ( monthly_return.mean() / monthly_return.std(ddof=1) * np.sqrt(12) ) return { "누적수익률": wealth.iloc[-1] - 1, "연환산수익률": annualized_return, "연환산변동성": annualized_volatility, "최대낙폭": drawdown.min(), "Sharpe": sharpe, }rows = []for cost_bp in [0, 5, 10, 20]: cost_rate = cost_bp / 10_000 net_return = ( df["gross_return"] - df["turnover"] * cost_rate ) rows.append({ "비용(bp, one-way)": cost_bp, "총 turnover": df["turnover"].sum(), **metrics(net_return), })result = pd.DataFrame(rows)print(df)print(result)실행 결과는 다음과 같다.
| one-way 비용 | 총 turnover | 누적수익률 | 연환산수익률 | 연환산 변동성 | 최대 낙폭 | Sharpe |
|---|---|---|---|---|---|---|
| 0bp | 9.0 | 11.8268% | 11.8268% | 7.6915% | -2.5000% | 1.4952 |
| 5bp | 9.0 | 11.3315% | 11.3315% | 7.6608% | -2.5500% | 1.4424 |
| 10bp | 9.0 | 10.8382% | 10.8382% | 7.6308% | -2.6000% | 1.3891 |
| 20bp | 9.0 | 9.8574% | 9.8574% | 7.5729% | -2.7000% | 1.2809 |
비용 차감 전 월별 단순수익률의 합은 11.5%지만 기간별 수익률을 곱한 누적수익률은 약 11.83%다. 단순 합과 복리 결과가 반드시 같지는 않다는 점을 다시 확인할 수 있다.
같은 가상 수익률과 포지션에서도 비용 가정을 높이자 비용 차감 후 누적수익률과 Sharpe ratio가 낮아졌다. 최대 낙폭도 조금 더 깊어졌다. 정확한 차이는 이 가상 배열, 비용 차감 시점과 turnover 정의에서 나온 결과일 뿐 실제 전략에 일반화할 수 없다.
또한 12개월짜리 소표본에 자기상관 조정 없이 √12 연환산을 적용했으므로 변동성과 Sharpe는 교육용 요약값에 불과하다.[S5]
고정 bp 계산은 주문 규모, 호가 깊이, 유동성, 주문 방식과 실제 체결가격에 따른 차이를 반영하지 않는다.[S9] [S10] [S11] 부분 체결과 미체결을 비용에 연결하는 보편적 방법도 이번 연구에서는 확인하지 못했다. 독자는 코드의 gross_return과 position을 자신의 백테스트 자료로 바꾸더라도 비용 정의와 체결 가정을 별도로 기록해야 한다.
한 표에서 함께 봐야 할 위험·비용 평가표
수익률과 위험지표를 각각 다른 파일이나 서로 다른 가정으로 계산하면 비교 과정에서 중요한 조건이 숨기 쉽다. 다음 편의 단순 모멘텀 기준선부터는 성과, 손실 경로, 거래 활동과 비용을 한 표에서 확인하려 한다.
| 영역 | 표시할 항목 | 반드시 공개할 가정 |
|---|---|---|
| 성과 | 누적수익률, 연환산 복리수익률 | 빈도, 기간, 복리식, 비용 차감 여부[S1] |
| 흔들림 | 연환산 변동성 | 단순·로그수익률, ddof, 연환산식[S2] [S5] |
| 손실 경로 | 최대 낙폭 | 빈도, 부호, 평가 시작·종료일[S3] |
| 회복 | 최장 underwater 기간, 회복 여부 | 회복 정의와 평가 종료 시 처리[S3] |
| 위험조정 성과 | Sharpe ratio | 비교수익률, 표본 수, 연환산식, 비용 여부[S4] [S5] |
| 거래 활동 | 거래 횟수, turnover | 산식, one-way/two-way, 최초 진입[S6] |
| 비용 민감도 | 0·5·10·20bp 비용 전후 성과 | 포함 비용과 turnover 적용 방식[S7] [S8] [S9] |
| 거래 가능성 | 주문 규모와 유동성 점검 | 호가 깊이, 주문 방식과 체결가격 가정[S9] [S10] [S11] |
이는 특정 전략이 우월하다는 평가표가 아니다. 다음 편부터 전략을 같은 계산 조건으로 비교하기 위한 프로젝트 규격이다.
코드와 결과표 아래에는 다음 주석을 고정해 둘 수 있다.
수익률 빈도:평가 시작일과 종료일:표본 수:연환산 수익률 계산식:변동성 계산식과 ddof:최대 낙폭 부호와 계산 빈도:최대 낙폭의 고점·저점·회복일:Sharpe의 비교·무위험수익률:Sharpe 연환산 방식:자기상관 조정 여부:turnover 계산식:최초 진입 포함 여부:one-way 또는 왕복 비용 해석:각 bp에 포함한 비용 항목:비용 차감 시점:주문 규모와 유동성 가정:부분 체결·미체결을 모델링했다면 그 정의와 근거:이 주석이 있어야 같은 이름의 지표가 실제로 같은 방식으로 계산됐는지 확인할 수 있다.
나의 판단 변화: 최고 수익률에서 비용 뒤의 생존 가능성으로
| 단계 | 지금의 기록 |
|---|---|
| 이전 생각 | 처음에는 백테스트 결과에서 가장 높은 누적수익률부터 봤다. 최종 숫자가 크면 더 좋은 전략이라고 생각했다. |
| 이번에 확인한 것 | 같은 최종수익률과 변동성, Sharpe라도 손실 순서에 따라 최대 낙폭은 달라질 수 있다.[S2] [S3] [S5] 포지션 교체가 많으면 작은 비용도 반복해서 차감되며, turnover의 정의가 다르면 비용 계산도 달라진다.[S6] [S7] |
| 현재 판단 | 수익률을 비교하기 전에 최대 낙폭, 변동성, turnover, 비용 민감도, 회복 여부와 거래 가능성을 먼저 확인한다. 그 조건을 공개한 뒤에 비용 차감 후 복리성과를 비교한다. |
| 아직 모르는 것 | 실제 주문의 spread·슬리피지·시장 충격과 미래 유동성, 과거 낙폭 이후의 미래 회복 가능성은 백테스트 하나로 알 수 없다.[S3] [S9] [S10] [S11] 부분 체결과 미체결을 비용 모형에 연결하는 보편적 방법도 이번 연구에서는 확인하지 못했다. |
판단의 초점이 “더 높은 숫자를 찾는 것”에서 “그 숫자가 어떤 손실과 거래를 거쳐 만들어졌으며 현실적인 비용 뒤에도 남는지 확인하는 것”으로 이동했다.
위험지표를 더 많이 계산한다고 불확실성이 사라지는 것은 아니다. 대신 각 숫자가 설명하는 범위와 설명하지 못하는 범위를 구분할 수 있다.
다음 백테스트에 바로 추가할 열
자신의 백테스트 결과표에 다음 항목을 추가해 볼 수 있다.
- 누적수익률과 연환산 복리수익률을 구분한다.[S1]
- 동일한 빈도로 변동성과 최대 낙폭을 계산한다.[S2] [S3]
- 최대 낙폭의 고점·저점·회복일과 미회복 여부를 기록한다.[S3]
- Sharpe ratio의 비교수익률, 표본 수와 연환산 방식을 공개한다.[S4] [S5]
- 거래 횟수와 turnover를 별도 열로 표시한다.[S6]
- turnover 산식과 최초 진입 포함 여부를 기록한다.
- 같은 turnover 정의로 0·5·10·20bp 비용 민감도를 비교한다.
- 표시한 bp가 one-way인지 왕복 비용인지 밝힌다.
- 고정 bp에 포함한 수수료·세금·spread·슬리피지·시장 충격의 범위를 적는다.[S7] [S8] [S9]
- 주문 규모, 호가 깊이, 유동성, 주문 방식과 실제 체결가격 가정을 별도로 점검한다.[S9] [S10] [S11]
0·5·10·20bp는 실제 비용의 보편적 구간이 아니다. 중요한 것은 특정 숫자를 정답으로 선택하는 일이 아니라 동일한 turnover 정의와 비용 포함 범위 아래에서 전략의 민감도를 비교하는 일이다.
결론: 수익률은 평가의 끝이 아니라 출발점이다
복리수익률은 최종 자산가치가 얼마나 변했는지 보여 주지만 그 과정의 흔들림과 고점 대비 손실을 전부 설명하지 않는다.[S1] 변동성은 위아래 움직임을 함께 요약하고, 최대 낙폭은 관측기간의 가장 깊은 하락 하나를 보여 준다.[S2] [S3] Sharpe ratio는 변동성 대비 초과수익을 비교하는 출발점이지만 표본 기간, 빈도, 비교수익률, 자기상관과 분포에 민감하다.[S4] [S5]
여기에 거래 횟수만이 아니라 포지션 교체 규모인 turnover를 계산하고, 그 정의에 따라 비용을 차감해야 한다.[S6] 주문 규모와 호가 깊이, 유동성 및 주문 방식에 따라 고정 bp만으로는 설명하기 어려운 체결가격 차이가 생길 수 있다.[S9] [S10] [S11]
수익률은 출발점일 뿐이다. 손실 경로와 거래 가능성, 비용 차감 후 남는 성과를 함께 봐야 전략을 비교할 수 있다.
이 글은 교육·연구 목적이며 실제 전략의 성과나 비용을 나타내는 투자 조언이 아니다.
다음 편에서는 이 평가표를 처음 적용할 공통 기준선으로 단순 모멘텀 전략을 만든다.
그렇다면 그 기준선의 신호, 보유 규칙, 리밸런싱 빈도와 비용 가정은 결과를 보기 전에 어떻게 고정해야 할까?
Sources
- [S1] Introduction to Investing | U.S. Securities and Exchange Commission, Investor.gov | 페이지에 확인 가능한 발행·수정일 없음 | https://www.investor.gov/introduction-investing ↩
- [S2] Measurement and Management of Returns and Risk | CAIA Association Research Foundation | 2018 | https://www.cfainstitute.org/sites/default/files/-/media/documents/book/rf-publication/2018/rf-v2018-n1-1.pdf ↩
- [S3] GIPS Standards for Fiduciary Management Providers Handbook | CFA Institute, Global Investment Performance Standards | 2020 | https://www.gipsstandards.org/wp-content/uploads/2021/06/gips-standards-fmp-handbook.pdf ↩
- [S4] The Sharpe Ratio | William F. Sharpe; Stanford University 재게시 | 1994년 가을 | https://web.stanford.edu/~wfsharpe/art/sr/SR.htm ↩
- [S5] The Statistics of Sharpe Ratios | Andrew W. Lo | 2002년 7·8월 | https://traders.berkeley.edu/papers/The-Statistics-of-Sharpe-Ratios.pdf ↩
- [S6] Form N-1A | U.S. Securities and Exchange Commission | 2024년 공개본 | https://www.sec.gov/files/form-n-1a.pdf ↩
- [S7] How Fees and Expenses Affect Your Investment Portfolio – Investor Bulletin | U.S. Securities and Exchange Commission, Office of Investor Education and Assistance | 2025-07-23 | https://www.investor.gov/introduction-investing/general-resources/news-alerts/alerts-bulletins/investor-bulletins/updated ↩
- [S8] Updated Investor Bulletin: Exchange-Traded Funds (ETFs) | U.S. Securities and Exchange Commission, Investor.gov | 2023 | https://www.investor.gov/introduction-investing/general-resources/news-alerts/alerts-bulletins/investor-bulletins-24 ↩
- [S9] Market Order | U.S. Securities and Exchange Commission, Investor.gov | 페이지에 확인 가능한 발행·수정일 없음 | https://www.investor.gov/introduction-investing/investing-basics/glossary/market-order ↩
- [S10] Trade Execution | U.S. Securities and Exchange Commission | 페이지에 확인 가능한 발행·수정일 없음 | https://www.sec.gov/about/reports-publications/investorpubstradexec ↩
- [S11] Regulation NMS: Minimum Pricing Increments, Access Fees, and Transparency of Better Priced Orders | U.S. Securities and Exchange Commission; Federal Register | 2024-10-08 | https://www.govinfo.gov/content/pkg/FR-2024-10-08/pdf/2024-21867.pdf ↩
- [S12] Fees and Commissions | Financial Industry Regulatory Authority | 페이지에 확인 가능한 발행·수정일 없음 | https://www.finra.org/investors/investing/investing-basics/fees-commissions ↩
오류 제보·의견 보내기
글 제목과 주소가 포함된 메일 초안을 엽니다. 내용과 받는 사람을 확인한 뒤 보내주세요.
받는 사람: [email protected]
메일 앱에서 작성메일 앱이 열리지 않으면 아래 내용을 복사해 평소 쓰는 이메일에 붙여 넣으세요.
관련 글
퀀트·데이터 연구 거래비용을 넣어도 결론은 같을까: 합성 포트폴리오의 회계와 위험경로 검사
합성 포트폴리오에 거래비용을 적용해 매수대금과 현금 장부를 점검합니다. 종료수익, 회전율, 최대낙폭이 각각 무엇을 보여주는지 구분합니다.
퀀트·데이터 연구 다시 실행해 확인한 것들: 퀀트 리서치 시스템의 현재와 AI의 역할