삼성전자 주가에 대해 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()
주식에 대해선 아는게 없으나 그래프 그리는게 신기해서 적용해보는중..
'Electronic Engineering > Python data analysis' 카테고리의 다른 글
Python Data 분석 : SK하이닉스 일중강도율, 반전 매매기법 (0) | 2022.07.27 |
---|---|
Python Data 분석 : MariaDB를 활용한 시세 조회 (0) | 2022.07.27 |
Python Data 분석 : yfinance와 네이버금융 데이터로 시세조회하기(실패) (0) | 2022.07.19 |
Python Data 분석 : 웹 스크레이핑 (0) | 2022.07.14 |
Python Data 분석 : 미국국채와 코스피의 회귀분석 (0) | 2022.07.06 |