質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

309閲覧

ARIMAモデルによる株価の時系列モデル推定

Ei2526

総合スコア0

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/05/23 12:21

実現したいこと

表示される予測期間のグラフがほぼ平坦になってしまいます。
推定された値(auto ARIMA)を見てみましたが、ほぼ数値が変わらない状態になっています。
こういう結果になるのが普通か、あるいは修正する方法があるのかを教えていただきたいです
イメージ説明

前提

Google ColabにおいてPythonコードを使って推定を進めています。

該当のソースコード

Python

1# ライブラリのインポート 2!pip install pmdarima 3import pandas as pd 4import numpy as np 5from scipy import signal 6from statsmodels.tsa.seasonal import seasonal_decompose 7from statsmodels.tsa.seasonal import STL 8from statsmodels.tsa.stattools import adfuller 9from statsmodels.graphics.tsaplots import plot_acf, plot_pacf 10import matplotlib.pyplot as plt 11import pmdarima as pm 12from pmdarima import utils 13from pmdarima import arima 14from pmdarima import model_selection 15from statsmodels.tsa.statespace.sarimax import SARIMAX 16from sklearn.metrics import mean_squared_error 17from sklearn.metrics import mean_absolute_error 18from sklearn.metrics import mean_absolute_percentage_error 19 20 21 22 23TOYOTA_stock_Source = pd.read_csv("/content/drive/MyDrive/7203トヨタ自動車株価.csv", index_col=['日付'], parse_dates=True) 24 25# 終値の抽出 26TOYOTA_stock = TOYOTA_stock_Source['終値'] 27# データの前処理 28TOYOTA_stock = TOYOTA_stock_Source['終値'].str.replace(',', '').astype(float) 29#欠損値の置換 30TOYOTA_stock_imp_pd = TOYOTA_stock.fillna(TOYOTA_stock.mean()) 31 32plt.plot(TOYOTA_stock_imp_pd) 33 34dfr = TOYOTA_stock_imp_pd.pct_change(1).dropna() 35 36# 対数変換後、階差をとったものにADF検定 37dftest = adfuller(np.diff(np.log(TOYOTA_stock_imp_pd))) 38print('ADF Statistic: %f' % dftest[0]) 39print('p-value: %f' % dftest[1]) 40 41dftest = adfuller(np.diff(np.log(TOYOTA_stock_imp_pd),n=2)) 42print('ADF Statistic: %f' % dftest[0]) #検定統計量を表示させる 43print('p-value: %f' % dftest[1]) 44print('Critical values :') 45for k, v in dftest[4].items(): #1%,5%,10%信頼区間を表示させている 46 print('\t', k, v) 47 48# 対数化後、階差数列化後、季節階差を除いたものにADF検定 49dftest = adfuller(pd.DataFrame(np.diff(np.log(TOYOTA_stock_imp_pd))).diff(12).dropna()) 50print('p-value: %f' % dftest[1]) 51 52# 原系列 53plot_acf(TOYOTA_stock_imp_pd, lags=20) 54plot_pacf(TOYOTA_stock_imp_pd, lags=20) 55 56# 対数化後、階差数列化後、季節階差を除いたもの 57syori_dt = pd.DataFrame(np.diff(np.log(TOYOTA_stock_imp_pd))).diff(12).dropna() 58acf = plot_acf(syori_dt, lags=20) 59pacf = plot_pacf(syori_dt, lags=20) 60 61# データ分割(train:学習データ、test:テストデータ) 62train, test = model_selection.train_test_split(TOYOTA_stock_imp_pd, train_size=700) 63 64arima_model = pm.auto_arima(train, 65 seasonal=True, 66 m = 12, 67 trace=True, 68 n_jobs=-1, 69 maxiter=10) 70 71# 予測 72##学習データの期間の予測値 73train_pred = arima_model.predict_in_sample() 74##テストデータの期間の予測値 75test_pred, test_pred_ci = arima_model.predict( 76 n_periods=test.shape[0], 77 return_conf_int=True 78) 79 80print(test_pred) 81 82# テストデータで精度検証 83print('RMSE:') 84print(np.sqrt(mean_squared_error(test, test_pred))) 85print('MAE:') 86print(mean_absolute_error(test, test_pred)) 87print('MAPE:') 88print(mean_absolute_percentage_error(test, test_pred)) 89 90# グラフ化 91fig, ax = plt.subplots() 92ax.plot(train[24:].index, train[24:].values, label="actual(train dataset)") 93ax.plot(test.index, test.values, label="actual(test dataset)", color="gray") 94ax.plot(train[24:].index, train_pred[24:], color="c") 95ax.plot(test.index, test_pred, label="auto ARIMA", color="c") 96ax.fill_between( 97 test.index, 98 test_pred_ci[:, 0], 99 test_pred_ci[:, 1], 100 color='c', 101 alpha=.2) 102ax.legend()

試したこと

データの欠損を埋める方法などを変えてみましたが大きく値が変動しませんでした。

補足情報(FW/ツールのバージョンなど)

csvファイルのリンクです。
トヨタ株価
初心者ゆえ抽象的な質問をして申し訳ありません。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問