2
7

Prophetを使用した株価予測

Last updated at Posted at 2023-11-19

このコードは、特定の株式の過去の価格データを取得し、そのデータに基づいて将来の株価を予測するためのPythonスクリプトです。主に次のステップで構成されています:

  1. 必要なライブラリのインポート:

    • datetimepandasはデータ操作に使われます。
    • Prophetは時系列予測に使われるFacebookのライブラリです。
    • plotly.graph_objsはインタラクティブなグラフ作成に使用されます。
    • pandas_datareaderは金融データの取得に使用されるライブラリです。
  2. pandas_datareaderのインポートチェック:

    • pandas_datareaderがインストールされていない場合、エラーメッセージを表示してスクリプトを終了します。
  3. 株価データ取得関数(get_stock_data:

    • この関数は指定された銘柄コード(meigara_cd)、開始日(from_date)、終了日(to_date)に基づいて株価データを取得します。
    • pandas_datareaderを使用して、Stooqデータソースからデータを取得します。
  4. データ取得の実行:

    • スクリプトは特定の銘柄コード(ここでは"9104")と期間(2020年1月1日から今日まで)についてデータを取得します。
  5. データが正常に取得できた場合の処理:

    • 取得した株価データをProphetが読み取れる形式に変換します。
    • Prophetモデルを作成し、株価データでモデルを学習(フィット)させます。
    • 未来の365日間の予測を行います。
  6. 予測結果の可視化:

    • plotlyを使用して予測結果をグラフ化します。これには予測値、予測の上限と下限、実際の株価が含まれます。
    • このグラフはHTMLファイルとして保存され、ブラウザで開くことができます。
  7. エラーハンドリング:

    • データ取得に失敗した場合、エラーメッセージが表示されます。

このスクリプトは、株価予測に関心のあるユーザーや開発者にとって有用です。ただし、株価予測は非常に複雑で、多くの不確実性を含むため、実際の投資判断には慎重に使用する必要があります。

銘柄や開始日等は適時修正してください。
また銘柄によってはAdj Close (調整後終値)にしたほうが良いかと思われます。

import datetime
import pandas as pd
from prophet import Prophet
import plotly.graph_objs as go

# pandas_datareaderのインポートを試みる
try:
    from pandas_datareader import data as pdr
except ImportError:
    raise ImportError("pandas_datareaderがインストールされていません。")

# 株価データ取得関数
def get_stock_data(meigara_cd, from_date, to_date):
    try:
        df = pdr.DataReader(name=meigara_cd + ".JP", data_source='stooq', start=from_date, end=to_date)
        return df
    except Exception as e:
        print(f"データ取得中にエラーが発生しました: {e}")
        return None

# データ取得
meigara_cd = "9104"  # 銘柄コード
from_date = "2020-01-01"  # 開始日
to_date = str(datetime.date.today())  # 終了日

data = get_stock_data(meigara_cd, from_date, to_date)

# データが正常に取得できた場合のみ処理を続ける
if data is not None and not data.empty:
    # Prophet用インプットデータ
    df = pd.DataFrame({"ds": data.index, "y": data["Close"]}).reset_index(drop=True)

    # インスタンス化と学習
    proph = Prophet()
    proph.fit(df)

    # 予測用のフレーム
    future = proph.make_future_dataframe(periods=365)

    # 時系列を予測
    forecast = proph.predict(future)

    # Plotlyグラフの作成
    fig = go.Figure([
        go.Scatter(x=forecast['ds'], y=forecast['yhat'], name='予測値'),
        go.Scatter(x=forecast['ds'], y=forecast['yhat_upper'], fill=None, mode='lines', line={'color': 'lightgrey'}, showlegend=False),
        go.Scatter(x=forecast['ds'], y=forecast['yhat_lower'], fill='tonexty', mode='lines', line={'color': 'lightgrey'}, showlegend=False),
        go.Scatter(x=df['ds'], y=df['y'], name='実際の値', mode='markers')
    ])

    # グラフをHTMLファイルとして保存し、ブラウザで開く
    fig.write_html("stock_forecast.html")
    print("グラフは 'stock_forecast.html' に保存されました。")
else:
    print("データ取得に失敗しました。")

2
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7