【Prophet】を使って、株価を予測してみる!

みなさんこんにちは!
イザナギです!
最近、株とかちょっと気になるんですよね。
株主優待を使うもよし!株で稼ぐもよし!いいですね!
でも、いざ株を買おうって思ってもどれ変えばいいか迷ってしまいます。
その迷いを払うため、機械学習で株価を予測できたら株を選ぶ指標にしたい!
なので、「Prophet」を使って、株価を予測してみよう!

Prophetとは?

「Prophet」はFacebookが開発した時系列予測OSSらしいです。
Prophet
「Prophet」を使って学習したデータを可視化すると以下の画像のようになります。

  • 黒い点が実データ(学習させたデータ)
  • 青い線が予測線
  • 青い範囲が予測結果の振れ幅

となっています。
この画像の場合、2015年から2021年(一月まで)の終値調整値を予測しています。
分析した企業では、予測線が2022年になっても上昇していることがわかります。
また、以下画像のように、年・月・曜日ごとにトレンドを可視化することもできます!

実践

それでは、実際にコードを書いて実践していきましょう!
今回利用するライブラリは以下の通りです。


from bs4 import BeautifulSoup
import pandas as pd
import requests
from datetime import datetime
import numpy as npfrom fbprophet 
import Prophet

まずは、学習させるデータを取得します。
株の予測をしてみたかったので、株価データを利用しました。
以下のサイトをスクレイピングして、株価データを取得します。

まずは学習させたいデータを取得します。


def get_kabu_data(stock_number):
    dfs = []
    year = [2015,2016,2017,2018,2019,2020,2021] # 取得したいデータの年を記載
    for y in year:
        url = 'https://kabuoji3.com/stock/{}/{}/'.format(stock_number,y) 
        headers = {
             "User-Agent":  "User-Agent情報の記載" #記載しないとスクレイピングできない可能性がある
        }
        soup = BeautifulSoup(requests.get(url, headers = headers).content,'html.parser')
        tag_tr = soup.find_all('tr')
        head = [h.text for h in tag_tr[0].find_all('th')]
        data = []
        for i in range(1,len(tag_tr)):
            data.append([d.text for d in tag_tr[i].find_all('td')]) 
       df = pd.DataFrame(data, columns = head)
       col = ['始値','高値','安値','終値','出来高','終値調整']
       for c in col:
            df[c] = df[c].astype(float)
       df['日付'] =[datetime.strptime(i,'%Y-%m-%d') for i in df['日付']]
       dfs.append(df)
    return dfs
def concatenate(kabu_data):
    data = pd.concat(kabu_data,axis=0)
    data = data.reset_index(drop=True)
    col = ['始値','高値','安値','終値','出来高','終値調整']
    for c in col:
        data[c] = data[c].astype(float)
    return data

 

k = "企業コード"v = "企業名" # csvのタイトルに利用
print(k,v)
kabu_data = get_kabu_data(k)
data = concatenate(kabu_data)
data.to_csv('{}-{}.csv'.format(k,v), index=False)

これで、企業の株データを取得(csv化)することができました。
いよいよ、Prophetを使ってデータを学習させて株価を予測してみたいと思います!


def prophet(csv):
    df_prophet = pd.read_csv(csv)
    model = Prophet()    # csvはみやすさ重視のため日本語を用いたが、学習させるときは予測したいデータのカラムを「y」、時系列(日付)を「ds」とする
    model.fit(df_prophet.rename(columns={"日付" : "ds", "終値調整" : "y"}))
    future_data = model.make_future_dataframe(periods=365, freq = 'd')
    future_data = future_data[future_data['ds'].dt.weekday < 5]
    forecast_data = model.predict(future_data)
    print(csv)
    model.plot(forecast_data).savefig("prophet/image/" + csv.replace('.csv', ''))#   トレンドを可視化したいときは「plot_components」を使う
    model.plot_components(forecast_data).savefig("prophet/image/" + csv.replace('.csv', ''))prophet("csvのURL")

これで先ほどの画像のように可視化されたグラフが表示されていると思います。

まとめ

今回は「Prophet」を使って株価を予測してみました。
予測はしてみたものの、実際にどのくらいあっているんでしょうか?
分析した企業さんのデータを監視しながら確かめてみることとします。
それでは今回はここで筆を置かせていただきます。
最後まで記事をご覧いただきありがとうございました!

■関連記事(精度そんな良くないかもwww)

■関連トピック

2024 - Izanagi's Site