기술적 분석 6장: ATR로 종목마다 다른 손절선을 계산하기
삼성전자와 변동성이 큰 바이오주에 똑같이 -7% 손절선을 적용하면 어떤 종목에는 너무 좁고, 다른 종목에는 너무 넓을 수 있습니다. ATR은 최근 가격 범위를 이용해 종목별 변동성을 비교하는 방법입니다.
ATR 계산
Section titled “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_rangedf["atr14_pct"] = df.groupby("code")["true_range"].transform( lambda x: x.rolling(14).mean()) / df["close"]실제 공개 코드에서는 종목별 그룹 안에서 True Range를 계산합니다. atr14_pct는 ATR을 현재 가격으로 나눈 값이므로 종목 가격이 달라도 변동성을 비교할 수 있습니다.
복합 신호를 변동성별로 나누기
Section titled “복합 신호를 변동성별로 나누기”MA20·MA60·RSI·MACD·거래량 조건을 동시에 만족한 진입 신호 중 20일 이후 수익률을 계산할 수 있는 1,601건을 ATR 기준 세 그룹으로 나누었습니다. 각 그룹의 실제 20일 결과는 다음과 같습니다.
| 변동성 그룹 | 신호 수 | 평균 ATR14/가격 | 양수 비율 | 평균 수익률 | 중앙값 |
|---|---|---|---|---|---|
| 낮은 변동성 | 534 | 4.08% | 59.4% | +7.73% | +3.76% |
| 중간 변동성 | 533 | 6.41% | 53.7% | +9.00% | +2.24% |
| 높은 변동성 | 534 | 10.01% | 47.0% | +4.36% | -1.83% |
평균 수익률만 보면 중간 변동성이 가장 높습니다. 하지만 높은 변동성 그룹은 양수 비율이 41.9%이고 중앙값도 음수입니다.
ATR은 매수 신호가 아니라 포지션 크기와 손절 폭을 정하는 도구입니다.
target_risk = 100_000stop_distance = df["atr14_pct"] * df["close"] * 2df["shares"] = (target_risk / stop_distance).fillna(0).astype(int)변동성이 높은 종목을 무조건 제외할 필요는 없습니다. 대신 같은 금액을 매수하지 않고, 손실 금액이 일정하도록 수량을 조절해야 합니다. 이번 결과는 변동성 높은 신호를 그대로 추격하기보다 ATR을 이용해 위험을 먼저 제한해야 한다는 점을 보여줍니다.
원자료는 변동성 그룹 결과에서 확인할 수 있습니다.