파이썬 이것저것/파이썬 데이터분석

[파이썬] ProPhet을 활용하여 삼성전자 주식 데이터 예측해보기

agingcurve 2022. 4. 23. 18:10
반응형

1. yahoo finaince에서 삼성전자 일자별 장마감 가격을 갖고오기(크롤링을 이용해서 갖고와 보기)

 

패키지 설치

import pandas as pd
import pandas_datareader as web
import numpy as np
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup
from urllib.request import urlopen, Request

from fbprophet import Prophet
from datetime import datetime

 

 

 

 

이후에 패키지 사용을 위해서 yahoo finance(https://finance.yahoo.com/) 에서 검색해서 일자별 데이터를 가지고 옴

html코드를 분석하여 테이블의 데이터를 갖고 옴

yahoo finance 삼성전자 주가데이터

BeautifulSoup을 이용하서 html코딩을 파싱하고 데이터를 읽기

url = "https://finance.yahoo.com/quote/035420.KS/history?p=035420.KS&guccounter=1"
req = Request(url, headers={"User-Agent" : "Chrome"})
page = urlopen(req).read()
soup = BeautifulSoup(page, "html.parser")
table = soup.find("table")
table.text
df_raw = pd.read_html(str(table))[0]
df_raw.head()

 

# fbprophet을 사용하는 형식에 맞춰준 뒤, 맨 마지막 NaN 값이 있어서 제외 
df_tmp = pd.DataFrame({"ds": df_raw["Date"], "y": df_raw["Close*"]})
df_target = df_tmp[:-1]
df_target.head()

 

 

# 날짜 데이터 형식 변경
df = df_target.copy()
df["ds"] = pd.to_datetime(df_target["ds"], format="%b %d, %Y")
df.head()

 

 

2. yfinance 모듈을 사용하여 삼성전자, KIA 주식데이터를 가져와보고 예측함

from pandas_datareader import data
import yfinance as yf
yf.pdr_override()

start_date = "2018-03-01"
end_date = "2022-04-01"

KIA = data.get_data_yahoo("000270.KS", start_date, end_date)
SAM = data.get_data_yahoo("005930.KS", start_date, end_date)

 -> 종목번호, 시작일, 마지막일을 넣어주면 해당데이터를 뽑아준다

 

SAM["Close"].plot()

 
## accuracy를 확인하기
SAM_trunc = SAM[:"2022-01-01"]
SAM_trunc.tail()

 

# forecast 준비
df = pd.DataFrame({"ds":SAM_trunc.index, "y":SAM_trunc["Close"]})
df.reset_index(inplace=True)
del df["Date"]
df.head()

ProPhet 적용 (약 4개월간의 데이터를 예측)

m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df)
future = m.make_future_dataframe(periods=120)
forecast = m.predict(future)
forecast

종류별 예측데이터 생성

그래프 확인

m.plot(forecast)

년,월,일별 구성요소 예측 그래프생성
m.plot_components(forecast)

 

 

 

실제 데이터와 차이 확인

plt.figure(figsize=(20,6))
plt.plot(SAM.index,SAM["Close"], label="real")
plt.plot(forecast["ds"],forecast["yhat"], label="forecast")
plt.title("삼성전자")
plt.grid(True)
plt.legend()