본문 바로가기
컴퓨터/Python

[Python] 파이썬, 시계열 주식 예측 fbprophet

by sjblog 2022. 1. 16.
반응형

파이썬을 이용하여 주식 종목의 OHLC 주가 정보를 불러오고,

 

fbprophet을 이용하여 시계열 주식 가격을 예측하겠습니다.

 

<완성본>

 

1. 준비물

VScode, Anaconda

 

 

2. 설치 과정

 

아나콘다를 설치합니다.

https://www.anaconda.com/products/individual

 

Anaconda | Individual Edition

Anaconda's open-source Individual Edition is the easiest way to perform Python/R data science and machine learning on a single machine.

www.anaconda.com

 

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

 

GitHub - sharebook-kr/pykrx: KRX 주식 정보 스크래핑

KRX 주식 정보 스크래핑. Contribute to sharebook-kr/pykrx development by creating an account on GitHub.

github.com

 


# 종목 가져오기
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'로 변경해줍니다.

 

 

반응형