DPO, Detrended Price Oscillator는 이름 그대로 가격에서 추세를 걷어낸 오실레이터다. 이동평균과 종가의 차이를 구하되, 최근 종가 대신 일정 기간 전 종가를 쓴다는 점이 다른 오실레이터와 다르다. 그 결과 상승이든 하락이든 큰 추세는 지워지고, 추세 위에서 반복되는 짧은 파동만 남는다. 원래 목적은 방향을 맞히는 게 아니라 주기를 재는 데 있다.

SK이노베이션은 이 구간을 시험하기에 마침맞은 재료였다. 2026년 6월 30일 종가 94,900원에서 9월 9일 137,200원까지, 두 달 조금 넘는 기간에 저점 대비 고점 기준 46.97% 올랐다. 그런데 이 상승이 일직선이 아니었다. 7월 하순에 132,200원까지 갔다가 8월 초 108,000원까지 18.31% 밀렸고, 8월 26일 하루 만에 11.04% 급락한 뒤 다시 9월 초까지 24.37% 반등했다. 추세를 걷어낸 지표가 이런 굴곡을 얼마나 붙잡는지 보기 좋은 구간이다.

이 글의 데이터 범위
종목       SK이노베이션 (096770, 코스피)
구간       2026-06-30 ~ 2026-09-09 (50거래일)
출처       stockanalysis.com 일봉
최고종가   138,300원 (09-04)
최저종가   94,100원 (07-02)
저점→고점  +46.97%
--------------------------------------------------
주의  이 글은 투자 권유가 아니다. 과거 데이터로 지표를 검증한 기록일 뿐이다.

SK이노베이션 일봉 개요

계산식과 파라미터

DPO는 세 단계로 구한다. 먼저 n일 단순이동평균, SMA(n)을 구한다. 다음으로 shift를 정하는데, n을 2로 나눈 몫에 1을 더한 값이다. 마지막으로 shift일 전 종가에서 오늘 시점의 SMA(n)을 뺀다. 식으로 쓰면 이렇다.

DPO 계산식
1단계  SMA(n)[t] = 최근 n개 종가의 산술평균
2단계  shift = floor(n/2) + 1
3단계  DPO(n)[t] = Close[t - shift] - SMA(n)[t]
--------------------------------------------------
이번 값   n=20, shift=11
유효구간  2026-07-28 ~ 2026-09-09 (31거래일)
예열손실  19거래일 (전체 50거래일의 38%)

예를 들어 7월 28일 값을 손으로 짚어보면 이렇다. 이날 SMA(20)은 109,040원이다. shift가 11이므로 11거래일 전인 7월 10일 종가 102,900원을 가져와 뺀다. 102,900 - 109,040 = -6,140. 이게 7월 28일 DPO(20) 값이다. 정작 7월 28일 당일 종가 112,700원은 이 계산 어디에도 들어가지 않는다. DPO는 ‘지금 가격’이 아니라 ‘11일 전 가격이 그때의 평균 대비 어디 있었는가’를 보여주는 지표라서, 화면에 찍히는 날짜와 실제로 반영된 가격의 날짜가 다르다는 점을 계산해보고서야 체감했다.

n은 20을 썼다. 코스피 한 달 거래일수에 가깝고, 이 시리즈의 다른 이동평균 계열 지표와 기준을 맞추기 위해서다. 다만 대가가 크다. shift가 11일이나 되기 때문에, SMA가 유효해지는 20번째 거래일에서 다시 11일을 더 물려야 첫 DPO 값이 나온다. 실제로는 SMA(20)이 유효해지는 시점과 겹쳐 7월 28일부터 값이 나왔고, 전체 50거래일 중 31거래일, 62%만 유효했다. 나머지 38%는 예열 구간으로 버려졌다. 지표 하나 보자고 두 달치 데이터 중 3주 가까이를 못 쓰는 셈이다.

계산된 DPO(20) 값과 종가를 겹쳐 그리면 아래와 같다. 초록 삼각형은 영선을 아래에서 위로 뚫은 시점, 주황 역삼각형은 위에서 아래로 뚫은 시점이다.

SK이노베이션 종가와 DPO 20 영선 교차

신호 전수 나열

유효구간 31거래일 동안 영선 교차는 여덟 번 있었다. 이 가운데 다섯 번은 이후 5거래일 종가로 맞았는지 틀렸는지 판정할 수 있었고, 나머지 세 번은 자료가 9월 9일에서 끝나 5거래일 뒤 값이 아직 없다.

날짜방향DPO 값신호일 종가5거래일 후 종가등락률판정
07-29상승+430109,500원109,200원 (08-05)-0.27%빗나감
07-30하락-5,800116,600원108,600원 (08-06)-6.86%적중
07-31상승+5,480110,500원120,300원 (08-07)+8.87%적중
08-12하락-4,635122,400원125,900원 (08-20)+2.86%빗나감
08-25상승+585125,000원135,300원 (09-01)+8.24%적중
09-07하락-1,550137,900원평가 불가-자료 끝
09-08상승+3,075138,000원평가 불가-자료 끝
09-09하락-2,680137,200원평가 불가-자료 끝

판정 가능한 다섯 번 중 세 번 적중, 두 번 빗나갔다. 60% 적중률인데, 숫자만 보면 나쁘지 않다. 문제는 신호가 몰린 방식이다. 7월 29일, 30일, 31일 사흘 연속으로 상승, 하락, 상승이 뒤집혔다. DPO가 영선 근처에서 오르내리며 세 번 연속 방향을 바꾼 전형적인 휩쏘다. 첫 상승 신호(07-29)는 틀렸고 바로 다음 날 하락 신호가 나와 스스로를 뒤집었다. 이런 구간에서 신호를 곧이곧대로 따라 매매했다면 하루 이틀 간격으로 방향을 바꿔가며 수수료만 냈을 것이다.

그런데 이 60%라는 숫자, 판정 기준을 5거래일 대신 3거래일이나 10거래일로 바꾸면 달라진다. 같은 다섯 신호를 3거래일 뒤 종가로 다시 재보면 한 번만 맞아 20%로 떨어지고, 10거래일 뒤로 재보면 네 번이 맞아 80%까지 올라간다.

판정 창에 따른 적중률
3거래일   적중 1 · 빗나감 4 · 20%
5거래일   적중 3 · 빗나감 2 · 60%
10거래일  적중 4 · 빗나감 1 · 80%

같은 신호, 같은 지표인데 판정 창을 얼마나 잡느냐에 따라 적중률이 20%에서 80%까지 오간다. 이 지표가 원래 며칠짜리 파동을 겨냥한 것인지 정하지 않은 채 임의로 5거래일을 기준으로 삼으면, 결과 해석 자체가 그 선택 하나에 좌우될 수 있다는 뜻이다.

8월 26일 급락 구간도 짚을 만하다. 8월 25일 125,000원에서 8월 26일 111,200원으로 하루 만에 11.04% 빠졌고, 이날 거래량은 4,224,472주로 직전 10거래일 평균 608,291주의 약 6.9배였다. 그런데 DPO(20)는 이 급락 당일에 아무 신호도 내지 않았다. 오히려 8월 25일에 이미 상승 신호가 나와 있었고, 급락을 맞은 뒤에도 DPO 값 자체는 여전히 영선 위(+4,860)에 머물렀다. shift가 11일이라 최근 급변이 즉시 반영되지 않고, 11일 전 종가와 20일 평균을 비교하는 구조라서 벌어지는 일이다. 급락 당일의 실시간 반응을 기대하고 쓸 지표는 아니라는 뜻이다.

7월 말 휩쏘와 8월 26일 급락 확대

파라미터를 바꾸면

n을 10과 30으로도 계산해 비교했다. 결과는 극과 극이다.

파라미터 민감도
n=10  교차 13회 (상승7·하락6) · 유효 41거래일 · shift=6
n=20  교차 8회 (상승4·하락4) · 유효 31거래일 · shift=11
n=30  교차 2회 (상승1·하락1) · 유효 21거래일 · shift=16

n=10은 유효구간이 41거래일로 넓어지는 대신 교차가 13번이나 나와 잡음이 심하다. n=30은 반대로 교차가 두 번뿐이라 깨끗해 보이지만, 유효구간이 21거래일로 쪼그라들고 shift도 16일까지 늘어나 신호가 너무 늦다. n=20은 그 중간인데, 중간이라고 딱히 더 낫다고 말하기는 어렵다. 세 곡선을 겹쳐 보면 큰 봉우리와 골짜기의 시점 자체가 n에 따라 며칠씩 밀린다. 같은 데이터, 같은 방법론인데 파라미터 하나로 신호 타이밍이 통째로 바뀐다.

DPO 파라미터 민감도 n=10 20 30

이 지표를 봇 게이트에 그대로 넣을 생각은 없다. shift 때문에 신호가 구조적으로 늦고, 정작 가장 큰 사건이었던 8월 26일 급락에는 반응하지 않았다. 대신 다른 추세 지표가 먼저 방향을 잡은 뒤, DPO로 그 추세 안에서 반복되는 단기 파동의 위치를 가늠하는 보조 용도로는 써볼 만하다고 본다. 진입 신호로 쓰기엔 위험하고, 주기를 읽는 참고 자료로는 나쁘지 않다.

남는 것

이번 구간에서 남길 건 두 가지다. 첫째, 적중률 60%라는 숫자는 표본이 다섯 개뿐인 데다 판정 창을 3거래일로 잡으면 20%, 10거래일로 잡으면 80%까지 흔들린다는 걸 확인했으니 그 자체로 큰 의미를 두기 어렵다. 사흘 연속 방향이 뒤집힌 7월 말 구간 하나가 통계를 크게 흔들었다. 둘째, shift가 있는 지표는 급변에 느리다는 걸 숫자로 확인했다. 8월 26일 같은 하루짜리 사건에는 애초에 안 맞는 도구다. 다음에 같은 지표를 다른 종목에 적용하게 되면, 판정 창을 하나로 고정하지 않고 여러 창으로 같이 보는 습관을 들여야겠다.

리처드 와이코프는 시장이 만드는 파동을 읽으려면 가격과 거래량을 같이 봐야 한다고 했다. DPO는 가격의 파동만 남기고 거래량은 아예 보지 않는 지표라서, 8월 26일처럼 거래량이 급증한 날을 놓치는 건 어찌 보면 당연한 결과였는지도 모른다. 다음에는 거래량을 함께 보는 지표로 같은 구간을 다시 확인해볼 생각이다.

투자 판단의 근거로 삼기엔 이르다. 이 글은 계산 과정과 결과를 남기는 기록이다.

약어 풀이

  • 이 글에 나온 영어 약어를 풀어 둔다.
  • DPO (Detrended Price Oscillator): 가격에서 추세를 제거해 단기 파동만 남기는 오실레이터.
  • SMA (Simple Moving Average): 일정 기간 종가를 단순 평균한 이동평균.