Salesforce.com社の株価予測を行ってみた
はじめに
このブログはAidemy Premiumのカリキュラムの一環で、受講修了条件を満たすために公開しています。
以前セールスフォース社に在籍していたことがあり、ニューヨーク証券取引所にて上場をしている当社の株価予測に興味を持ちこのようなテーマにさせていただきました。
作成したプログラム環境
Python3
Chrome
Google Colaboratory
# 1.ライブラリのインポートとデータ読み込み
ライブラリのインポートを行います。
yfinanceという今回利用する株価データが格納されているものと解析用のライブラリをインポートし株価データを取得します。セールスフォース社はCRMというtickerです。モデル構築に用いる教師データの期間は2000/01/01から2024/3/31とします。
#データが格納されているライブラリをインポート
import yfinance as yf
#解析用のライブラリをインポート
import itertools
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import numpy as np
import datetime
from datetime import date, timedelta
#銘柄はSalesforce社を指定する。
#取得する期間を指定してデータをダウンロードする。
ticker = "CRM"
df = yf.download(ticker, start="2010-01-01", end="2024-3-31", interval="1d")
df
# 2.データ整理
取得データを整理し可視化します。
df = df.resample(rule = "M").mean()#1か月ごとのデータ取得に変更
df = df["Close"]
df
plt.plot(df)
plt.show()
# 3.モデルの構築
SARIMAモデルを使用してモデルを構築します。
SARIMAモデルとは、自己回帰モデル(ARモデル)と移動平均モデル(MAモデル)と和分モデル(I)を組み合わせた自己回帰和分移動平均モデル(ARIMAモデル)に季節的な周期変動を取り入れたモデルです。
# 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_CRM = sm.tsa.statespace.SARIMAX(df,order=best_params[0],seasonal_order=best_params[1]).fit()
# 4.予測
予測データを投入して予測を開始
今回採用しているSARIMAモデルは季節的な周期変動を取り入れたとなるため、あえて2010年からの実績値を取り入れる形で予測をさせて、実績値と予測値を比較します。
(未知のデータについては2025年1月から2030年12月のデータを予測)
#predに予測データを代入
#実績値と比較をするために2010以降のデータを可視化
pred = SARIMA_CRM.predict('2010-1', '2030-12')
# 5.可視化
可視化します。実際のデータを青線で、予測データを緑線で出力します。
#predと実測値の時系列データを可視化
#予測データは緑色で表示
plt.plot(yf.download(ticker, start="2010-01-01", end="2030-12-31", interval="1d").resample(rule = "M").mean()["Close"])
plt.plot(pred, "g")
plt.show()
以下が実行結果です。青い線が実際のデータで緑色の線が過去データも含めてモデルが導き出した予測データです。
実際に、過去データを含めたモデルの予測と実績値の線が重なっており、モデルの精度がある程度担保できているのではないかと思われます。
おわりに
ライブラリをインポートして使用する事で、データ分析初心者の私でも簡単にデータ分析や予測業務を行うことができました。
具体的な業務に落とし込んだ分析や予測ができるように以降はドメイン知識を実際の分析業務に活用できるようにより学習を進めていこうと思います。