평균방향지수, ADX는 가격이 어느 방향인지가 아니라 얼마나 힘있게 한 방향으로 밀리고 있는지를 재는 지표다. +DI와 -DI로 상승 압력과 하락 압력을 각각 계산한 뒤, 둘의 격차를 0에서 100 사이 하나의 숫자로 눌러 담는다. 방향은 안 알려준다. 세기만 잰다. 그래서 흔히 DI 교차로 방향을 잡고 ADX로 그 신호를 걸러내는 조합으로 쓴다.
KB금융은 이 구간에서 ADX를 시험하기 좋은 재료를 갖고 있었다. 6월 중순부터 7월 중순까지 한 달 만에 22.9% 오른 뒤, 남은 한 달 동안 그 상승분의 상당 부분을 다시 반납했다. 추세가 붙었다가 꺾이는 전형적인 궤적이라, ADX가 상승 국면에서 얼마나 빨리 반응하고 하락 전환에서 얼마나 늦게 따라오는지를 같은 종목, 같은 창에서 볼 수 있었다. 은행주는 실적 이벤트를 빼면 개별 재료로 하루 이틀 만에 방향이 뒤집히는 일이 잦지 않은 편이라, 추세의 시작과 끝을 지표가 얼마나 지연 없이 잡아내는지 보기에는 오히려 변동성이 큰 성장주보다 나은 표본이 될 때가 있다.
종목 KB금융 (KRX 105560)
구간 2026-06-11 ~ 2026-08-21 (50거래일)
출처 stockanalysis.com/quote/krx/105560
최고·최저 194,500원(07-13) · 145,000원(06-26)
구간 종가 151,500원 → 160,700원 (+6.07%)
고점 대비 186,200원(07-13 종가) → -13.69%(08-21)이 글은 투자 권유가 아니다. 계산 결과와 지나간 가격을 기록할 뿐이고, 앞으로의 수익을 보장하지 않는다.
계산과 실측
ADX는 세 단계를 거쳐 나온다. 먼저 방향성 움직임(+DM, -DM)과 진폭(TR)을 하루 단위로 구하고, 이를 와일더 평활로 눌러 +DI14와 -DI14를 만들고, 마지막으로 둘의 격차 비율(DX)을 다시 와일더 평활해 ADX를 얻는다.
TR max(H-L, |H-C₋₁|, |L-C₋₁|)
+DM (H-H₋₁ > L₋₁-L) and (H-H₋₁ > 0) 이면 H-H₋₁, 아니면 0
-DM (L₋₁-L > H-H₋₁) and (L₋₁-L > 0) 이면 L₋₁-L, 아니면 0
평활[1] 첫 14개 합
평활[i] 평활[i-1] - 평활[i-1]/14 + 새값
+DI14 100 × (+DM 평활 / TR 평활)
-DI14 100 × (-DM 평활 / TR 평활)
DX 100 × |+DI14 - -DI14| / (+DI14 + -DI14)
ADX[1] DX 첫 14개 평균
ADX[i] (ADX[i-1]×13 + DX[i]) / 14기간은 14로 뒀다. 와일더 본인이 1978년 원저에서 제시한 기본값이고, 대부분의 차트 플랫폼이 기본값으로 그대로 쓰기 때문에 다른 글과 비교하기 편하다. numpy로 직접 짠 이 계산은 라이브러리 없이 위 식 그대로다.
50거래일을 모았지만 계산 순서 때문에 실제로 쓸 수 있는 값은 이보다 훨씬 적다. TR과 DM은 전일 종가·고가·저가가 있어야 나오므로 첫날은 버린다(49개). 여기에 14일 평활을 한 번 걸어야 DI와 DX가 나오고(36개, 7월 1일부터), DX에 다시 14일 평활을 걸어야 ADX가 나온다(23개, 7월 21일부터). 평활을 두 번 겹쳐 쓰는 구조라 예열 구간이 거의 4주치를 잡아먹는다. 60거래일을 못 채우고 50거래일로 시작한 탓에 ADX 유효 구간이 절반에 못 미친다는 점은 분명히 밝혀둔다.

7월 13일 장중 194,500원을 찍고 종가 186,200원으로 마감한 날이 이번 구간의 고점이다. 이후 8월 20일 종가 160,000원까지 밀렸다가 21일 160,700원으로 소폭 반등했다. 마지막 봉은 거래량이 163,833주로 직전 거래일인 20일의 1,282,295주와 비교하면 8분의 1 수준인데, 장이 끝나기 전 수집한 부분 세션 스냅샷일 가능성이 있어 이 거래량으로 무언가를 주장하지 않는다.

날짜 +DI14 -DI14 ADX14 비고
07-21 25.12 19.35 39.90 ADX 최초 유효값
07-28 21.80 24.34 30.79 -DI 우위 전환
08-04 17.16 21.74 25.51 ADX 25 상회 마지막날
08-05 20.97 20.37 23.79 +DI 우위 전환·ADX 25 이탈
08-07 22.13 19.06 21.04 ADX 20 상회 마지막날
08-10 20.79 18.41 19.98 ADX 20 이탈
08-12 18.79 19.12 17.29 -DI 우위 재전환
08-21 14.26 20.65 14.77 구간 마지막(반세션)이 구간에서 +DI와 -DI 우위가 뒤집힌 시점은 세 번이다. 7월 28일에 -DI가 +DI를 앞질렀고(21.80 대 24.34), 8월 5일에 +DI가 다시 앞섰고(20.97 대 20.37), 8월 12일에 -DI가 다시 우위를 가져가 구간 끝까지 유지했다(18.79 대 19.12에서 14.26 대 20.65로 격차가 벌어짐).

세 신호를 각각 봤다.
7월 28일 전환은 ADX가 30.79로 25 기준선 위였다. “ADX 25 이상일 때만 DI 교차를 신뢰한다"는 흔한 필터를 통과하는 신호였고, 실제로 다음날인 29일 종가가 160,100원까지 하루 만에 3.1% 더 빠졌다. 다만 하락은 거기서 멈췄다. 다음 거래일인 30일부터 곧바로 되돌림이 시작돼 31일에는 168,500원으로 돌아왔다. 방향은 맞혔지만 붙잡을 수 있는 창이 하루짜리였다.
8월 5일 전환은 ADX가 23.79로 이미 25 밑이었다. 필터를 걸었다면 무시했을 신호다. 결과를 보면 필터가 맞았다. 5일 종가 170,700원에서 7일 175,800원까지 사흘간 3.0% 반등했지만 12일에는 다시 166,000원으로 주저앉았다. 새 상승 추세로 이어지지 못하고, 눌림 구간에서 한 번 튀어 오른 반발로 끝났다.
8월 12일 전환이 이번 구간에서 가장 복잡한 대목이다. ADX가 17.29로 20 밑까지 내려간 상태라 필터를 걸었다면 무시했을 신호였고, 실제로도 곧바로 통하지는 않았다. 12일 166,000원이던 종가는 오히려 13일 168,100원, 14일과 18일 168,500원으로 사흘 넘게 반등해 신호와 반대로 움직이는 휩소를 만들었다. 흐름이 뒤집힌 건 19일부터다. 19일 166,400원, 20일 160,000원으로 이틀 만에 5.0% 넘게 미끄러졌는데, ADX는 이 급락이 이미 시작된 18일에도 14.02로 낮아지기만 했고 19일에야 14.26으로 겨우 반등했다. 초반의 휩소는 낮은 ADX가 맞게 걸러줬지만, 정작 뒤에 온 진짜 급락의 초입은 ADX도 놓쳤다. 신호 하나를 놓고 절반은 맞고 절반은 늦었다.
계산 과정에서 눈에 띈 부분도 하나 적어둔다. 7월 7일부터 9일까지 사흘간 DX 값이 43.20으로 정확히 똑같이 나왔다. 세 날 모두 전일 대비 고가가 낮고 저가도 낮지 않아서(안쪽 봉) +DM과 -DM이 둘 다 0이었기 때문이다. 그날그날의 방향성 움직임이 0이면 +DM 평활과 -DM 평활이 같은 비율(13/14)로만 줄어들고, DX는 두 평활값의 비율로 정의되므로 TR과 무관하게 그 비율이 그대로 유지된다. 우연한 반복이 아니라 계산식 구조가 만든 결과다.
파라미터를 바꾸면 결론이 완전히 달라진다는 점도 확인했다. 기간을 7로 좁히면 구간 마지막 ADX(7)이 26.55로 25 기준선 위에 남아 “여전히 추세 중"이라고 읽힌다. 기본값 14로는 14.77로 “추세 소멸"이다. 21로 늘리면 50거래일 중 유효값이 9개(8월 10일부터)로 줄어드는데, 마지막 값은 15.59로 14와 비슷한 결론(추세 소멸)을 가리킨다. 같은 가격, 같은 날짜인데 기간 하나를 어떻게 잡느냐에 따라 정반대 결론이 나온다. 봇을 ADX(7) 기준으로 짰다면 8월 21일에도 여전히 포지션을 들고 있었을 거고, ADX(14) 기준으로 짰다면 8월 5일에 25선을 이탈한 시점부터 이미 추세 소멸로 판정하고 발을 뺐을 거다. 같은 계좌, 같은 종목에서 파라미터 숫자 하나가 실제 매매 여부를 갈랐을 거라는 뜻이다.

봇 게이트에 이 지표를 넣을지는 회의적이다. ADX 자체가 후행 지표인 데다, 이번처럼 상승 구간의 기억이 평활에 남아 새 하락 추세의 초입을 가리는 사례를 실측으로 확인했다. 기간을 짧게 잡으면 반응은 빨라지지만 그만큼 소음도 늘어난다. DI 교차 방향과 ADX 기준선 필터를 같이 쓰는 조합 자체는 합리적이지만, 이번 구간의 세 번째 신호처럼 필터가 실제 추세의 시작을 걸러버리는 경우가 있다는 걸 감안해야 한다. 진입 신호보다는 이미 걸린 포지션의 확신도를 보조적으로 점검하는 용도가 더 맞아 보인다.
남기는 것
이번 구간에서 남길 건 두 가지다. 하나는 DX가 TR과 무관하게 +DM·-DM 평활 비율만으로 정해진다는 점, 계산을 직접 짜보지 않았으면 몰랐을 부분이다. 다른 하나는 8월 12일 신호다. 필터가 틀렸다는 사실보다, 왜 틀렸는지(7월 랠리가 평활에 남긴 관성) 설명이 되는 틀림이라는 점이 더 남는다.
와일더는 ADX가 30을 넘으면 강한 추세, 20 밑이면 추세가 없거나 막 끝난 국면이라고 봤다. 이번 KB금융 구간은 39.90에서 시작해 14.77로 끝났으니 교과서 분류로는 강한 추세에서 무추세로 넘어간 구간이다. 다만 그 사이에 실제로 벌어진 하락은 오히려 ADX가 낮아지는 동안 더 끈질겼다. 지표와 가격이 어긋난 이 구간을 어떻게 해석할지는 다음 종목에서 같은 지표를 다시 볼 때 이어서 확인할 문제로 남겨둔다.
이 글은 투자 권유가 아니며, 과거 가격의 계산 결과가 미래 수익을 보장하지 않는다.
약어 풀이
- 이 글에 나온 영어 약어를 풀어 둔다.
- ADX (Average Directional Index): 추세의 방향이 아니라 세기를 0~100으로 나타내는 지표. 와일더가 1978년에 고안했다.
- DI (Directional Indicator): +DI와 -DI 한 쌍으로, 상승 압력과 하락 압력을 각각 나타낸다.
- DX (Directional Movement Index): +DI와 -DI의 격차를 하루 단위 비율로 나타낸 값. ADX는 이 값을 다시 평활한 것이다.
- DM (Directional Movement): 전일 대비 고가·저가가 얼마나 방향성 있게 움직였는지를 나타내는 값(+DM, -DM).
- TR (True Range): 갭을 포함한 하루의 실질 변동폭. 당일 고저폭과 전일 종가 대비 상하 이탈폭 중 가장 큰 값이다.
- KRX (Korea Exchange): 한국거래소. 코스피·코스닥을 운영하는 거래소다.