2021년 6월 3일 목요일

Python - Stock Market Price Prediction Using Time Series Forecasting - ARIMA model - 2/3

0.Jupyter Notebook 에서 수행


1.필요 package 설치
!pip install nsepy


2.필요 package import
import os
import warnings
warnings.filterwarnings('ignore')
from pylab import rcParams
rcParams['figure.figsize'] = 10, 6
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.arima_model import ARIMA
from pmdarima.arima import auto_arima
from sklearn.metrics import mean_squared_error, mean_absolute_error
import math
import numpy as np
from nsepy import get_history
from datetime import date
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd


3.Data 가져오기
sbin = get_history(symbol='SBIN',start=date(2000,1,1),end=date(2020,11,1))
sbin.head()
**symbol 의 SBIN의 의미**


3.SBIN의 종가(Close Prices) 를 이용한 그래프 생성
plt.figure(figsize=(10,6))
plt.grid(True)
plt.xlabel('Dates')
plt.ylabel('Close Prices')
plt.plot(sbin['Close'])
plt.title('SBIN closing price')
plt.show()

plt.figure(figsize=(10,6))
df_close = sbin['Close']
df_close.plot(style='k.')
plt.title('Scatter plot of closing price')
plt.show()
**같은 내용을 산점도(Scatter plot)로 생성**

plt.figure(figsize=(10,6))
df_close = sbin['Close']
df_close.plot(style='k.',kind='hist')
plt.title('Hisogram of closing price')
plt.show()
**히스토그램(Histogram) 으로 표시**


4.데이터의 시계열 검증
시계열 분석은 data가 시계열일때만 작동한다, 따라서 가져온 데이터가 진정 시계열인지 판단할 필요가 있다
가설을 설정하고 특성을 확인한다

H0 - 귀무가설(Null hypothesis, 영가설) - 주장하는 특정 현상이 입증되지 않는한 사실이라고 믿어지는 기존의 내용 
H1 - 대립가설(Alternative hypothesis) - 새로 주장하는 논쟁으로 기존의 것과 다르기 때문에 입증 해야 하는것

여기서는
H0 - 이 데이터는 시계열이 아니라(non-stationary) 선형(Linear) 이다
H1 - 이 데이터는 시계열이다(stationary)

로 가설이 설정되며
평균과 표준편차가 모두 일정하게 보이면 이 데이터는 시계열이라 할수 있음




5.시계열 검증
from statsmodels.tsa.stattools import adfuller
def test_stationarity(timeseries):
#Determing rolling statistics
rolmean = timeseries.rolling(12).mean()
rolstd = timeseries.rolling(12).std()
#Plot rolling statistics:
plt.plot(timeseries, color='yellow',label='Original')
plt.plot(rolmean, color='red', label='Rolling Mean')
plt.plot(rolstd, color='black', label = 'Rolling Std')
plt.legend(loc='best')
plt.title('Rolling Mean and Standard Deviation')
plt.show(block=False)
print("Results of dickey fuller test")
adft = adfuller(timeseries,autolag='AIC')
# output for dft will give us without defining what the values are.
#hence we manually write what values does it explains using a for loop
output = pd.Series(adft[0:4],index=['Test Statistics','p-value','No. of lags used','Number of observations used'])
for key,values in adft[4].items():
output['critical value (%s)'%key] = values
print(output) 
test_stationarity(sbin['Close'])

 

**붉은색이 평균 , 검정색이 표준편차(std)이다**
**그래프에서는 평균과 표준편차가 증가하기 때문에 시계열이라 보기 어렵다**


**p값이 0.05 보다 크기때문에 영가설을 기각할수 없다 (시계열이 아닌 선형 데이터이다)**




6.추세와 계절성의 분리
result = seasonal_decompose(df_close, model='multiplicative', freq = 30)
fig = plt.figure()
fig = result.plot()
fig.set_size_inches(16, 9)


댓글 없음:

댓글 쓰기