파이썬을 이용하여 주식 종목의 OHLC 주가 정보를 불러오고,
fbprophet을 이용하여 시계열 주식 가격을 예측하겠습니다.
<완성본>
1. 준비물
VScode, Anaconda
2. 설치 과정
아나콘다를 설치합니다.
https://www.anaconda.com/products/individual
Visual Studio Build Tools에서 C++ 항목을 설치합니다.
사용한 파이썬 버전은 python 3.6 입니다.
Anaconda Prompt를 실행하고,
conda create -n env_3.6 python=3.6
conda activate env_3.6
conda create env_3.6 python=3.6
# 아나콘다 가상 환경 env_3.6을 만들고, 파이썬 3.6 버전으로 설치합니다.
pip install convertdate
pip install lunarcalendar
pip install holidays
pip install cython
pip install wheel
pip install pystan
pip install fbprophet
또한 Anaconda Prompt에 각종 패키지와 fbprophet를 설치합니다.
이제, VScode를 열고 인터프리터를 가상환경 env_3.6으로 변경해줍니다.
3. 전체 종목 데이터 가져오기
from fbprophet import Prophet
from pykrx import stock
import pandas as pd
import matplotlib.pyplot as plt
from pykrx import stock
# pykrx를 통해 국내 주식 정보를 가져올 수 있습니다.
https://github.com/sharebook-kr/pykrx
# 종목 가져오기
def stock_stock(stock_code, stock_from, stock_to):
''' 종목 가져오기'''
global ticker
global stock_name
# 종목
try:
# 전체 종목코드와 종목명 가져오기
stock_list = pd.DataFrame({'종목코드':stock.get_market_ticker_list(market="ALL")})
stock_list['종목명'] = stock_list['종목코드'].map(lambda x: stock.get_market_ticker_name(x))
ticker = stock_code
stock_name = stock_list.loc[stock_list['종목코드']==stock_code]['종목명'].values
# ETF인 경우 예외 발생
if stock_name[0] == '':
raise Exception
df = stock.get_market_ohlcv_by_date(fromdate=stock_from, todate=stock_to, ticker=ticker)
df = stock_before(df)
# ETF
except Exception as ex:
# 전체 종목코드와 종목명 가져오기
stock_list = pd.DataFrame({'종목코드':stock.get_etf_ticker_list(stock_to)})
stock_list['종목명'] = stock_list['종목코드'].map(lambda x: stock.get_etf_ticker_name(x))
ticker = stock_code
stock_name = stock_list.loc[stock_list['종목코드']==stock_code]['종목명'].values
df = stock.get_etf_ohlcv_by_date(fromdate=stock_from, todate=stock_to, ticker=ticker)
df = stock_before(df)
return df
def stock_stock(stock_code, stock_from, stock_to):
# stock_from부터 stock_to까지 stock_code의 OHLC를 가져옵니다.
# 종목 전처리
def stock_before(df):
# 칼럼명을 영문명으로 변경
df = df.rename(columns={'시가':'open', '고가':'high', '저가':'low', '종가':'close', '거래량':'volume'})
# 거래정리 시
for i in range(len(df)):
if df['open'].iloc[i] == 0:
df['open'].iloc[i] = df['close'].iloc[i]
df['high'].iloc[i] = df['close'].iloc[i]
df['low'].iloc[i] = df['close'].iloc[i]
df = df.drop(['open','high','low','volume'],axis=1)
df = df.reset_index()
df = df.rename(columns={'날짜':'ds','close':'y'})
return df
fbprophet은 날짜를 컬럼 ds로, 종가를 y로 사용하기 때문에 종목 데이터를 전처리를 해줍니다.
stock_code = '005930'
stock_from = '20170116'
stock_to = '20220116'
df = stock_stock(stock_code,stock_from,stock_to)
4. fbprophet
model = Prophet()
model.fit(df)
future = model.make_future_dataframe(periods=10, freq='D')
forecast = model.predict(future)
fig1 = model.plot(forecast)
fig2 = model.plot_components(forecast)
plt.show()
future = model.make_future_dataframe(periods=10, freq='D')
# 예측할 날짜는 10일이며, 시간 단위로 하고자 하면 freq='H'로 변경해줍니다.
'컴퓨터 > Python' 카테고리의 다른 글
[Python] 파이썬, 공휴일 조회하여 출력하기 (공공데이터포털) (0) | 2022.05.05 |
---|---|
[Python] 파이썬, 네이버 뉴스 웹 크롤링 데이터 수집 (0) | 2022.03.11 |
[Python] 파이썬, for문에서 remove() 함수 쓸 때 반드시 확인할 것 (0) | 2022.01.07 |
[Python] 파이썬, Matplotlib 실시간 주식 차트 업데이트 자동화 만들기 (6) | 2022.01.06 |
[Python] 파이썬, 주식 차트와 보조지표 그리기 (Plotly) (0) | 2021.12.20 |