본문 바로가기
개발일지

파이썬 투자 보조 지표 분석 / 전략 설계 - OBV,PVT

by kirion 2022. 11. 22.
728x90
반응형

투자 보조지표 OBV, PVT

투자 보조지표 분석 두 번째로 OBV와 PVT에 대해 알아보겠다.

 

 

OBV

OBV(On Balance Volume)란?

거래량은 주가에 선행한다는 것을 전제로 분석하는 기법.

주가가 전일에 비해 상승하였을 때의 거래량 누계에서 하락하였을 때의 거래량 누계를 차감한 것을 매일 누적으로 집계한 후 도표화한 것.

OBV는 전체 시장이 매집 단계에 있는지 아니면 분산 단계에 있는지를 나타냄으로 앞으로의 주가 변화 방향을 예측할 수 있음.

 

OBV 계산 방법

OBV = 상승한 날의 거래량 - 하락한 날의 거래량

 

해석

OBV의 상승은 매입세력의 우세, 하락은 매도세력의 우세라고 볼 수 있다.

 

전략

OBV 다이버전스

  • 주가가 하락하는 경우에 OBV선 상승
    • 매집하는 세력이 있지만, 주가를 올리려하지 않음(매집세력 존재)
  • 주가가 상승하는 경우에 OBV선 하락
    • 매도하는 세력이 있고, 주가를 일부로 떨어트리지 않음(분산 활동 존재)

 

PVT

OBV는 거래량에 기반으로 산출된 지표임으로 주가의 등락이 반영되어있지 않음. 따라서 주가를 반영해 OBV의 단점을 보완 개발한 것이 PVT

 

PVT 계산 방법

PVT = (당일 종가 - 전일 종가) / 전일 종가 * 당일 거래량 + 전일 PVT

 

해석

주가의 상승과 더불어 하락대비 매수세가 높음을 측정하는 것. 가격의 변동 폭을 계산식에 넣어 약상승, 약 하락 시 활용 가능성이 높음. OBV보다 정확한 분석 가능.

 

전략

  • PVT가 상승 추세일 때 세력의 매집을 포착
  • PVT가 하락 추세일 때 세력의 매도를 포착
  • 급등급락이 심한 장세 혹은 종목일 때 다이버전스 상황 분석

 


파이썬 분석

import ta
import pandas as pd
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt
import FinanceDataReader as fdr
import copy

df_krx = fdr.StockListing('KRX')

kospi_data = df_krx[(df_krx["Market"]=="KOSPI") & (~df_krx["Sector"].isna())]

target = kospi_data[kospi_data["Name"]=="KT&G"]
target

price_data = fdr.DataReader("033780","2020","2022-11-17")

KT&G를 대상으로 분석하기 위해 필요한 패키지와 데이터를 만든다.

 

obv = ta.volume.OnBalanceVolumeIndicator(price_data["Close"],price_data["Volume"]).on_balance_volume()

price_data["obv"] = obv
price_data["ma_obv"] = price_data["obv"].rolling(9).mean()

ta패키지의 OBV를 계산하는 함수를 이용해 KT&G의 OBV 계산.

fig, ax1 = plt.subplots(figsize = (14,7)) 
ax1.set_ylabel('Price') 
ax1.plot(price_data["Close"],color = "black",alpha = 0.5)

ax2 = ax1.twinx() 
ax2.set_ylabel('Index') 
ax2.plot(price_data["obv"],color = "red",alpha = 0.5)
ax2.plot(price_data["ma_obv"],color = "blue",alpha = 0.5)
ax2.legend(["obv","ma_obv"],loc = "upper left")
plt.title(target["Name"].values[0])
plt.show()

KT&G의 OBV 지표는 지속적으로 상승하는 것을 볼 수 있다. 보라색이 OBV, 검은색이 주가.

2020년 3월을 기점으로 계속해서 매집해나가는 것을 볼 수 있는데 21년 경에 주가가 등락이 있은 후 22년 말에 급격한 상승을 볼 수 있다. 주가가 유지되는데 OBV는 상승하는 것은 매수 세력이 있음을 나타낸다..

주가가 상승하였음에도 obv는 떨어지지 않는다.

 

price_data["pvt"] = 0
for i in range(1,price_data.shape[0]):
    tmp1 = price_data[i-1:i]
    tmp2 = price_data[i:i+1]
    pvt_value =((tmp2["Close"].values[0] - tmp1["Close"].values[0])/tmp1["Close"].values[0] * tmp2["Volume"].values[0] + 
                tmp1["pvt"].values[0])
    price_data.loc[price_data.index ==tmp2.index.values[0],"pvt"] = pvt_value

price_data["ma_pvt"] = price_data["pvt"].rolling(9).mean()

PVT 지표 계산.

ta 패키지에는 계산 함수가 없어서 for문을 이용해 간단하게 구현했다.

fig, ax1 = plt.subplots(figsize = (14,7)) 
ax1.set_ylabel('Price') 
ax1.plot(price_data["Close"],color = "black",alpha = 0.5)

ax2 = ax1.twinx() 
ax2.set_ylabel('Index') 
ax2.plot(price_data["pvt"],color = "red",alpha = 0.5)
ax2.plot(price_data["ma_pvt"],color = "blue",alpha = 0.5)
ax2.legend(["pvt","ma_pvt"],loc = "upper left")
plt.title(target["Name"].values[0])
plt.show()

PVT 지표 계산시 한 가지 주의해야 할 것이 증권사에서 제공하는 PVT값과는 다르다. 일 별로 등락폭이 같은데 기준일에 따라 시작 값이 다르기 때문에 추세만 보면 될 것이다.

거래량과 가격이 같이 산식에 들어가기 때문에 주가와 비슷한 흐름 향상을 보이는데 21년 4월 경 주가가 상승하는 폭 보다 PVT 지표가 크게 상승한 것을 볼 수 있다. 그 후 꾸준히 지표값을 유지하고 있는 것을 봐 4개월간 꾸준히 상승세가 보인다.

(투자 전문가가 아니라 알쏭달쏭하다)

22년 현재 PVT값을 근 3년간 최고 점을 찍고있다. 앞으로 추가 상승의 여지가 있어 보이기도 하는데, 과거의 패턴을 반복한다면 어느 정도 상승 후 하락하는 것으로도 보인다. 이건 지켜봐야겠다.

 


 

OBV, PVT 지표에 관해서는 벡테스팅을 진행하지 못했다. RSI, MFI와 같은 지표는 0 ~ 100 사이에서 값이 움직이는데 OBV, PVT 지표는 바닥과 천장이 없다. 따라서 주가와 지표의 값을 이용해 트레이딩을 해야 하는데, 기준을 세우기가 명확하지 않아서 지표와 파이썬 구현만 소개하겠다.

 

앞으로는 천장이 없는 지표에 대한 벡테스팅 방법에 또는 활용방법에 대해서도 고민을 해봐야겠다. 

728x90
반응형

댓글