본문 바로가기
python/금융데이터분석

python 증권데이터 분석 - 볼린저 밴드 지표 python구현

by orangecode 2022. 12. 28.
728x90
증권투자 보조지표

국내의 어떤 암호화폐 거래소의 통계에 따르면 투자자들이 이용하는 보조지표 이용패턴을 분석한 결과가 있다.

 

기본 보조지표인 이동평균선을 제외하고 가장 많이 사용된 보조지표는

일목균형표, 볼린저밴드, 매물대, 상대강도지수, 이동평균 수렴확산 순으로 나타났다고 한다.

 

 

일목균형표

시세의 균형을 시각적으로 파악할 수 있는 지표로, 가격이 언제까지 오르고 언제까지 내릴 것인지 시간에 주목한 난해한 이론으로 만들어진 지표이다.

일목균형표는 '전환선', '기준선', '선행스팬 1', '선행스팬 2', '후행 스팬' 5개의 의미있는 선을 이용해 현재 가격을 알아내고자 하는 것으로 시간개념이 포함된 지표이다.

 

볼린저밴드(Bolinger Band)

가격이 이동평균선을 중심으로 표준편차 범위(상한선 및 하한선)안에서 등락을 거듭한다는 점을 전제로 ㅁ나들어진 기술적 지표를 말한다. 가격의 변동성을 볼 수 있게 설정된 중심선과 상단, 하단 밴드로 구성되어 있다.

가격 움직임의 예상 범위를 알려주고 시각적 효과를 준다는 점에서 다른 보조지표들과 다른 독특한 형태를 ㄹ보이는 보조지표를 말한다.

 

매물대

매물대란 일정기간동안 특정한 가격에서 거래된 주식 수량을 나타낸 것을 말한다. 

 

RSI(상대강도지수)

RSI(Relative Strength Index, 상대강도지수)는 가격의 상승폭과 하락 폭을 계산한 강도를 백분율로 계산하여 현 재 가격의 상태를 평가하고자 만든 기술적 지표이다.

과매수 / 과매도 상태로 판단하며, 일정 기간동안 가격의 전일대비 상승분 혹은 하락분의 평균값을 구해 상승분이 크면 과매수, 하락분 평균이 크면 과매도 상태로 판단한다.

 

MACD이동평균 수렴확산 

단기 이동평균선과 장기 이동평균선이 서로 멀어졌다가 가까워지는 걸 반복하는 점을 보고 평균선의 단점인 후행선을 보완하고자 만든 기술적 지표이다.

장/단기 이동 평균선이 가장 크게 벌어진 시점을 시세의 전환점이라고 하며, 이를 이용해 매매 타이밍을 파악하는 것이 MACD의 기본 원리이다.

 

볼린저 밴드 구하기

볼린저 밴드는 개발자인 존 볼린저(John Bolinger)가 저술한 '볼린저 밴드 투자 기법'에는 존 볼린저가 어떤 통계기법을 이용해 볼린저 밴드를 개발 및 활용했는지 상세한 내용을 확인 할 수 있다.

 

볼린저 밴드는 주가의 20일 이동 평균선을 기준으로 상단밴드, 저점밴드로 나뉘어져 있다.

- 상단 밴드 : 상대적인 고점을 나타내는 상단 밴드

- 하단 밴드 : 상대적인 저점을 나타내는 하단밴드

 

 

표준 볼린저 밴드 공식

 

상단 밴드와 하단 밴드의 사이폭은 주가의 표준편차와 특정 상수의 곱으로 나타낼 수 있다.

밴드 폭이 좁을수록 주가 변동성이 작고, 밴드폭이 넓을수록 변동성이 크다는 걸 나타낸다.

 

DB에 구축해놓은 네이버 종가 데이터를 이용하여 python으로 볼린저 밴드를 그려보자

 

네이버 주식 볼린저 밴드 python 코드

# 볼린저 밴드 - 네이버 증권 종가

# 모듈경로 지정
import sys
sys.path.append(r'C:\Users\kwonk\Downloads\개인 프로젝트\juno1412-1\증권데이터분석\DB_API')

# 라이브러리 설정
import matplotlib.pyplot as plt
from DB_API import Analyzer

mk = Analyzer.MarketDB()
df = mk.get_daily_price('NAVER', '2019-01-02')

df['MA20'] = df['close'].rolling(window=20).mean()
df['stddev'] = df['close'].rolling(window=20).std()
df['upper'] = df['MA20'] + (df['stddev']*2)
df['lower'] = df['MA20'] - (df['stddev']*2)

df = df[:19]

plt.figure(figsize=(9,5))
plt.plot(df.index, df['close'], color='#0000ff', label='Close')
plt.plot(df.index, df['upper'], 'r--', label='Upper band')
plt.plot(df.index, df['MA20'], 'k--', label='Moving average 20')
plt.plot(df.index, df['lower'], 'k--', label='Upper band')
plt.fill_between(df.index, df['upper'], df['lower'], color = 0.9)
plt.legend(loc='best')
plt.title('NAVER Bp;;omger Bamd (20 dau. 2 std)')
plt.show()

 

 

 

 

 

 

 

 

 볼린저 밴드 지표 1 : %b

%b 지표는 주가가 볼린저 밴드 어디에 위치하는지를 나타내는 지표를 말한다.

 

 

%b 지표는 종가가 상단 밴드에 걸쳐있을 때 1.0이 되고, 중간에 걸쳐있으면 0.5,  종가가 하단 밴드 아래 있으면 0보다 작은 값이다. 

 

예를 들어 %b값이  1.3 주가가 상단 밴드보다 밴드폭의 30%만큼 위에 있다고 말한다.

1. (종가 - 하단 밴드) / (상단 밴드 - 하단 밴드)를 구해 %b칼럼을 생성한다.

 

2. 기존의 볼린저 밴드를 2행 1열의 그리드에서 1열에 배치한다.

plt.subplot(2, 1, 1)

 

3. %b 차트를 2행 1열의 그리드에서 2열에 배치한다.

plt.subplot(2, 1, 2)

 

4. x좌표 df.index에 해당하는 %b값을 y좌표로 설정해 파란(b) 실선으로  표시되게 한다.

 

 

네이버 주가 볼린저 밴드 & %b값 구하는 코드

# 볼린저 밴드 - 네이버 증권 종가

# 모듈경로 지정
import sys
sys.path.append(r'C:\Users\kwonk\Downloads\개인 프로젝트\juno1412-1\증권데이터분석\DB_API')

# 라이브러리 설정
import matplotlib.pyplot as plt
import Analyzer

# NAVER 주가 종가 가져오기
mk = Analyzer.MarketDB()
df = mk.get_daily_price('NAVER', '2022-07-01')

# 볼린저 밴드 구하기
df['MA20'] = df['close'].rolling(window=20).mean() 
df['stddev'] = df['close'].rolling(window=20).std() 
df['upper'] = df['MA20'] + (df['stddev'] * 2)
df['lower'] = df['MA20'] - (df['stddev'] * 2)

# 볼린저밴드 %b값 구하기
df['PB'] = (df['close'] - df['lower']) / (df['upper'] - df['lower'])
df = df[19:]

# 볼린저 밴드 그래프 그리기
plt.figure(figsize=(9, 8))
plt.subplot(2, 1, 1)
plt.plot(df.index, df['close'], color='#0000ff', label='Close')
plt.plot(df.index, df['upper'], 'r--', label = 'Upper band')
plt.plot(df.index, df['MA20'], 'k--', label='Moving average 20')
plt.plot(df.index, df['lower'], 'c--', label = 'Lower band')
plt.fill_between(df.index, df['upper'], df['lower'], color='0.9')
plt.title('NAVER Bollinger Band(20 day, 2 std)')
plt.legend(loc='best')

# usbplot - 볼린저 밴드 %b값 그래프 그리기
plt.subplot(2, 1, 2)
plt.plot(df.index, df['PB'], color='b', label='%B')
plt.grid(True)
plt.legend(loc='best')
plt.show()
728x90

 

 

 볼린저 밴드 지표 2 : 밴드폭(BandWidth)

밴드폭(BandWidth)이란 상단 밴드와 하단 밴드 사이의 폭을 의미한다.

 

밴드 폭은 스퀴즈(Squeeze)를 확인하는데 유용한 지표로,

스퀴즈(Squeeze)란 변동성이 매우 낮은 수준까지 떨어져서 변동성 증가가 발생할 것으로 예상되는 상황을 말한다.

 

볼린저는 밴드폭이 6개월 저점을 기록하는 것을 보고 스퀴즈 파악이 가능하다고 한다.

 

 

 

밴드폭은 강력한 추세의 시작과 마지막을 포착할 수 있다는 특징도 가지고 있다.

 

강력한 추세는 스퀴즈로 시작되는데 변동성이 커지면서 밴드폭 수치가 급격히 높아지면서, 밴드폭이 넓어지며 추세의 반대편에 있는 밴드는 추세 반대 방향으로 향하게 된다.

 

 

네이버 주가 볼린저 밴드 & 밴드폭 구하는 코드

 

# 볼린저 밴드 - 네이버 증권 종가

# 모듈경로 지정
import sys
sys.path.append(r'C:\Users\kwonk\Downloads\개인 프로젝트\juno1412-1\증권데이터분석\DB_API')

# 라이브러리 설정
import matplotlib.pyplot as plt
import Analyzer

# NAVER 주가 종가 가져오기
mk = Analyzer.MarketDB()
df = mk.get_daily_price('NAVER', '2022-07-01')

# 볼린저 밴드 구하기
df['MA20'] = df['close'].rolling(window=20).mean() 
df['stddev'] = df['close'].rolling(window=20).std() 
df['upper'] = df['MA20'] + (df['stddev'] * 2)
df['lower'] = df['MA20'] - (df['stddev'] * 2)

# 볼린저밴드 밴드폭 구하기
df['BandWidth'] = (df['close'] - df['lower']) / df['MA20'] * 100
df = df[19:]

# 볼린저 밴드 그래프 그리기
plt.figure(figsize=(9, 8))
plt.subplot(2, 1, 1)
plt.plot(df.index, df['close'], color='#0000ff', label='Close')
plt.plot(df.index, df['upper'], 'r--', label = 'Upper band')
plt.plot(df.index, df['MA20'], 'k--', label='Moving average 20')
plt.plot(df.index, df['lower'], 'c--', label = 'Lower band')
plt.fill_between(df.index, df['upper'], df['lower'], color='0.9')
plt.title('NAVER Bollinger Band(20 day, 2 std)')
plt.legend(loc='best')

# usbplot - 볼린저 밴드 밴드폭 그래프 그리기
plt.subplot(2, 1, 2)
plt.plot(df.index, df['BandWidth'], color='m', label='BandWidth')
plt.grid(True)
plt.legend(loc='best')
plt.show()

 

 

 

 

 

 

참고도서

http://www.yes24.com/Product/Goods/90578506

 

파이썬 증권 데이터 분석 - YES24

투자 기법과 프로그래밍 기술로 자신만의 퀀트 투자 시스템을 완성하라『파이썬 증권 데이터 분석』은 웹 스크레이핑으로 증권 데이터를 주기적으로 자동 수집, 분석, 자동 매매, 예측하는 전

www.yes24.com

https://github.com/INVESTAR/StockAnalysisInPython

 

GitHub - INVESTAR/StockAnalysisInPython

Contribute to INVESTAR/StockAnalysisInPython development by creating an account on GitHub.

github.com

 

반응형

댓글