[python] 볼린저 밴드(Bollinger bands) - (1) 볼린저밴드 그리기

[python] 볼린저 밴드(Bollinger bands) - (1) 볼린저 밴드 그리기

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 패키지를 활용하여 주가 데이터 가져오기

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]:
종목코드 종목명
0 060310 3S
1 095570 AJ네트웍스
2 006840 AK홀딩스
3 054620 APS홀딩스
4 265520 AP시스템
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]:
시가 고가 저가 종가 거래량
날짜
2020-01-02 62600 63400 61400 63300 129106
2020-01-03 63300 63700 61900 62900 94871
2020-01-06 61600 63300 60500 62600 87796
2020-01-07 63500 63600 61600 61800 77852
2020-01-08 61500 61500 59600 59900 102407
... ... ... ... ... ...
2021-05-24 167200 167400 165000 165800 24922
2021-05-25 167000 167700 166100 167000 24553
2021-05-26 167100 168100 165500 167000 25903
2021-05-27 167000 167500 164500 166400 32202
2021-05-28 168000 170800 167200 169800 56481

348 rows × 5 columns

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]:
Open High Low Close Volume ma20 stddev upper lower
날짜
2020-01-31 74100 74100 68400 69000 142595 66855.0 3416.442440 73687.884880 60022.115120
2020-02-03 67200 72400 66400 71900 168218 67285.0 3485.953015 74256.906030 60313.093970
2020-02-04 73800 77000 73400 76500 309127 67965.0 3888.752337 75742.504674 60187.495326
2020-02-05 79500 79800 76500 77900 217699 68730.0 4264.554027 77259.108055 60200.891945
2020-02-06 76500 78800 75900 78200 127786 69550.0 4435.206042 78420.412083 60679.587917
... ... ... ... ... ... ... ... ... ...
2021-05-24 167200 167400 165000 165800 24922 172555.0 10047.753087 192650.506175 152459.493825
2021-05-25 167000 167700 166100 167000 24553 171315.0 9026.060223 189367.120447 153262.879553
2021-05-26 167100 168100 165500 167000 25903 170025.0 7510.194825 185045.389651 155004.610349
2021-05-27 167000 167500 164500 166400 32202 168930.0 6185.049887 181300.099774 156559.900226
2021-05-28 168000 170800 167200 169800 56481 168335.0 5416.570579 179168.141159 157501.858841

329 rows × 9 columns

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');