Python初心者がデータ分析の手法を使って株価を予測してみた!

1.はじめに


このブログはAidemy Premiumのカリキュラムの一環で、受講修了条件を満たすために公開しています。

Aidemy Premiumにて「データ分析講座6か月コース」を受講しました。
受講前はプログラミング経験ゼロの状態でした。
この講座で学んだことをつかって株価の予測をしてみたいと思います。

2.本ブログの概要

SARIMAモデルを使用して、アメリカの自動車メーカー「テスラ社」の株価を予測してみる。

3.作成したプログラム

環境


Dynabook(Windows PC)
Python3
Google Colaboratory

①使用するライブラリをインポートする

株価データはyahoo Financeからインポートします。

 #データが格納されているライブラリをインポート 
import yfinance as yf
 #解析用のライブラリをインポート 
import itertools
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import datetime
import numpy as np
import datetime
from datetime import date, timedelta


②株価データの取得
テスラ社の株価で、今回は2018年~2023年の5年間の期間で取得します。
ティッカーにテスラ社("TSLA")を指定。

 #銘柄はテスラ社を指定する 。取得する期間を指定してデータをダウンロードする。

ticker = "TSLA"
df = yf.download(ticker, start="2019-01-01", end="2023-12-31", interval="1d")
df

データをの中を確認してみると6カラムあり
カラムの定義としては、

  • open: 初期値

  • high: 高値

  • low: 低値

  • close: 終値
    下記にデータを示す。

これはテスラ社の23年までの5年間の株価の推移です。

df = df.resample(rule = "M").mean()#1か月ごとのデータ取得に変更
df = df["Close"]
plt.plot(df)
plt.show()

下記のグラフは、縦軸が終値(ドル)横軸が年です。

可視化したグラフから、2018年から2022年まで上昇をしているが、2023年に株価が大きく下がったことがわかります。

今回は、モデルは時系列モデルSARIMAを使うことにする。

モデルのチューニングは下記のコードで行う。季節性に関するパラメータが大事そうなので、関数を使用して、チューニングを定義する。

# orderの最適化関数
def selectparameter(DATA, s):
    p = d = q = range(0, 2)
    pdq = list(itertools.product(p, d, q))
    seasonal_pdq = [(x[0], x[1], x[2], s) for x in list(itertools.product(p, d, q))]
    parameters = []
    BICs = np.array([])
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(DATA,
                                                order=param,
                                                seasonal_order=param_seasonal)
                results = mod.fit()
                parameters.append([param, param_seasonal, results.bic])
                BICs = np.append(BICs, results.bic)
            except:
                continue
    return parameters[np.argmin(BICs)]
 #モデルを当てはめる 
best_params = selectparameter(df, 12)
SARIMA_AAPL = sm.tsa.statespace.SARIMAX(df,order=best_params[0],seasonal_order=best_params[1]).fit()

今回チューニングさせたパラメータは下記となります。

  1. 非季節性のパラメータ (p, d, q):

  • p: 自己回帰 (AR) 部分の次数。

  • d: 差分の次数。

  • q: 移動平均 (MA) 部分の次数。

2. 季節性のパラメータ (P, D, Q, s):

  • P: 季節性自己回帰 (SAR) 部分の次数。

  • D: 季節性差分の次数。

  • Q: 季節性移動平均 (SMA) 部分の次数。

  • s: 季節サイクルの長さ。

チューニングの結果として得られたパラメータは下記となる。
[(1, 1, 1), (0, 1, 1, 12), 591.9242096086863]
best_params の各要素は以下の通りです:

  1. (1, 1, 1):

  • これはSARIMAモデルの非季節性のパラメータ (p, d, q) を表します。

    • p = 1: 自己回帰 (AR) 部分の次数。

    • d = 1: 差分の次数。

    • q = 1: 移動平均 (MA) 部分の次数。

  1. (0, 1, 1, 12):

  • これはSARIMAモデルの季節性のパラメータ (P, D, Q, s) を表します。

    • P = 0: 季節性自己回帰 (SAR) 部分の次数。

    • D = 1: 季節性差分の次数。

    • Q = 1: 季節性移動平均 (SMA) 部分の次数。

    • s = 12: 季節サイクルの長さ(ここでは12ヶ月周期を示しています)。

  1. 591.9242096086863:

  • これはこのパラメータの組み合わせでモデルを適合させたときのBIC(ベイズ情報量規準)スコアです。BICはモデルの適合度とモデルの複雑さのバランスを取るための指標で、値が小さいほど適したモデルとされます。

最後に予測結果を表示する。

# predに予測データを代入して、2023以降の将来の予測値を取得 
pred = SARIMA_AAPL.predict('2023-1', '2025-10')

# predと実測値の時系列データを可視化  #予測データは赤色で表示 
plt.plot(yf.download(ticker, start="2018-01-01", end="2024-12-31", interval="1d").resample(rule = "M").mean()["Close"])
plt.plot(pred, "r")
plt.show()

下記のグラフは、縦軸が終値(ドル)横軸が年です。
尚、青い線が実測値、赤い線が予測値です。

2023年までは予測通りに進められたように見える。しかし、2024年の後半以降から、大きく上振れてしまい、中盤の落ち込みがとらえられなかった。しかし、2025年に向けての上昇をとらえられており、今後の展望としても上がっていくことが予測されている。

4. 最後に
今回学習をしたことを活かしてTesla社の株価の予測を時系列モデルのSARIMAで行った。予測としては見込みのありそうなことが確認できたが精度の上昇をもっと見込めることも確認できたと思う。今回対応をできなかった点で改善てきそうな点としては、

  • 複雑なニューラルネットを使用したRNN等の新しいモデルを使用

  • パラメータチューニングのアルゴリズムをより精度の良いものに改善

  • データの分析をしっかりと行い、特長量の改善

等である。時間があれば取り組んでみて、結果の改善につながるのか見てみたい。

この記事が気に入ったらサポートをしてみませんか?