가이드

ATR 지표 수식 — TR 세 줄과 RMA 한 줄, 엑셀·파인스크립트로 옮길 때 값이 어긋나는 자리

ATR 수식(TR 세 줄 + RMA 평균)을 엑셀·파인스크립트·pandas로 옮길 때 첫 봉, 씨앗값, 평균 방식, 시작 봉 때문에 트레이딩뷰 값과 갈리는 자리를 정리했습니다.

가이드10월 24일 최종 갱신

"ATR 지표 수식"을 찾는 사람은 대개 둘 중 하나입니다. 엑셀이나 구글 시트에 직접 ATR 열을 만들어 보려는 경우, 아니면 파이썬이나 파인스크립트로 옮겨 놓았는데 트레이딩뷰 화면 값과 소수점 몇 자리가 안 맞아서 온 경우입니다.

수식 자체는 짧습니다. TR을 구하는 세 줄과 평균을 내는 한 줄이 전부입니다. 어긋나는 건 거의 언제나 식이 아니라 식을 옮기는 자리에서입니다 — 첫 봉, 첫 평균, 평균 방식, 그리고 데이터가 시작된 지점. 이 글은 그 네 군데를 차례로 짚습니다.

ATR이 무엇을 재는 값인지는 ATR (평균 변동폭)에, 실제로 어디에 쓰는지는 ATR 지표 사용법에 따로 있습니다. 여기서는 숫자가 어떻게 만들어지는지만 봅니다.

ATR 수식은 TR 세 줄과 평균 한 줄입니다

먼저 봉 하나의 폭, TR(True Range)을 구합니다. 아래 셋 중 가장 큰 값입니다.

  1. 이번 봉 고가 − 이번 봉 저가
  2. |이번 봉 고가 − 직전 봉 종가|
  3. |이번 봉 저가 − 직전 봉 종가|

그다음 TR을 N개 평균 낸 것이 ATR입니다. 트레이딩뷰 기본값은 N = 14이고, 평균 방식은 RMA입니다. RMA를 한 줄로 쓰면 이렇습니다.

ATR(이번) = (ATR(직전) × 13 + TR(이번)) ÷ 14

직전 ATR에 13/14의 무게를, 이번 TR에 1/14의 무게를 주는 식입니다. 14개를 모아 단순 평균 내는 SMA와 달리 오래된 TR이 한 번에 빠지지 않고 조금씩 희미해집니다. RMA와 EMA 무게의 관계는 ATR 지표 설정법에서 다뤘으니 여기서는 넘어갑니다.

직전 종가가 들어가는 이유

고가−저가만 쓰면 봉 사이에 벌어진 틈이 사라집니다. 직전 종가가 100이었는데 이번 봉이 101에서 시작해 104까지 갔다면, 고가−저가는 3이지만 실제로 가격이 지나간 거리는 100에서 104까지 4입니다. 2번과 3번 줄은 그 틈을 주워 담는 장치입니다.

예시직전 종가고가저가① 고−저② 고가와 직전 종가 거리③ 저가와 직전 종가 거리TR
위로 틈1001041013414
틈 없음99102975325
아래로 틈103100982355

바이낸스 USDⓈ-M 무기한 선물처럼 24시간 이어 붙는 차트에서는 직전 종가와 이번 시가가 거의 같아서 ①이 이기는 봉이 대부분입니다. ②·③이 이기는 건 시가가 튄 봉, 즉 점검 뒤 재개되는 봉이나 거래가 얇아 한 틱이 크게 건너뛰는 종목에서입니다. 그래서 BTCUSDT로 시트를 만들어 보면 "직전 종가 줄은 없어도 되겠다" 싶은데, 얇은 종목으로 옮기면 그 줄 때문에 값이 갈립니다.

엑셀·구글 시트에 옮기는 열 순서

2행부터 데이터가 있고 A열 시각, B열 시가, C열 고가, D열 저가, E열 종가라고 두겠습니다.

열들어갈 것첫 행그 아래
FTRF2 = C2-D2F3 = MAX(C3-D3, ABS(C3-E2), ABS(D3-E2))
GATR 14비워 둠 (G2~G14)G15 = AVERAGE(F2:F15)
G이어지는 값—G16 = (G15*13+F16)/14 를 아래로 채우기

여기서 두 군데를 일부러 정해야 합니다.

첫 행 F2. 직전 봉이 없으니 ②·③을 계산할 수 없습니다. 고가−저가만 넣는 방법과 아예 비워 두는 방법이 있는데, 어느 쪽을 골랐는지에 따라 G15의 평균이 달라집니다. 트레이딩뷰 내장 ATR은 앞쪽(고가−저가만)에 가깝게 동작합니다.

첫 평균 G15. RMA는 "직전 ATR"이 있어야 굴러가는데 맨 처음에는 그게 없습니다. 그래서 처음 14개 TR의 단순 평균을 씨앗으로 넣고, 그다음부터 RMA 식을 돌립니다. 이 씨앗을 무엇으로 정하느냐가 다음 절의 이야기입니다.

같은 틀에 비용 열과 누적 열을 덧붙이는 방법은 백테스트 계산기 스프레드시트에 정리해 두었습니다. ATR 열을 그 옆에 붙이면 손절 폭이나 포지션 크기를 ATR 배수로 계산하는 열까지 이어 만들 수 있습니다.

씨앗값은 사라지지 않고 옅어집니다

RMA 식을 한 번 돌릴 때마다 씨앗이 가진 무게는 13/14배가 됩니다. k봉 뒤 씨앗의 무게는 (13/14)^k 입니다.

씨앗 뒤 봉 수씨앗이 아직 쥔 무게
14약 35.4%
28약 12.6%
50약 2.5%
631% 아래
100약 0.06%

14봉이 지나도 씨앗이 3분의 1 넘게 남아 있다는 점이 핵심입니다. "기간이 14니까 14봉이면 다 바뀐다"는 SMA의 감각이고, RMA에서는 맞지 않습니다. 씨앗을 SMA로 잡든, 첫 TR 하나로 잡든, 0으로 잡든 60봉쯤 지나면 셋이 거의 같은 선이 되지만 그 전까지는 눈에 띄게 다릅니다.

이 구간을 워밍업이라고 부릅니다. 지표 값을 아직 믿을 수 없는 앞부분이라는 뜻입니다. 1시간봉이면 63봉은 2.6일쯤, 4시간봉이면 10.5일쯤입니다. 상장된 지 사흘 된 종목의 4시간봉 ATR은 아직 씨앗 영향이 큰 값이라는 말이 됩니다.

차트마다 값이 다른 가장 흔한 이유

바이낸스 앱 차트, 트레이딩뷰, 직접 만든 시트가 같은 종목·같은 시간봉·같은 14인데도 ATR 끝자리가 다르다면, 식보다 먼저 불러온 데이터가 어디서 시작했는지를 봅니다. 차트는 화면에 불러온 첫 봉에서 씨앗을 만듭니다. 한쪽은 500봉, 한쪽은 1,000봉을 불러왔다면 씨앗 위치가 다르고, 그 차이가 (13/14)^k만큼 남아 끝까지 따라옵니다. 수백 봉 뒤라면 소수점 아래 아주 작은 차이로 줄어들지만, 불러온 봉이 적은 앱 화면에서는 꽤 큰 차이로 남을 수 있습니다.

맞추고 싶다면 두 쪽 모두 같은 시각의 봉부터 시작하게 하고, 비교는 최소 60~100봉 뒤에서 합니다.

파인스크립트와 파이썬에서 옮겨 쓸 때

파인스크립트

트레이딩뷰 파인스크립트에서는 ta.atr(14) 한 줄이면 내장 ATR과 같은 값이 나옵니다. 풀어 쓰면 ta.rma(ta.tr(true), 14) 입니다. ta.tr(true) 의 true 는 직전 종가가 없는 첫 봉에서 고가−저가를 쓰라는 뜻이고, 이걸 빼면 첫 봉의 TR이 비어 버립니다. ta.rma 는 첫 값을 단순 평균으로 잡으므로 위 시트의 G15와 같은 방식입니다.

ta.sma(ta.tr, 14) 나 ta.ema(ta.tr, 14) 로 바꿔 쓰면 이름은 ATR이어도 다른 선이 됩니다. 직접 만든 지표 이름표에 평균 방식을 적어 두지 않으면 나중에 어느 쪽이었는지 헷갈립니다.

파이썬(pandas)

pandas로 옮길 때 흔한 실수는 두 가지입니다.

  • tr.ewm(span=14) 로 쓰는 것. span=14는 무게가 2/15인 EMA라서 RMA 14가 아닙니다. RMA 14는 alpha=1/14 로 줘야 합니다
  • adjust 를 기본값(True)으로 두는 것. 이 경우 앞쪽 값을 다른 방식으로 가중해서 초반 값이 트레이딩뷰와 갈립니다. adjust=False 로 두면 앞의 RMA 식과 같은 재귀가 됩니다

adjust=False 로 해도 씨앗은 첫 TR 하나입니다. 트레이딩뷰처럼 14개 단순 평균을 씨앗으로 쓰려면 처음 14개를 따로 평균 내 넣고 그 뒤부터 재귀를 돌려야 합니다. 그러지 않으면 앞 절의 표만큼 초반이 어긋나고, 60봉쯤 지나서야 맞아 들어갑니다.

진행 중인 봉과 수식

수식에는 "이번 봉 고가·저가"가 들어갑니다. 봉이 아직 닫히지 않았다면 이 둘은 계속 바뀌고, 그때 계산한 ATR도 임시값입니다. 고가는 올라갈 수만 있고 저가는 내려갈 수만 있으니 진행 중인 봉의 TR은 마감까지 커지거나 그대로이지 줄어들지 않습니다. 그 봉의 ATR도 같은 방향으로만 움직입니다.

시트로 백테스트를 할 때 "이번 봉 ATR로 이번 봉 손절을 잡는" 열을 만들면, 실제로는 봉이 끝나야 알 수 있는 값을 봉 중간에 쓴 셈이 됩니다. 마감 뒤 다시 계산되는 값을 미리 쓰는 문제는 리페인팅과 같은 뿌리입니다. 손절 폭에는 직전 봉까지의 ATR을 쓰는 열을 따로 두는 쪽이 앞뒤가 맞습니다.

신호 목록에 ATR 열을 붙일 때 씨앗이 걸리는 자리

SignalLab은 400종목을 9개 시간봉으로 돌리고, 공개 화면은 1시간봉과 4시간봉입니다. 90일 동안 1시간봉에서 30,442건, 4시간봉에서 7,499건의 표시가 기록됐습니다. 이 기록을 내려받아 옆에 ATR 열을 붙여 보려는 경우가 있는데, 그때 두 가지를 확인합니다.

  • 그 종목의 봉 데이터가 표시 시각보다 최소 60봉 앞에서 시작하는지. 아니면 그 줄의 ATR은 씨앗에 끌려간 값입니다
  • 표시가 뜬 봉의 ATR인지, 그 직전 봉의 ATR인지. 표시는 봉 마감 기준이라 같은 봉 ATR을 붙여도 되지만, 그걸 그 봉 안의 판단에 썼다고 가정하면 안 됩니다

삼박자 타점 90일 상위에는 BRKBUSDT 16건, AMATUSDT·NVDAUSDT 13건처럼 주식 무기한 선물이 여럿 올라 있습니다. 이런 종목은 정규장이 열리는 봉에서 한 봉 안의 폭이 크게 튀는 일이 있어, TR ① 줄이 다른 시간대보다 훨씬 커집니다. RMA는 그 한 봉을 14분의 1만 반영하고 천천히 내려놓기 때문에, 그 뒤 몇십 봉 동안 ATR이 높게 남습니다. 큰 봉 하나 뒤에 선이 내려오는 모양은 ATR 보는 법에 그림처럼 풀어 두었습니다.

수식을 옮긴 뒤 맞춰 보는 순서

  1. 같은 종목, 같은 시간봉, 같은 시작 봉인지 확인합니다
  2. TR 열의 첫 행을 고가−저가로 넣었는지 봅니다
  3. 첫 ATR을 TR 14개 단순 평균으로 잡았는지 봅니다
  4. 그 뒤 식이 (직전×13 + 이번TR)/14 인지, EMA나 SMA로 바뀌지 않았는지 봅니다
  5. 비교는 시작 봉에서 최소 60~100봉 뒤에서 합니다
  6. 그래도 다르면 고가·저가가 체결가 기준인지 마크 가격 기준인지 봅니다 — 차트 종류가 다르면 TR부터 다릅니다

평균을 내는 다른 방식들의 식은 이동평균선 계산식에 모아 두었습니다. ATR의 평균 부분도 결국 그 식들 중 하나입니다.

자주 묻는 것

ATR 수식에 거래량은 안 들어가나요?

안 들어갑니다. 고가·저가·직전 종가 세 값만 씁니다. 거래량이 적은 봉이든 많은 봉이든 폭이 같으면 같은 TR입니다.

ATR을 퍼센트로 바꾸는 식도 같은 건가요?

ATR을 그 봉의 종가로 나누고 100을 곱하면 됩니다. 종목끼리 견줄 때 쓰는 값이고, 쓰는 자리는 ATR 지표 사용법에 있습니다. 나누는 종가를 이번 봉으로 할지 직전 봉으로 할지도 위 진행 중인 봉 문제와 같은 기준으로 정합니다.

14 대신 다른 길이를 넣으면 식의 13도 바뀌나요?

바뀝니다. 길이 N이면 (직전 × (N−1) + 이번TR) ÷ N 입니다. 씨앗의 무게도 ((N−1)/N)^k로 줄어드니, 길이를 늘리면 워밍업도 그만큼 길어집니다.

처음 보는 말이 있으면 용어 사전에 다이버전스·펀딩비·미결제약정 등을 풀어 두었습니다.

본 글은 지표 조건 충족 사실과 시장 데이터를 정리한 분석 보조 자료이며, 투자 권유나 투자 자문이 아닙니다. 특정 종목의 매매를 권하지 않으며, 서술된 조건이 향후 수익을 보장하지 않습니다. 투자 판단과 그 결과에 대한 책임은 전적으로 이용자 본인에게 있습니다.

오늘 다룬 종목

각 종목의 신호 이력

다른 가이드

전체 보기 →

조건이 충족되면 알려드립니다

400종목을 9개 시간봉에서 24시간 감시하고, 신호가 나면 텔레그램으로 보냅니다.

가입 즉시 7일 무료체험 · 카드 등록 없음