
Percentage Price Oscillator (PPO)의 수식, 엑셀과 트레이딩뷰로 구현해보기
*2022-05-19 글
이격도는 주가와 이동평균선의 편차를 계산한 지표입니다.
해외에서는 Percentage Price Oscillator (PPO)가 이격도와 가장 유사하며,
PPO가 기간이 서로 다른 두 이동평균선을 비교한 지표라면,
이격도는 주가와 이동평균선을 비교한 지표입니다.
평균으로부터 멀어진 주가는 다시 평균으로 회귀한다
라는 가정을 기반으로 참고하시는 분들이 많은 것으로 확인됩니다.
과매도를 확인할 때 참고 정도는 가능하겠지만, 평균이 가격을 만드는 것이 아닌, 가격이 평균을 만든다는 점에 유의할 필요가 있습니다.
다시 말해 당장 가격이 평균보다 크게 낮다고 하더라도, 그 낮은 가격이 유지된다면 결국 평균값도 내려가 그 의미가 사라진다는 뜻입니다.
먼저 PPO의 수식은 다음과 같습니다.
(단기이동평균값 - 장기이동평균값) / 장기이동평균값 * 100
이격도의 수식은 다음과 같습니다.
종가 / 이동평균값 * 100
앗, 속았다!
PPO(상), 이격도(중), MACD선(하) 비교
PPO "단기이동평균값"의 기간을 1로 변경하면, 이격도와 값만 다를 뿐, 형태는 완전히 동일해집니다. 1일 이동평균은 종가와 같기 때문입니다.
같은 원리로, 이동평균값의 차를 나타내는 MACD 또한, 단기이동평균값의 기간을 1로 정하면 형태가 동일해집니다.
만약 해당 지표 중 하나라도 겹치는 것이 있었다면, 그리고 해당 지표들을 서로 다른 방식으로 해석하고 계셨다면, 깜빡 속으신 것입니다.
수식 상, 근본적으로 동일한 지표입니다.
Backtest
카카오를 대상으로, 2000년 1월부터 2022년 4월까지 PPO를 사용한 "Long Only" 백테스팅 결과입니다.
모든 백테스트는 리스크 관리를 따로 하지 않았으며, 조건에 따라 자산의 100%를 전부 운용했을 때의 결과입니다.
PPO 설정 값은 7,21 입니다.
이격도가 아닌 PPO 기준입니다. 이격도와 PPO는 형태는 동일하나 값이 다르기에 이 점 유의 부탁 드립니다.
1.
매수 조건: PPO가 -5 미만일 때
매도 조건: PPO가 0를 초과하였을 때
Sharpe Ratio = 0.05
Sortino Ratio = 0.081
단순한 기존의 가정:
"평균으로부터 멀어진 주가는 다시 평균으로 회귀한다"
에 맞추어 PPO가 낮으면 진입, 정상화될 때까지 보유하는 전략 식입니다.
2.
매수 조건: PPO가 0 미만이고 7일 전 PPO보다 현재 PPO가 더 높을 때
매도 조건: PPO가 0를 초과하였을 때
Sharpe Ratio = 0.081
Sortino Ratio = 0.124
격차가 벌어졌을 때 진입하는 아이디어에, 모멘텀을 합쳤습니다.
트레이드 수가 적어 -5 미만에서 0으로 조정하였으며
PPO가 0 미만일 때, 다시 오르는 것이 확인 되어야만 진입하는 전략 식입니다.
성과가 더 나아진 모습입니다.
3.
매수 조건: PPO가 0 미만이고 7일 전 PPO보다 현재 PPO가 더 높을 때
매도 조건: PPO가 0를 초과이고 1일 전 PPO보다 현재 PPO가 더 낮을 때
Sharpe Ratio = 0.106
Sortino Ratio = 0.205
PPO가 0을 초과하였어도 꾸준히 상승하는 경우도 존재할 것이기 때문에, 0을 초과하고 나서 PPO가 낮아지기 시작할 때 까지 보유하는 전략 식으로 수정하였습니다.
성과가 더 나아진 모습입니다.
항상 백테스팅을 할 때면, 가격의 위치와 추세를 함께 보는 것이 효율적임을 증명해주는 것 같습니다.
Excel
1. 단기이동평균
PPO는 평균 값의 차를 이용하기 때문에, 기본적으로 평균치를 먼저 구해주셔야 합니다. 7일 평균으로 하였습니다.
=AVERAGE(B2:B8)
2. 장기이동평균
장기 이동평균도 동일합니다. 21일 평균으로 하였습니다.
=AVERAGE(B2:B22)
3. PPO
PPO
= (단기이동평균값 - 장기이동평균값) / 장기이동평균값 * 100
=(C22-D22)/D22*100
4. 이격도
이격도
= 종가 / 이동평균 * 100
=B22/D22*100
장기이동평균(셀D22)대신 단기이동평균(셀C22)를 사용하셔도 문제없습니다. 기간만 다를 뿐이기 때문입니다.
TradingView
만약 단순이동평균(sma)가 아닌 지수이동평균(ema)를 사용하고 싶으신 분이라면,
아래 수식
short = sma(close, s)
long = sma(close, l)
에서 sma를 ema로 변경하여 적용해주시면 됩니다.
//@version=4 strategy(title="POO") s=input(7, minval=1) l=input(21, minval=1) short = sma(close, s) long = sma(close, l) PPO = (short - long)/long*100 plot(PPO, color=#159980)
이격도의 식은 다음과 같습니다.
ema로 변경하고 싶으시다면
sma = sma(close, l)
를
sma = ema(close, l)
로 변경하여주시면 됩니다.
//@version=4 study(title="이격도") l=input(21, minval=1) sma = sma(close, l) A = close/sma*100 plot(A, color=#159980)
많은 분들이 알고 계시는 이격도는 다음과 같습니다.
그냥 같은 식을 세 번 반복해주시면 됩니다.
//@version=4 study(title="이격도") l1=input(20, minval=1) l2=input(40, minval=1) l3=input(60, minval=1) sma1 = sma(close, l1) sma2 = sma(close, l2) sma3 = sma(close, l3) A = close/sma1*100 B = close/sma2*100 C = close/sma3*100 plot(A, color=color.red) plot(B, color=color.green) plot(C, color=color.blue)