콘텐츠로 이동

기술적 분석 6장: ATR로 손절선 최적화

ATR과 변동성 분석

저변동성 대형주와 변동성이 큰 바이오주에 똑같이 -7% 손절선을 적용하면 어떤 종목에는 너무 좁고, 다른 종목에는 너무 넓을 수 있습니다. ATR은 최근 가격 범위를 이용해 종목별 변동성을 비교하는 방법입니다.

previous_close = df.groupby("code")["close"].shift(1)
true_range = pd.concat(
[
df["high"] - df["low"],
(df["high"] - previous_close).abs(),
(df["low"] - previous_close).abs(),
],
axis=1,
).max(axis=1)
df["true_range"] = true_range
df["atr14_pct"] = df.groupby("code")["true_range"].transform(
lambda x: x.rolling(14).mean()
) / df["close"]

실제 공개 코드에서는 종목별 그룹 안에서 True Range를 계산합니다. atr14_pct는 ATR을 현재 가격으로 나눈 값이므로 종목 가격이 달라도 변동성을 비교할 수 있습니다.

복합 신호를 변동성별로 나누기

섹션 제목: “복합 신호를 변동성별로 나누기”

MA20·MA60·RSI·MACD·거래량 조건을 동시에 만족한 진입 신호 중 20일 이후 수익률을 계산할 수 있는 1,601건을 ATR 기준 세 그룹으로 나누었습니다. 각 그룹의 실제 20일 결과는 다음과 같습니다.

변동성 그룹신호 수평균 ATR14/가격양수 비율평균 수익률중앙값
낮은 변동성5344.08%59.4%+7.73%+3.76%
중간 변동성5336.41%53.7%+9.00%+2.24%
높은 변동성53410.01%47.0%+4.36%-1.83%

평균 수익률만 보면 중간 변동성이 가장 높습니다. 그러나 낮은 변동성 그룹의 양수 비율은 59.4%, 중앙값은 +3.76%로 가장 안정적이었습니다. 높은 변동성 그룹은 평균이 +4.36%였지만 양수 비율은 47.0%, 중앙값은 -1.83%였습니다.

ATR은 매수 신호가 아니라 포지션 크기와 손절 폭을 정하는 도구입니다.

target_risk = 100_000
stop_distance = df["atr14_pct"] * df["close"] * 2
df["shares"] = (target_risk / stop_distance).fillna(0).astype(int)

이번 결과에서 중요한 것은 평균수익률 1위인 중간 변동성 그룹을 그대로 고르는 것이 아닙니다. 낮은 변동성은 양수 비율과 중앙값이 좋았고, 중간 변동성은 평균만 높았으며, 높은 변동성은 전형적인 결과가 손실이었습니다. 변동성이 높은 종목을 무조건 제외할 필요는 없지만, 같은 금액을 매수하지 않고 손실 금액이 일정하도록 수량을 조절해야 합니다. ATR은 매수 신호를 강화하는 지표가 아니라, 신호를 실행할 때 위험을 먼저 제한하는 도구입니다.

다음 장에서는 가격이 MA20 위에 있다는 조건에 OBV를 추가했을 때 거래량 확인이 실제로 수익률의 일관성을 높이는지 살펴봅니다.

원자료는 변동성 그룹 결과에서 확인할 수 있습니다.