035420 | NAVER 볼린저 밴드 분석하기
import os
import pandas as pd
file_save = "data/boillinger.csv"
if os.path.isfile(file_save):
data_df = pd.read_csv(file_save)
data_df['Date'] = pd.to_datetime(data_df['Date']) # datetime 포맷 변경
data_df = data_df.set_index('Date')
else:
from FinanceDataReader import DataReader as fdr
data_df = fdr("035420", "2019-01-01")
data_df.to_csv(file_save)
data_df.columns = [_.lower() for _ in data_df.columns]
data_raw = data_df.copy()
data_df.tail(3)
open | high | low | close | volume | change | |
---|---|---|---|---|---|---|
Date | ||||||
2021-07-30 | 438000 | 440500 | 433000 | 433500 | 628812 | -0.013652 |
2021-08-02 | 429000 | 437000 | 428500 | 433500 | 551937 | 0.000000 |
2021-08-03 | 439000 | 439000 | 422000 | 428000 | 792229 | -0.012687 |
# 볼린저 밴드 생성하기
data_df['MA20'] = data_df['close'].rolling(window=20).mean() # 이동평균값
data_df['stddev'] = data_df['close'].rolling(window=20).std() # 각 표준편차
data_df['upper'] = data_df['MA20'] + (data_df['stddev'] * 2) # 볼린저밴드 : 상단
data_df['lower'] = data_df['MA20'] - (data_df['stddev'] * 2) # 볼린저밴드 : 하단
data_df = data_df[19:]
data_df.head(3)
open | high | low | close | volume | change | MA20 | stddev | upper | lower | |
---|---|---|---|---|---|---|---|---|---|---|
Date | ||||||||||
2019-01-29 | 129999 | 136500 | 129999 | 136000 | 411369 | 0.030303 | 130425.0 | 4583.365231 | 139591.730462 | 121258.269538 |
2019-01-30 | 139000 | 139500 | 133000 | 136000 | 462280 | 0.000000 | 131325.0 | 3696.637875 | 138718.275750 | 123931.724250 |
2019-01-31 | 138000 | 143500 | 136000 | 136000 | 1054276 | 0.000000 | 132025.0 | 3118.176761 | 138261.353523 | 125788.646477 |
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
# Loading ... Visualization Modules
import matplotlib.pyplot as plt
import warnings
plt.style.use('seaborn')
warnings.simplefilter(action='ignore', category=FutureWarning)
from matplotlib.font_manager import fontManager as fm # 한글폰트 확인 및 추가
font_list_check = ['D2Coding', 'NanumGothicCoding', 'NanumGothic']
for _ in font_list_check:
font_counts = [f for f in font_list_check if _ in [_.name for _ in fm.ttflist]]
if len(font_counts) > 1: print(f"found : {_}"); plt.rc('font', family=_); break
found : D2Coding
# Visualization
plt.rcParams['figure.dpi'] = 300
plt.rcParams['figure.figsize'] = (20.0, 5.0) # plt.figure(figsize=(9, 5))
plt.plot(data_df.index, data_df['close'], color='#0000ff', label='Close') # ⑥
plt.plot(data_df.index, data_df['upper'], 'r--', label = 'Upper band') # ⑦
plt.plot(data_df.index, data_df['MA20'], 'k--', label='Moving average 20')
plt.plot(data_df.index, data_df['lower'], 'c--', label = 'Lower band')
plt.fill_between(data_df.index, data_df['upper'], data_df['lower'], color='0.9') # ⑧
plt.legend(loc='best')
plt.title('NAVER Bollinger Band (20 day, 2 std)')
plt.show()
종가 가 볼린저 밴드 어느 위치 에 있는지 확인하는 지표
data_df = data_raw.copy()
data_df['MA20'] = data_df['close'].rolling(window=20).mean()
data_df['stddev'] = data_df['close'].rolling(window=20).std()
data_df['upper'] = data_df['MA20'] + (data_df['stddev'] * 2)
data_df['lower'] = data_df['MA20'] - (data_df['stddev'] * 2)
data_df['PB'] = (data_df['close'] - data_df['lower']) / (data_df['upper'] - data_df['lower']) # ①
data_df = data_df[19:]
data_df.head(2)
open | high | low | close | volume | change | MA20 | stddev | upper | lower | PB | |
---|---|---|---|---|---|---|---|---|---|---|---|
Date | |||||||||||
2019-01-29 | 129999 | 136500 | 129999 | 136000 | 411369 | 0.030303 | 130425.0 | 4583.365231 | 139591.730462 | 121258.269538 | 0.804089 |
2019-01-30 | 139000 | 139500 | 133000 | 136000 | 462280 | 0.000000 | 131325.0 | 3696.637875 | 138718.275750 | 123931.724250 | 0.816166 |
plt.rcParams['figure.dpi'] = 300
plt.rcParams['figure.figsize'] = (20.0, 9.0) # plt.figure(figsize=(9, 8))
plt.subplot(2, 1, 1) # ②
plt.plot(data_df.index, data_df['close'], color='#0000ff', label='Close')
plt.plot(data_df.index, data_df['upper'], 'r--', label = 'Upper band')
plt.plot(data_df.index, data_df['MA20'], 'k--', label='Moving average 20')
plt.plot(data_df.index, data_df['lower'], 'c--', label = 'Lower band')
plt.fill_between(data_df.index, data_df['upper'], data_df['lower'], color='0.9')
plt.title('NAVER Bollinger Band(20 day, 2 std)')
plt.legend(loc='best')
plt.subplot(2, 1, 2) # ③
plt.ylabel('종가의 %b')
plt.plot(data_df.index, data_df['PB'], color='b', label='%B') # ④
plt.axhline(y=1, color ='black', linewidth=.5, linestyle="--") # 볼린저 밴드 상단
plt.axhline(y=0.5, color ='red', linewidth=1.5, linestyle="--") # 볼린저 밴드 중심
plt.axhline(y=0, color ='black', linewidth=.5, linestyle="--") # 볼린저 밴드 하단
plt.grid(True); plt.legend(loc='best'); plt.show()
data_df = data_raw.copy()
data_df['MA20'] = data_df['close'].rolling(window=20).mean()
data_df['stddev'] = data_df['close'].rolling(window=20).std()
data_df['upper'] = data_df['MA20'] + (data_df['stddev'] * 2)
data_df['lower'] = data_df['MA20'] - (data_df['stddev'] * 2)
data_df['PB'] = (data_df['close'] - data_df['lower']) / (data_df['upper'] - data_df['lower']) # ① 밴드지표1
data_df['bandwidth'] = (data_df['upper'] - data_df['lower']) / data_df['MA20'] * 100 # ② 밴드지표 2
data_df = data_df[19:] # rolling 의 앞 NaN 삭제
data_df.head(3)
open | high | low | close | volume | change | MA20 | stddev | upper | lower | PB | bandwidth | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Date | ||||||||||||
2019-01-29 | 129999 | 136500 | 129999 | 136000 | 411369 | 0.030303 | 130425.0 | 4583.365231 | 139591.730462 | 121258.269538 | 0.804089 | 14.056708 |
2019-01-30 | 139000 | 139500 | 133000 | 136000 | 462280 | 0.000000 | 131325.0 | 3696.637875 | 138718.275750 | 123931.724250 | 0.816166 | 11.259510 |
2019-01-31 | 138000 | 143500 | 136000 | 136000 | 1054276 | 0.000000 | 132025.0 | 3118.176761 | 138261.353523 | 125788.646477 | 0.818696 | 9.447231 |
plt.rcParams['figure.dpi'] = 300
plt.rcParams['figure.figsize'] = (20.0, 6.0) # plt.figure(figsize=(9, 8))
plt.subplot(2, 1, 1)
plt.plot(data_df.index, data_df['close'], color='#0000ff', label='Close')
plt.plot(data_df.index, data_df['upper'], 'r--', label ='Upper band')
plt.plot(data_df.index, data_df['MA20'], 'k--', label='Moving average 20')
plt.plot(data_df.index, data_df['lower'], 'c--', label ='Lower band')
plt.title('NAVER Bollinger Band(20 day, 2 std)'); plt.legend(loc='best')
plt.fill_between(data_df.index, data_df['upper'], data_df['lower'], color='0.9')
plt.subplot(2, 1, 2)
plt.ylabel('BBAND 너비')
plt.plot(data_df.index, data_df['bandwidth'], color='m', label='BandWidth') # ②
plt.grid(True); plt.legend(loc='best'); plt.show()
볼린저 밴드의 성격을 함께 묶어서 분석한다
plt.rcParams['figure.dpi'] = 300
plt.rcParams['figure.figsize'] = (20.0, 9.0) # plt.figure(figsize=(9, 8))
plt.subplot(3, 1, 1) # ②
plt.plot(data_df.index, data_df['close'], color='#0000ff', label='Close')
plt.plot(data_df.index, data_df['upper'], 'r--', label ='Upper band')
plt.plot(data_df.index, data_df['MA20'], 'k--', label='Moving average 20')
plt.plot(data_df.index, data_df['lower'], 'c--', label ='Lower band')
plt.fill_between(data_df.index, data_df['upper'], data_df['lower'], color='0.9')
plt.title('NAVER Bollinger Band(20 day, 2 std)')
plt.legend(loc='best')
plt.subplot(3, 1, 2) # ③
plt.plot(data_df.index, data_df['PB'], color='b', label='%B') # ④
plt.axhline(y=1, color ='black', linewidth=.5, linestyle="--") # 볼린저 밴드 상단
plt.axhline(y=0.5, color ='red', linewidth=1.5, linestyle="--") # 볼린저 밴드 중심
plt.axhline(y=0, color ='black', linewidth=.5, linestyle="--") # 볼린저 밴드 하단
plt.ylabel('종가의 %b')
plt.legend(loc='best')
plt.grid(True)
plt.subplot(3, 1, 3)
plt.plot(data_df.index, data_df['bandwidth'], color='m', label='BandWidth') # ②
plt.ylabel('BBAND 너비')
plt.legend(loc='best')
plt.grid(True)
plt.show()