αAlphaware
QUANT5분 읽기

ATR로 손절 거리와 포지션 크기를 정하는 법

와일더의 True Range와 평활 방식으로 ATR을 계산하고, 변동성 기반 손절 거리와 거래당 위험을 맞추는 수량 규칙을 검증 가능한 형태로 정리합니다.

ATR로 손절 거리와 포지션 크기를 정하는 법

업데이트: 2026년 11월 3일. ATR의 정의와 계산, 손절 거리·수량 규칙에 쓰는 방법을 다룹니다. 본문의 숫자는 계산을 보여주기 위한 가상 예시이며, 백테스트나 실제 운용 성과가 아닙니다.

ATR은 방향이 아니라 움직임의 크기를 잰다

ATR(Average True Range)은 J. 웰스 와일더(J. Welles Wilder Jr.)가 1978년 저서 New Concepts in Technical Trading Systems에서 소개한 변동성 지표입니다. 가격이 오를지 내릴지는 말하지 않습니다. 최근 한 봉이 평균적으로 얼마나 움직였는지를 가격 단위로 보여줄 뿐입니다.

그래서 ATR의 쓰임새는 진입 방향보다 위험 관리 쪽에 있습니다. 손절을 어디에 둘지, 그 손절 거리에서 몇 단위를 사야 거래당 손실 한도를 지킬 수 있는지를 같은 숫자로 연결할 수 있습니다. ATR 상승은 급등에서도 급락에서도 나타나므로 그 자체로 강세나 약세 신호가 아닙니다.

True Range는 장중 범위에 갭을 더한다

고가에서 저가를 뺀 값만 쓰면 전일 종가에서 크게 갭으로 시작한 날의 움직임을 놓칩니다. 와일더의 True Range(TR)는 세 값 중 가장 큰 값을 씁니다.

TR = max(고가 − 저가, |고가 − 전일 종가|, |저가 − 전일 종가|)

예를 들어 전일 종가가 100이고 오늘 104–106 사이에서만 거래됐다면 장중 범위는 2지만 TR은 6입니다. 갭으로 이동한 4가 위험으로 계산에 들어갑니다.

True Range의 세 후보 값과 그 최댓값을 평활해 ATR(14)을 만드는 계산 구조 다이어그램
직접 그린 계산 구조도. 세 후보 값 중 최댓값이 True Range가 되고, 이를 14기간 평활한 값이 ATR입니다.

와일더 평활은 기간 14의 지수평균이다

StockCharts ChartSchool이 정리한 와일더 방식은 두 단계입니다. 첫 ATR은 처음 14개 TR의 단순평균이고, 그다음부터는 직전 ATR에 13의 가중을, 새 TR에 1의 가중을 줍니다.

첫 ATR    = 처음 14개 TR의 평균
이후 ATR  = (직전 ATR × 13 + 현재 TR) / 14

이 재귀식은 평활 계수 α = 1/14인 지수이동평균과 같습니다. 같은 “14”라도 span 14인 일반 EMA(α = 2/15)보다 훨씬 천천히 반응합니다. 플랫폼이 SMA나 일반 EMA로 ATR을 계산하거나, 계산 시작점(필요한 과거 데이터 길이)이 다르면 값이 조금씩 달라집니다. 백테스트와 실거래가 같은 정의를 쓰는지 먼저 확인해야 합니다.

ATR 차트는 변동성 변화를 늦게 따라간다

가상 가격의 고가·저가 범위와 종가 아래에 True Range와 14기간 ATR을 그린 애니메이션
가상 데이터로 그린 차트. 일중 범위와 갭이 커지면 True Range가 먼저 뛰고, 평활된 ATR(14)은 천천히 따라 올라갑니다.

ATR이 오르면 최근 봉의 움직임이 커졌다는 뜻이고, 내리면 줄었다는 뜻입니다. 다만 평활 때문에 충격 직후에는 현재 위험을 과소평가하고, 충격이 지나간 뒤에는 한동안 높게 남습니다.

ATR은 가격 단위의 절대값입니다. 가격이 20인 자산과 200인 자산의 ATR 2는 의미가 다르므로, 종목 간 비교에는 ATR ÷ 종가 × 100처럼 비율로 바꿔 봅니다. 시간프레임도 맞춰야 합니다. 일봉 ATR과 1시간봉 ATR은 직접 비교할 수 없고, 손절과 주문을 관리하는 봉 단위로 계산해야 합니다.

손절 거리와 수량을 같은 위험 예산에 묶는다

ATR 기반 위험 관리의 핵심은 두 식입니다.

손절 거리 = ATR × 배수
수량      = 거래당 허용 손실액 ÷ 손절 거리

허용 손실액이 1,000, ATR이 2.5, 배수가 2라면 손절 거리는 5이고 수량은 200입니다. ATR이 5로 두 배가 되면 손절 거리도 두 배가 되고 수량은 100으로 줄어듭니다. 변동성이 바뀌어도 손절에 걸렸을 때의 손실 규모가 비슷하게 유지되는 구조입니다.

아래 코드는 TR, 와일더 ATR, 수량 계산을 표준 라이브러리만으로 구현하고 위 숫자를 확인합니다.

def true_range(high, low, prev_close):
    if prev_close is None:
        return high - low
    return max(high - low, abs(high - prev_close), abs(low - prev_close))

def wilder_atr(bars, n=14):
    """bars: list of (high, low, close). Returns ATR list (None until n TRs exist)."""
    trs, prev = [], None
    for high, low, close in bars:
        trs.append(true_range(high, low, prev))
        prev = close
    atr = [None] * len(trs)
    if len(trs) < n:
        return atr
    atr[n - 1] = sum(trs[:n]) / n
    for i in range(n, len(trs)):
        atr[i] = (atr[i - 1] * (n - 1) + trs[i]) / n
    return atr

def position_size(risk_budget, atr_value, multiple):
    stop_distance = atr_value * multiple
    return int(risk_budget // stop_distance), stop_distance

# Gap: previous close 100, today's range 104-106 -> TR uses the gap, not 2.
assert true_range(106, 104, 100) == 6
assert true_range(101, 99, 100) == 2

bars = [(11, 9, 10)] * 3 + [(14, 10, 13)]
atr = wilder_atr(bars, n=3)
assert atr[2] == 2                               # first value = simple mean of 3 TRs
assert abs(atr[3] - (2 * 2 + 4) / 3) < 1e-12     # then (prev * (n-1) + TR) / n

units, stop = position_size(risk_budget=1_000, atr_value=2.5, multiple=2)
assert (units, stop) == (200, 5.0)
assert position_size(1_000, 5.0, 2)[0] == 100    # ATR doubles -> size halves

같은 구조는 추적 손절에도 쓰입니다. 찰스 르보(Charles Le Beau)의 샹들리에 청산(Chandelier Exit)은 매수 포지션 기준으로 최근 22기간 최고가에서 ATR(22)의 3배를 뺀 선을 청산선으로 씁니다. 추세가 이어지면 청산선이 따라 올라가지만, 방향 없는 구간에서는 청산과 재진입이 반복될 수 있습니다.

용도 계산 확인할 점
초기 손절 진입가 ± ATR × 배수 배수가 커질수록 수량이 줄어드는지
수량 허용 손실액 ÷ (ATR × 배수) 갭으로 손절가를 넘어 체결될 때의 실제 손실
추적 손절 22기간 최고가 − 3 × ATR(22) 횡보 구간의 반복 청산 비용
변동성 돌파 필터 기준가 ± ATR × 배수 ATR에는 방향이 없으므로 별도의 방향 조건

기간과 배수는 검증할 파라미터다

기간을 7처럼 줄이면 변화에 빨리 반응하지만 잡음이 늘고, 20–22처럼 늘리면 안정적이지만 늦습니다. 손절 배수도 마찬가지입니다. 배수는 승률을 올리는 상수가 아니라 보유 기간, 갭 위험, 거래 비용, 목표 손익비와 함께 정해야 하는 위험 파라미터입니다.

ATR은 다음 위험을 설명하지 못합니다.

  • 갭과 유동성: 손절 주문은 갭이나 얕은 호가에서 손절가보다 불리하게 체결될 수 있습니다. 계산상 손실 한도와 실제 손실이 다를 수 있습니다.
  • 체제 변화: 과거 14봉의 변동성이 다음 봉의 변동성을 보장하지 않습니다.
  • 방향: ATR이 높다는 사실만으로 매수나 매도를 정할 수 없습니다.

여러 기간·배수 조합을 시험했다면 가장 좋은 조합을 그대로 채택하지 말고, 선택 과정까지 포함해 워크포워드로 다시 확인해야 합니다. 그 방법은 과적합 방지 칼럼에 정리했습니다. ATR 입력으로 쓰는 봉 데이터 수집은 거래소 API 데이터 파이프라인을 참고하세요.

자료와 적용 범위

반응

이 브리프가 도움이 됐나요?

구독

새 글 받아보기

새 브리프가 올라가면 이메일로 보냅니다. RSS와 X도 그대로 있습니다.

구독하기
같은 카테고리 더 보기QUANT →