두산에너빌리티는 6월 중순부터 8월 말까지 두 달 반 사이에 고점 대비 41.72% 빠졌다가 다시 37% 넘게 반등한 종목이다. 이번 편은 그 구간에 어썸 오실레이터(Awesome Oscillator, AO)를 numpy로 직접 계산해 물려 본다.
AO는 빌 윌리엄스가 만든 모멘텀 오실레이터다. 중간가((고가+저가)/2)의 짧은 이동평균에서 긴 이동평균을 뺀 값이라 원리는 단순하다. 값이 0보다 크면 최근 5일의 평균 가격대가 34일 평균보다 높다는 뜻이고, 작으면 그 반대다. 이동평균 두 개의 차이일 뿐이라 계산 자체는 쉽지만, 34일치 평균을 매일 새로 구해야 하니 최근 값이 나오려면 그만큼의 과거 데이터가 먼저 쌓여 있어야 한다. 이 예열 구간이 이번 글의 핵심 변수가 됐다.
두산에너빌리티를 고른 이유는 명확하다. 6월 중순 고점에서 7월 말 저점까지 41.72% 빠지고, 다시 8월 중순까지 37% 넘게 되돌린 왕복 구간을 한 데이터셋 안에 담고 있어서다. 방향이 세 번 바뀌는 구간이니 지연이 심한 지표라면 그 지연이 숫자로 드러날 수밖에 없다.
종목 두산에너빌리티 (034020)
출처 stockanalysis.com/quote/krx/034020/history
구간 2026-06-11 ~ 2026-08-21 (50거래일)
--------------------------------------------------
종가 고점 103,300원 (06-16)
종가 저점 60,200원 (07-30)
고점→저점 -41.72%
저점→반등고점 82,600원 (08-14, +37.21%)
반등고점→종가 73,300원 (08-21, -11.26%)이 글은 투자 권유가 아니다. 수집한 시세로 계산한 결과를 기록할 뿐, 매매 판단의 근거로 쓰라는 뜻이 아니다.
계산과 예열 구간
AO의 계산식은 다음과 같다.
중간가 MP = (고가 + 저가) / 2
AO SMA(MP, 5) - SMA(MP, 34)
--------------------------------------------------
해석 0 이상 = 5일 평균가가 34일 평균가보다 높다
0 미만 = 그 반대5일과 34일은 빌 윌리엄스가 원안에서 쓴 값을 그대로 가져왔다. 피보나치 수열에서 따온 숫자라 트레이딩뷰를 비롯한 대부분의 플랫폼이 기본값으로 쓰고, 다른 파라미터로 발행된 기존 글들과 비교하기도 쉬워서 그대로 유지했다.
여기서 문제가 하나 생긴다. 34일 SMA가 나오려면 34개의 중간가가 있어야 하는데, 이번에 모은 데이터는 50거래일이다. 즉 처음 33거래일은 AO 값 자체가 없다. 50개 중 유효한 AO는 17개뿐이고, 첫 값은 2026-07-29에야 나온다. 이 종목이 41.72% 급락한 구간의 상당 부분(6월 중순~7월 말)은 AO가 계산되지 않는 예열 구간과 겹친다는 뜻이다. 지표를 보고 매매를 결정하려는 사람이라면 이 사실부터 알아야 한다. 34일 이동평균을 쓰는 지표는 전부 이 제약을 안고 있다.
한 가지 더 밝혀 둘 게 있다. stockanalysis.com의 일봉 표는 페이지당 50행으로 서버에서 내려오고, 그 이상은 자바스크립트 버튼으로 넘겨야 해서 이번 수집 도구로는 접근하지 못했다. 규격이 권장하는 60거래일에는 못 미치는 50거래일로 계산했다는 한계를 그대로 적는다.
실측: 신호는 딱 한 번
17개의 유효 AO 값 중 제로선을 넘은 시점은 2026-08-11 단 한 번이다. 8월 10일 -643.38이던 값이 8월 11일 +1346.91로 올라서며 상향돌파가 났다. 문제는 타이밍이다. AO가 0을 넘던 8월 11일, 종가는 이미 77,900원이었다. 이 값은 7월 30일 저점 종가 60,200원 대비 29.40% 오른 자리다. 반등의 3분의 1가량이 이미 지나간 뒤에야 AO가 방향을 확인해 준 것이다.
돌파 이후 주가는 8월 14일 82,600원까지 한 번 더 올랐다(저점 대비 +37.21%). 여기까지는 AO의 상승과 주가의 상승이 같이 갔다. 그런데 8월 14일을 고점으로 주가는 8월 21일 73,300원까지 11.26% 밀렸는데도, 관측 구간 안에서 AO는 하향돌파를 내지 않았다. 8월 21일 마지막 값도 +3,974.63으로 여전히 0보다 한참 위였다. 34일 평균이 워낙 느리게 움직이다 보니, 5거래일 만에 11% 넘게 빠지는 되돌림 정도로는 아직 제로선 아래로 끌어내리지 못한 것이다. 신호 하나로 진입 타이밍도 늦고 청산 타이밍도 못 잡은 구간이라, 맞았다고 말하기도 틀렸다고 말하기도 애매하다.
제로선 교차만으로는 표본이 하나뿐이라 이야기가 빈약해서, AO 막대가 전날보다 올랐는지(가속) 내렸는지(감속)를 기준으로도 다음날 종가 방향과 맞춰봤다. 두 번째 유효 AO 값이 나온 7월 30일부터 마지막 값 전날인 8월 20일까지 15개 구간을 셌다.
날짜 방향 AO 익일종가변화 결과
------------------------------------------------------
07-30 감속 -15,103 +11.46% 실패
07-31 감속 -15,679 +0.89% 실패
08-03 가속 -15,556 +7.83% 적중
08-04 가속 -13,762 +5.48% 적중
08-05 가속 -10,191 -0.78% 실패
08-06 가속 -6,310 +0.92% 적중
08-07 가속 -3,566 +3.63% 적중
08-10 가속 -643 -2.50% 실패
08-11 가속 +1,347 +3.08% 적중
08-12 가속 +2,518 +0.75% 적중
08-13 가속 +3,847 +2.10% 적중
08-14 가속 +5,283 -5.69% 실패
08-18 가속 +5,626 -2.18% 실패
08-19 감속 +5,283 -0.39% 적중
08-20 감속 +4,985 -3.43% 적중
------------------------------------------------------
적중 9 / 실패 6 / 적중률 60.0%틀린 날들을 보면 패턴이 보인다. 7월 30일과 31일은 AO가 이틀 연속 감속(전날보다 더 내려간)했는데, 정작 주가는 각각 11.46%, 0.89% 올랐다. 저점을 찍고 반등이 막 시작되던 시점이라, AO가 34일 평균에 눌려 아직 하락 모멘텀으로 읽고 있을 때 가격은 이미 방향을 튼 상태였다. 반대로 8월 14일과 18일은 AO가 계속 가속하는 중이었는데 다음날 주가는 각각 5.69%, 2.18% 빠졌다. 오실레이터가 가장 높은 값을 찍은 바로 그 자리가 되돌림의 시작이었다. 맞은 아홉 번은 대부분 추세가 뚜렷하게 이어지던 구간(8월 3일~13일)에 몰려 있고, 틀린 여섯 번은 방향이 꺾이는 지점 전후에 몰려 있다. 오실레이터 다수가 그렇듯, 추세 중간에는 잘 맞고 전환점 근처에서는 못 맞춘다.
파라미터를 바꾸면
5와 34라는 숫자가 절대적인 건 아니다. 같은 데이터에 더 빠른 조합 (3, 21)과 더 느린 조합 (7, 40)을 얹어 제로선 상향돌파 시점이 어떻게 달라지는지 봤다. 빠른 조합은 8월 5일에 이미 0을 넘었고, 표준 조합(5, 34)은 8월 11일, 느린 조합은 8월 14일에야 넘었다. 가장 빠른 조합과 가장 느린 조합 사이의 차이가 7거래일이다. 같은 종목, 같은 구간인데 파라미터 하나로 신호가 일주일 넘게 밀리거나 당겨진다는 뜻이다.
빠른 조합이 항상 유리한 것도 아니다. (3, 21)은 유효 AO가 30개로 늘어나는 대신, 21일 SMA가 짧은 만큼 노이즈에도 더 민감하게 반응한다. 이번 구간에서는 8월 5일 돌파 이후로도 계속 상승해 8월 18일 부근에서 고점을 찍고 꺾였는데, 표준 조합보다 먼저 올라탄 만큼 먼저 꺾이는 리스크도 같이 진다. 반대로 느린 조합 (7, 40)은 유효 값이 11개로 줄어드는 대가로 신호가 더 늦게 나온다. 표본이 50거래일뿐이라 세 조합의 우열을 통계적으로 가릴 수는 없지만, 빠를수록 예열 구간이 짧아지고 느릴수록 예열 구간이 길어진다는 트레이드오프는 이 정도 데이터로도 분명히 보인다.
중간값인 (10, 30)도 같이 돌려 봤다. 이 조합은 8월 13일에 제로선을 넘어, 표준 조합(8월 11일)보다 이틀 늦고 느린 조합(8월 14일)보다는 하루 빠르다. 짧은 이동평균과 긴 이동평균의 기간을 얼마나 벌리느냐가 아니라 두 기간의 절대 길이 자체가 지연을 결정한다는 걸 보여주는 결과다. 34일이라는 긴 이동평균을 그대로 둔 채 5일만 손보는 정도로는 지연이 크게 줄지 않는다는 뜻이기도 하다.
봇 게이트에 넣을 것인가
이 형태의 AO 단독 신호는 게이트에 넣지 않는 쪽으로 정리했다. 이유는 두 가지다. 첫째, 제로선 교차가 이번 구간에서 딱 한 번뿐이었다는 사실 자체가 신호 빈도가 낮다는 뜻이다. 매매 조건으로 쓰기엔 표본이 너무 얇다. 둘째, 그 한 번의 교차조차 반등의 3분의 1이 지난 뒤에 나왔고, 이후 11%대 되돌림에도 반응하지 않았다. 34일 평균을 쓰는 구조상 진입도 늦고 청산도 늦다.
다만 가속·감속 판정은 쓸모가 있어 보인다. 15번 중 9번을 맞혀 적중률이 60%였고, 특히 방향이 뚜렷하게 이어지는 구간에서는 연속으로 맞혔다. 다른 지표와 겹쳐서 추세 지속 여부를 확인하는 보조 신호 정도로는 쓸 수 있을 것 같다. 다만 이번 데이터는 50거래일, 신호 쌍은 15개뿐이다. 표본을 늘려 재검증하기 전까지는 이 60%라는 숫자에 큰 의미를 두지 않으려 한다.
남기는 것
이번 구간에서 가장 인상 깊었던 건 예열 구간의 크기다. 50거래일을 모았는데 정작 쓸 수 있는 값은 17개뿐이었다. 지표 하나를 붙일 때 필요한 최소 데이터 길이를 먼저 따져보지 않으면, 정작 급락이 시작된 시점의 신호는 하나도 못 보고 지나칠 수 있다는 걸 이번에 숫자로 확인했다.
에드윈 르페브르는 “주식 시장은 결코 틀리지 않지만, 의견은 자주 틀린다"고 썼다. AO의 제로선 교차가 8월 11일에야 나온 것도 시장이 틀린 게 아니라, 34일이라는 창을 쓴 계산법의 한계였을 뿐이다. 이 지표를 조금 더 빠른 조합으로 다시 계산해 봐야 할지는 아직 미결로 남겨 둔다.
이 글은 투자 권유가 아니며, 과거 데이터의 계산 결과일 뿐 미래 수익을 보장하지 않는다.




약어 풀이
* 이 글에 나온 영어 약어를 풀어 둔다.
- AO (Awesome Oscillator): 어썸 오실레이터. 중간가의 5기간 SMA에서 34기간 SMA를 뺀 값. 빌 윌리엄스가 만든 모멘텀 지표.
- SMA (Simple Moving Average): 단순이동평균. 기간 안의 가격을 같은 가중치로 평균한 값.
- KRX (Korea Exchange): 한국거래소. 코스피·코스닥을 운영하는 국내 유일의 증권 거래소.