"ATR 지표 수식"을 찾는 사람은 대개 둘 중 하나입니다. 엑셀이나 구글 시트에 직접 ATR 열을 만들어 보려는 경우, 아니면 파이썬이나 파인스크립트로 옮겨 놓았는데 트레이딩뷰 화면 값과 소수점 몇 자리가 안 맞아서 온 경우입니다.
수식 자체는 짧습니다. TR을 구하는 세 줄과 평균을 내는 한 줄이 전부입니다. 어긋나는 건 거의 언제나 식이 아니라 식을 옮기는 자리에서입니다 — 첫 봉, 첫 평균, 평균 방식, 그리고 데이터가 시작된 지점. 이 글은 그 네 군데를 차례로 짚습니다.
ATR이 무엇을 재는 값인지는 ATR (평균 변동폭)에, 실제로 어디에 쓰는지는 ATR 지표 사용법에 따로 있습니다. 여기서는 숫자가 어떻게 만들어지는지만 봅니다.
ATR 수식은 TR 세 줄과 평균 한 줄입니다
먼저 봉 하나의 폭, TR(True Range)을 구합니다. 아래 셋 중 가장 큰 값입니다.
- 이번 봉 고가 − 이번 봉 저가
- |이번 봉 고가 − 직전 봉 종가|
- |이번 봉 저가 − 직전 봉 종가|
그다음 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 |
|---|---|---|---|---|---|---|---|
| 위로 틈 | 100 | 104 | 101 | 3 | 4 | 1 | 4 |
| 틈 없음 | 99 | 102 | 97 | 5 | 3 | 2 | 5 |
| 아래로 틈 | 103 | 100 | 98 | 2 | 3 | 5 | 5 |
바이낸스 USDⓈ-M 무기한 선물처럼 24시간 이어 붙는 차트에서는 직전 종가와 이번 시가가 거의 같아서 ①이 이기는 봉이 대부분입니다. ②·③이 이기는 건 시가가 튄 봉, 즉 점검 뒤 재개되는 봉이나 거래가 얇아 한 틱이 크게 건너뛰는 종목에서입니다. 그래서 BTCUSDT로 시트를 만들어 보면 "직전 종가 줄은 없어도 되겠다" 싶은데, 얇은 종목으로 옮기면 그 줄 때문에 값이 갈립니다.
엑셀·구글 시트에 옮기는 열 순서
2행부터 데이터가 있고 A열 시각, B열 시가, C열 고가, D열 저가, E열 종가라고 두겠습니다.
| 열 | 들어갈 것 | 첫 행 | 그 아래 |
|---|---|---|---|
| F | TR | F2 = C2-D2 | F3 = MAX(C3-D3, ABS(C3-E2), ABS(D3-E2)) |
| G | ATR 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% |
| 63 | 1% 아래 |
| 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 보는 법에 그림처럼 풀어 두었습니다.
수식을 옮긴 뒤 맞춰 보는 순서
- 같은 종목, 같은 시간봉, 같은 시작 봉인지 확인합니다
- TR 열의 첫 행을 고가−저가로 넣었는지 봅니다
- 첫 ATR을 TR 14개 단순 평균으로 잡았는지 봅니다
- 그 뒤 식이
(직전×13 + 이번TR)/14인지, EMA나 SMA로 바뀌지 않았는지 봅니다 - 비교는 시작 봉에서 최소 60~100봉 뒤에서 합니다
- 그래도 다르면 고가·저가가 체결가 기준인지 마크 가격 기준인지 봅니다 — 차트 종류가 다르면 TR부터 다릅니다
평균을 내는 다른 방식들의 식은 이동평균선 계산식에 모아 두었습니다. ATR의 평균 부분도 결국 그 식들 중 하나입니다.
자주 묻는 것
ATR 수식에 거래량은 안 들어가나요?
안 들어갑니다. 고가·저가·직전 종가 세 값만 씁니다. 거래량이 적은 봉이든 많은 봉이든 폭이 같으면 같은 TR입니다.
ATR을 퍼센트로 바꾸는 식도 같은 건가요?
ATR을 그 봉의 종가로 나누고 100을 곱하면 됩니다. 종목끼리 견줄 때 쓰는 값이고, 쓰는 자리는 ATR 지표 사용법에 있습니다. 나누는 종가를 이번 봉으로 할지 직전 봉으로 할지도 위 진행 중인 봉 문제와 같은 기준으로 정합니다.
14 대신 다른 길이를 넣으면 식의 13도 바뀌나요?
바뀝니다. 길이 N이면 (직전 × (N−1) + 이번TR) ÷ N 입니다. 씨앗의 무게도 ((N−1)/N)^k로 줄어드니, 길이를 늘리면 워밍업도 그만큼 길어집니다.
처음 보는 말이 있으면 용어 사전에 다이버전스·펀딩비·미결제약정 등을 풀어 두었습니다.