1. 볼린저 밴드(Bollinger bands)의 개념¶
- 현재의 주가가 상대적으로 높은지 낮은지를 판단할 때 사용하는 보조지표
- 중심선인 이동평균선, 표준편차 밴드인 상단선과 하단선으로 구성됨
- 상단밴드: 중심선 + 2$\times$20일 이동표준편차(Moving Standard Deviation)
- 중심선: 20일 이동평균(Moving Average)
- 하단밴드: 중심선 - 2$\times$20일 이동표준편차
- 밴드폭이 좁을수록 주가 변동성이 작고, 밴드폭이 넓을수록 변동성이 크다는 것을 나타냄
In [1]:
from pykrx import stock
import pandas as pd
import matplotlib.pyplot as plt
# 한글폰트 설정, 그래프 마이너스 표시 설정
import matplotlib
from matplotlib import font_manager, rc
import platform
if platform.system() == 'Windows':
# 윈도우인 경우
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
else:
# Mac 인 경우
rc('font', family='AppleGothic')
matplotlib.rcParams['axes.unicode_minus'] = False
2. pykrx 패키지를 활용하여 주가 데이터 가져오기¶
- 볼린저밴드를 그리려면 종목의 일자별 주가 데이터가 있어야 한다. pykrx나 FinanceDataReader 패키지를 활용하면 특정 종목의 주가 데이터를 쉽게 가져올 수 있다. 이 글에서는 prkrx 패키지를 이용한다.
- <참고> [python] pykrx로 주가 데이터 가져오기
- <참고> [python] FinanceDataReader로 주가 데이터 가져오기
In [2]:
# 종목코드와 종목명 가져오기
stock_list = pd.DataFrame({'종목코드':stock.get_market_ticker_list(market="ALL")})
stock_list['종목명'] = stock_list['종목코드'].map(lambda x: stock.get_market_ticker_name(x))
stock_list.head()
Out[2]:
In [3]:
# 2차전지 소재기업인 천보의 2021년 주가 데이터 가져오기
ticker = stock_list.loc[stock_list['종목명']=='천보', '종목코드']
df = stock.get_market_ohlcv_by_date(fromdate="20200101", todate="20210528", ticker=ticker)
df
Out[3]:
In [4]:
# 칼럼명 영문명으로 변경
# 시가(Open), 고가(High), 저가(Low), 종가(Close), 거래량(Volume)
df = df.rename(columns={'시가':'Open', '고가':'High', '저가':'Low', '종가':'Close', '거래량':'Volume'})
3. 볼린저 밴드 그리기¶
In [5]:
df['ma20'] = df['Close'].rolling(window=20).mean() # 20일 이동평균
df['stddev'] = df['Close'].rolling(window=20).std() # 20일 이동표준편차
df['upper'] = df['ma20'] + 2*df['stddev'] # 상단밴드
df['lower'] = df['ma20'] - 2*df['stddev'] # 하단밴드
df = df[19:] # 20일 이동평균을 구했기 때문에 20번째 행부터 값이 들어가 있음
df
Out[5]:
In [9]:
plt.figure(figsize=(9, 5))
plt.plot(df.index, df['Close'], label='Close')
plt.plot(df.index, df['upper'], linestyle='dashed', label='Upper band')
plt.plot(df.index, df['ma20'], linestyle='dashed', label='Moving Average 20')
plt.plot(df.index, df['lower'], linestyle='dashed', label='Lower band')
plt.title(f'{"천보"}({int(ticker.values)})의 2021년 볼린저 밴드(20일, 2 표준편차)')
plt.legend(loc='best');