기술적 분석 2장: 이동평균선 돌파는 수익을 만드는가?
이동평균선은 기술적 분석에서 가장 단순한 도구입니다. 종가가 20일선 위에 있고 20일선이 60일선 위에 있으면 상승 추세라고 정의할 수 있습니다. 문제는 이 규칙이 실제로 수익을 만드는지, 그리고 상승장에만 잘 작동한 결과는 아닌지 확인하는 것입니다.
신호 만들기
Section titled “신호 만들기”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"]신호 당일의 종가 수익률을 사용하지 않고 다음 거래일부터 포지션을 적용했습니다. 이것만으로도 백테스트의 과도한 낙관을 상당히 줄일 수 있습니다.
검증 구간 결과
Section titled “검증 구간 결과”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 |
MA 추세 전략이 검증 구간에서 코스피를 앞섰습니다. 동시에 최대낙폭도 -31.05%였습니다. 따라서 “수익률이 높았다”는 문장만으로는 부족합니다. 투자자는 중간에 30% 이상 하락하는 전략을 실제로 유지할 수 있는지도 함께 판단해야 합니다.
이 결과는 이동평균선이 항상 유효하다는 뜻이 아닙니다. 2026년 검증 구간의 시장 방향성과 표본 구성에 영향을 받은 결과입니다. 이동평균선은 바닥과 꼭지를 정확히 맞히는 도구가 아니라, 하락 중인 종목을 계속 보유하는 시간을 줄이는 추세 필터에 가깝습니다.
다음 장에서는 RSI 30 이하를 매수 신호로 사용하는 평균회귀 발상이 실제로 통하는지 확인합니다.