Electronic Engineering/Python data analysis

Python Data 분석 : 볼린저 밴드

해시브라우니 2022. 7. 27. 17:55

삼성전자 주가에 대해 2021년 10월 부터 현재까지의 볼린저 밴드를 나타냄. 코드를 변경해가면서 각종 그래프를 출력하였고 아래는 최종 코드.

import matplotlib.pyplot as plt
from Investar import Analyzer

mk = Analyzer.MarketDB()
df = mk.get_daily_price('삼성전자', '2021-10-04')

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['PB'] = (df['close'] - df['lower']) / (df['upper']- df['lower'])
df['TP'] = (df['high'] + df['low'] + df['close']) / 3
df['PMF'] = 0
df['NMF'] = 0
for i in range(len(df.close)-1):
    if df.TP.values[i] < df.TP.values[i+1]:
        df.PMF.values[i+1] = df.TP.values[i+1]*df.volume.values[i+1]
        df.NMF.values[i+1] = 0
    else:
        df.NMF.values[i+1] = df.TP.values[i+1] * df.volume.values[i+1]
        df.PMF.values[i+1] = 0
df['MFR'] = df.PMF.rolling(window=10).sum() / df.NMF.rolling(window=10).sum()
df['MFI10'] = 100-100/(1+df['MFR'])
df = df[19:] #슬라이싱 : 19번째까지 NaN이므로

plt.figure(figsize=(9,8))
plt.subplot(2,1,1)
plt.plot(df.index, df['close'], 'b-', 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')
for i in range(len(df.close)):
    if df.PB.values[i] > 0.8 and df.MFI10.values[i] > 80:
        plt.plot(df.index.values[i], df.close.values[i], 'r^')
    elif df.PB.values[i] < 0.2 and df.MFI10.values[i] < 20:
        plt.plot(df.index.values[i], df.close.values[i], 'bv')
plt.legend(loc='best')
plt.title('Samsung Electronics Bollinger Band')

plt.subplot(2,1,2)
plt.plot(df.index, df['PB']*100, 'b', label = '%b *100')
plt.plot(df.index, df['MFI10'], 'g--', label='MFI(10day)')
plt.yticks([-20, 0, 20, 40, 60, 80, 100, 120])
for i in range(len(df.close)):
    if df.PB.values[i] > 0.8 and df.MFI10.values[i] > 80:
        plt.plot(df.index.values[i], 0, 'r^')
    elif df.PB.values[i] < 0.2 and df.MFI10.values[i] < 20:
        plt.plot(df.index.values[i], 0, 'bv')
plt.grid(True)
plt.legend(loc='best')
plt.show()

주식에 대해선 아는게 없으나 그래프 그리는게 신기해서 적용해보는중..