
1장에서는 MACD와 거래량 신호가 RSI·볼린저 반등보다 20일 수익률에서 상대적으로 나은 결과를 보였습니다. 이번 장에서는 그보다 단순한 추세 조건, 즉 종가 > MA20 > MA60을 계속 보유하는 전략으로 바꿔도 결과가 유지되는지 확인합니다. 사건별 수익률과 실제 포트폴리오 성과는 다를 수 있으므로, 다음 거래일 진입·거래비용·최대낙폭까지 함께 계산합니다.
신호 만들기
섹션 제목: “신호 만들기”df = df.sort_values(["code", "date"])df["ma20"] = df.groupby("code")["close"].transform( lambda x: x.rolling(20).mean())df["ma60"] = df.groupby("code")["close"].transform( lambda x: x.rolling(60).mean())
df["ma_trend"] = ( (df["close"] > df["ma20"]) & (df["ma20"] > df["ma60"]))
# 신호가 만들어진 다음 거래일부터 보유df["position"] = df.groupby("code")["ma_trend"].shift(1).fillna(False)df["strategy_return"] = df["position"] * df["return_1d"]신호 당일의 종가 수익률을 사용하지 않고 다음 거래일부터 포지션을 적용했습니다. 이것만으로도 백테스트의 과도한 낙관을 상당히 줄일 수 있습니다.
검증 구간 결과
섹션 제목: “검증 구간 결과”2026년 1월 1일부터 9월 4일까지의 결과는 다음과 같습니다. 거래비용은 포지션이 바뀔 때 0.15%를 차감했습니다.
| 전략 | 누적수익률 | 연환산수익률 | 최대낙폭 | Sharpe 근사 |
|---|---|---|---|---|
| MA 추세 | +63.55% | +111.03% | -31.05% | 2.12 |
| 코스피 | +33.62% | +55.69% | -38.63% | 0.91 |
차트 읽는 법
섹션 제목: “차트 읽는 법”이 차트는 검증 구간인 2026년 1월 1일부터 9월 4일까지, 시작 자산을 1로 놓고 매일의 수익률을 누적한 결과입니다. 가로축은 날짜이고 세로축은 누적자산입니다. 예를 들어 선이 1.64에서 끝나면 시작 자산 1이 1.64가 되었다는 뜻이므로 누적수익률은 약 +64%입니다. 하루 수익률이나 특정 종목의 주가가 아니라 포트폴리오 전체의 복리 성과를 그린 선입니다.
차트의 선은 다음과 같이 구성됩니다. 여기서 범례의 Composite는 composition(구성)이라는 별도 지표가 아니라, 여러 조건을 합친 복합 신호를 뜻합니다.
| 범례 | 의미 | 실제 보유 구성 |
|---|---|---|
MA trend | 종가 > MA20 > MA60인 상승 추세 | 조건을 만족한 종목을 동일 비중으로 보유. 검증 구간 평균 90.7개 |
MACD trend | MACD 골든크로스가 발생한 뒤 20거래일 동안 활성화 | 활성 신호 종목을 동일 비중으로 보유. 평균 187.1개 |
Composite | 추세·RSI·MACD·거래량 조건을 모두 만족한 복합 신호 | 종가 > MA20, MA20 > MA60, RSI 40~70, MACD > 시그널, 거래량 비율 > 1인 종목을 동일 비중으로 보유. 평균 15.4개 |
KOSPI | 비교 기준인 코스피 | 코스피 일별 수익률을 그대로 누적한 벤치마크 |
세 전략 모두 기준일의 신호를 다음 거래일부터 적용하고, 포지션이 바뀔 때 거래비용 0.15%를 반영했습니다. 따라서 ‘구성’은 단순히 어떤 지표를 계산했는지가 아니라, 어떤 종목을 언제 포트폴리오에 넣고, 보유 종목 사이에 자금을 어떻게 나눴는지를 의미합니다. 조건을 만족하는 종목이 여러 개면 각 종목의 수익률을 동일 비중으로 평균내며, 조건을 만족하는 종목이 없으면 해당 날짜의 전략 수익률은 0으로 처리합니다.
이제 선의 높이보다 선 사이의 간격과 중간 하락을 봐야 합니다. MA 추세선의 검증 구간 끝값은 약 1.64로 코스피의 약 1.34보다 높지만, 중간에 크게 꺾인 구간도 있습니다. 이 중간 하락이 최대낙폭 -31.05%로 이어졌습니다. 즉 끝점은 “얼마나 벌었는가”, 선이 가장 깊게 내려간 폭은 “그 결과를 얻는 동안 얼마나 잃을 수 있었는가”를 보여줍니다. Composite 선이 거의 1 부근에 머무는 것은 조건이 더 엄격해 보인다는 이유만으로 성과가 좋아지는 것은 아니며, 적은 보유 종목 수와 신호 공백의 영향까지 함께 봐야 한다는 의미입니다.
MA 추세 전략은 검증 구간에서 코스피보다 29.93%포인트 높은 누적수익률을 기록했고, 최대낙폭도 코스피보다 7.58%포인트 작았습니다. 다만 평균 보유 종목 수가 약 90.7개인 분산 포트폴리오였고, 그 상태에서도 최대낙폭은 -31.05%였습니다. “수익률이 높았다”는 문장만으로는 부족하며, 투자자는 이 하락을 실제로 유지할 수 있는지도 판단해야 합니다.
인사이트
섹션 제목: “인사이트”이번 결과에서 얻는 구체적인 인사이트는 이동평균선이 “돌파 순간을 맞히는 신호”라기보다 상승 상태에 있는 종목을 보유하고 하락 상태의 종목을 비우는 필터로 작동했다는 점입니다. 1장의 신호별 평균수익률을 전략으로 옮겼을 때도 성과가 이어졌지만, -31.05%의 낙폭이 남았으므로 추세 필터가 위험을 제거한 것은 아닙니다. 또한 2026년 검증 구간의 시장 방향성과 표본 구성에 영향을 받은 결과이므로 다른 기간에도 같은 우위가 반복되는지는 별도 검증이 필요합니다.
다음 장에서는 RSI 30 이하를 매수 신호로 사용하는 평균회귀 발상이 실제로 통하는지 확인합니다.