728x90
반응형
* 본 포스팅은 한국품질재단에서 주최하는 인공지능개발자 양성사업 교육과정 복습 용도로 포스팅되었습니다
* 시계열 데이터
- 연속성을 가진 데이터
- 시간(time, t) 정보를 가짐
* 페이스북 prophet 사용
- 써드 파트 제품
https://facebook.github.io/prophet/
* 주가 예측의 한계
- 정량적 분석(통계, 모멘텀) + 정성적 분석(심리, 뉴스, 이벤트, 국제 정세, 시즌, 계절..)
- 정량적 분석으로 예측은 가능하나 정성적 분석은 예측 불가 -> 주식 예측 오차 큼
* 전 세계 주식 데이터 공급처
- yahoo : https://finance.yahoo.com/
- API 제공, 미국 중심, 개별 국가 일정 부분에 결측치 발생 -> 정제 처리 필요
* 모듈 임포트
import numpy as np
import pandas as pd
import pandas_datareader.data as web # 주식 데이터를 얻어오기 위해 사용
import datetime # 시간 처리
import matplotlib.pyplot as plt
%matplotlib inline
# 데이터를 가져오고 나서, 이동평균을 구해야함.
# 국내 종목 : 삼성전자
# 날짜 : 3년 간 삼성전자 주가 분석(2017.01.02) ~ (2021.06.07)
start = datetime.datetime( 2017, 1, 2 )
end = datetime.datetime( 2021, 6, 7)
* 데이터 가져오기
- 종목코드(국내 : 코드, 해외 : 티커), 시작일,종료일 입력하면 차트 그려주기
# 종목코드, 시작일, 종료일 넣고 자동으로 차트만들어주는 함수
def makeStockChart( code, sDay=start, eDay=end
,*args, **kwargs):
'''
이 함수는 종목코드와 조회시작일, 종료일을 넣으면 차트를 그려준다.
이동 평균선은 5일, 20일, 60일, 120일 지원
'''
#데이터 가져오기
datas = web.DataReader( code, 'yahoo', sDay, eDay)
#데이터 파생변수추가
tmp = datas['Adj Close']
datas['5MA'] = tmp.rolling( window=5 ).mean()
datas['20MA'] = tmp.rolling( window=20 ).mean()
datas['60MA'] = tmp.rolling( window=60 ).mean()
datas['120MA'] = tmp.rolling( window=120 ).mean()
#차트그리기(시각화)
plt.figure ( figsize=(12, 6) )
plt.plot( datas.Close, label='Close' )
plt.plot(datas['5MA'], label='5MA')
plt.plot(datas['20MA'], label='20MA')
plt.plot(datas['60MA'], label='60MA')
plt.plot(datas['120MA'], label='120MA')
plt.title(f"{code}'s stock chart")
plt.legend()
plt.show()
* 삼성전자 주식코드 입력하여 함수 호출
samsung_code = '005930.KS'
makeStockChart( code=samsung_code )
* 페이스북의 모듈 활용해서 시계열 데이터(삼성전자 향후 10일 주가 예측하기)
- prophet 자료구조
- ds : 시간
- y : 데이터(종가)
-> 주가 예측 모듈을 학습시키기 위한 훈련 데이터 셋
* 데이터 준비
# 데이터 가져오기
datas = web.DataReader( samsung_code, 'yahoo', start, end)
# 컬럼 ds(YYYY-MM-DD), y(종가 : Close) 구성
# 해당 구저의 DateFrame만들기 위한 딕셔너리 선언
dic = {
'ds' : datas.index,
'y' : datas.Close
}
# ds 와 y를 컬럼으로 갖는 데이터 프레임 생성
df = pd.DataFrame( dic )
#인덱스 초기화(원본 까지 적용)
df.reset_index( inplace=True )
# 'ds' 컬럼과 중복되는 'Date' 컬럼 제거
del df['Date']
# 페이스북의 시계열 예측 모델에 사용한 데이터 준비
df.head(5)
* 예측하기
# prophet 모듈 세팅
from fbprophet import Prophet
# Day 단위로 데이터가 구성되어 있으므로, 일 단위 주기성 활성화
model = Prophet( daily_seasonality=True )
# 데이터 학습 시작 -> 기계학습
model.fit( df )
# 주가 예측 위한 날짜 데이터 세팅 -> 기존 데이터 + 향후 10일치 예측값
future = model.make_future_dataframe( periods=10 )
# 주가 예측
forecast = model.predict( future )
# forecast.columns ->
'''
Index(['ds', 'trend', 'yhat_lower', 'yhat_upper', 'trend_lower', 'trend_upper',
'additive_terms', 'additive_terms_lower', 'additive_terms_upper',
'daily', 'daily_lower', 'daily_upper', 'weekly', 'weekly_lower',
'weekly_upper', 'yearly', 'yearly_lower', 'yearly_upper',
'multiplicative_terms', 'multiplicative_terms_lower',
'multiplicative_terms_upper', 'yhat'],
dtype='object')
'''
# 필요한 컬럼만 보기
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(11)
# 모델이 제공하는 시각화
model.plot(forecast)
* 예측결과
- 오늘 자 기준(2021.06.08) 이후 10일 주식 예측가
* 분석 : 정량적 분석( 수치, 통계자료 등)만 고려했을 때 향후 10일 후(6/18) 삼성전자 주가는 약, 9만원..
* 기준 별 주가 변동 파악하기
model.plot_components( forecast )
* 해석 : 삼성전자는 매년마다 상승폭, 월요일 제일 가격이 싸고, 9월에 가격이 제일 싸다. 이 데이터는 정량적 분석으로만 이루어져서, 이벤트, 국제정세, 액면분할 등 같은 사항을 전혀 고려하지 않아 오차가 많이 발생한다.
* 결론 : 지금 사기엔 늦었다. (주관적 생각)
728x90
반응형