はじめに
はじめまして。私は重電メーカーに5年半勤めて、その後、ソフトウェア開発の会社に9か月間勤めて、現在は就職活動中です。世間では、AIの活躍が注目されており、また、自分の大学の同期がその分野に転職して活躍していることを聞き、自分も盛り上がっているAIの分野で働きたいと思うようになり、Aidemyの講座を受講するに至りました。
本記事の概要
・この記事では、簡単な株価予測をご紹介します。どのような流れでデータを収集し、分析・予測されるかを記事にしています。
・この記事ではpythonの開発を扱っており、それ以外の言語は使っておりませんのでご了承ください。
開発環境
・Windows10 Home 64 ビット オペレーティング システム、x64 ベース プロセッサ
・Python 3.9.13
・google colabo
簡単な株価予測
日本国内の上場企業数は2020年調査で3,754社ということですが、今回はその中でも自分の親族に建設会社に勤めている人がいるため、話題になるかと考え、スーパーゼネコンの大成建設の株価を予測することとしました。SARIMAモデルを使い、2025年5月31日のデータまで予測します。
目次
1.データ収集
2.データの整理
3.モデルの構築
4.データの予測・可視化
5.考察
1.データ収集
まず、使用するライブラリをインポートします。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import itertools
次に株価のデータ収集をします。stooqというポーランドのサイトから、取得開始日、終了日、間隔を指定して株価データのcsvファイルをダウンロードします。今回は学習に使うデータを5年分とするために2017/5/31~2023/5/31のデータを取得することとしました。
Stooq
取得したcsvのデータをgoogle colabo上に持ってきて、pandasを用いて読み込み、TAISEI_stock_Sorceに格納します。そして、データとして使用する終値を抽出します。
TAISEI_stock_Sorce = pd.read_csv("/content/1801_jp_m.csv")
#終値の抽出
TAISEI_stock=TAISEI_stock_Sorce['Close']
次に時間情報をindexにする処理を行います。
#indexに期間を設定
index=pd.date_range("2017-05-31","2023-05-31",freq="M")
#indexをTAISEI_stockのインデックスに代入
TAISEI_stock.index=index
これでデータ元の準備ができました。
2.データの整理
グラフからトレンドと季節性があることを掴めます。そこで、SARIMAモデルを使って、分析を行います。SARIMAモデルとはARIMAモデルを季節周期性を持つ時系列データにも拡張できるようにしたモデルです。ARIMAもでるとは、ある値がそれ以前の値に影響をされるモデルで、直前p個の値と相関を持つARモデルAR(p)と以前の誤差に影響されるモデルで直前q個の値に影響を受けるMAモデルMA(q)を合わせたARMAモデルをd時点前の階差系列に適応したものです。SARIMAモデルは(p,d,q)に加え、(sp,sd,sq,s)のパラメーターを持ちます。sは周期を示し、sp,sd,sqはそれぞれ季節性自己相関、季節性導出、季節性移動平均といい、ある値は一つ以上の季節期間を過去のデータに影響されます。
次に自己相関係数、偏自己相関係数の可視化を行います。自己相関とは自己の過去のデータの相関で、偏自己相関とはある時点の値がそれ以前の値と相関があるときに、その間の値の影響を取り除いたデータの相関です。例えば、7日差の自己相関を求めたときに、7日前→6日前→5日前→・・・→1日前→今日というように1日ごとにデータが影響している可能性がありますが、その影響を除いて相関を求めたものを変自己相関と言います。自己相関係数と偏自己相関係数を可視化したものが以下になります。
偏自己相関係数から周期sを推測することができます。グラフの山部分の周期を確認すると6、14か月が周期sだと考えられます。
パラメータの決定
プログラムを用いて(p, d, q) (sp, sd, sq, s)について最も適切なものを調べます。DATAと周期sを入力し、BIC(ベイズ情報量基準) が低いほうのパラメータを採用します。
#(p,d,q)(sp,sd,sq)を求める
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 print(parameters[np.argmin(BICs)])
selectparameter(TAISEI_stock,14)
すると、BIC値は、sが6の時は958.375、14の時は855.047だったのでs=14のパラメータ[(p,d,q), (sp,sd,sq,s)]=[(0, 1, 0), (0, 1, 1, 14)]を採用することとしました。
3.モデルの構築
パラメータをSARIMAモデルに入力してモデルを構築します。
#モデルの構築
SARIMA_TAISEI_stock=sm.tsa.statespace.SARIMAX(TAISEI_stock,order=(0,1,0),seasonal_order=(0,1,1,14)).fit()
4.データの予測・可視化
構築したモデルを用いて、予測開始日"2020-05-31"、予測終了日"2025-05-31"を入力し、データの予測・可視化を行います。
TAISEI_stock_pred=SARIMA_TAISEI_stock.predict("2020-05-31","2025-05-31")
plt.plot(TAISEI_stock_pred)
plt.show()
次に、元の時系列データと予測データを同時に出力し、比べてみます。
#元の時系列データと予測データの比較
plt.plot(TAISEI_stock)
plt.plot(TAISEI_stock_pred,color="r")
plt.show
青いグラフが元の時系列データ、赤いグラフが予測データを表しています。青いグラフに比べて、赤いグラフが遅れて推移していることがわかりますが、おおまかなグラフの推移は予測できていると思われます。短期間の予測はできていませんが、おおまかな推移は予測できていると言えそうです。
5.考察
今回は、SARIMAモデルを用いましたが、LSTM、Prophetなど他のモデルを使うことで精度がより上がることが考えられます。色々なモデルで分析することが大事だと思われました。
今後の活用
今回は1社のデータを扱いましたが、何社ものデータを扱うことでそれぞれの相関を出し、何社もの株価を購入することを考えたとき、一度に株価が下落するリスクを避け、バランスの取れた株購入に役立つような予測データを得られることができたらと思います。
おわりに
今回は、データ分析講座を受講し、株価の予測を行いました。今までは、株を購入する際に銀行の分析結果だけを聞いて購入するような形をとっていましたが、今回分析できたことにより、自分で納得できる予測を用いて株を購入する可能性を感じることができました。もっとAIについて学んで、より精密に株価予測をして、株購入に役立てられたらと思いました。