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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

1回答

1545閲覧

対数差分変換したリストをもとのリストに戻したい。

AI_engineer

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2022/12/08 03:49

実現したいこと

時系列分析をする際、元データを対数差分変換しているのですが、最終的にはもとデータと同じ株価の値に直してグラフを出力したいです。
すなわち、
・ARMAモデルを用いて予測した部分(ソースコードの変数pred)を対数差分から元の株価の値に変換
・変換したものをもとの株価終値のグラフで出力

が実現したいです。(コードの最終部分)

該当のソースコード

Python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4from scipy import stats 5import statsmodels.api as sm 6from statsmodels.tsa.ar_model import AutoReg, ar_select_order 7from statsmodels.tsa import stattools 8from statsmodels.tsa.arima_model import ARIMA 9 10 11def logdiff(df): 12 df_ = df.copy() 13 df_ = np.log(df_) 14 df_ = df_.diff() 15 df_ = df_.dropna() 16 return df_ * 100 # 増加率を%表示するために100をかける 17 18 19if __name__ == '__main__': 20 # 株価25日間移動平均のデータ 21 m_averages = [28866.540799999995, 28837.2536, 28770.3672, 28719.998799999998, 28670.162399999997, 28634.564, 28601.921199999997, 28559.144799999995, 28530.946799999998, 28515.115599999997, 28486.8128, 28508.819600000003, 28550.749200000006, 28577.393600000003, 28599.111200000007, 28617.8756, 28647.31920000001, 28669.789600000007, 28656.536800000005, 28635.452800000006, 28616.724000000002, 28577.902400000003, 28543.2, 28506.7848, 28471.930799999995, 28394.5316, 28333.1576, 28262.457199999997, 28190.4472, 28128.037999999993, 28059.2424, 28009.282799999997, 27951.876800000002, 27886.71, 27820.3896, 27760.102000000003, 27691.2252, 27625.782000000003, 27569.450799999995, 27504.915999999997, 27474.432799999995, 27413.121199999998, 27358.438799999993, 27309.90239999999, 27234.545999999995, 27143.088799999994, 27103.4596, 27053.6152, 27026.5136, 26978.7, 26956.5372, 26915.5028, 26877.5472, 26800.4916, 26709.113599999997, 26653.5904, 26558.7576, 26481.419200000004, 26397.678800000005, 26338.204400000002, 26312.939200000004, 26282.841600000007, 26263.9628, 26302.385600000005, 26352.19360000001, 26379.771200000007, 26408.212000000003, 26453.426, 26498.0812, 26552.954000000005, 26620.7604, 26671.1592, 26721.6056, 26741.828800000003, 26761.6504, 26777.9916, 26811.433600000004, 26855.9764, 26938.077999999998, 27036.256799999996, 27092.3684, 27157.84559999999, 27224.935199999993, 27299.78999999999, 27371.431999999993, 27389.526799999996, 27380.0608, 27359.1008, 27292.959600000006, 27242.460000000006, 27189.2076, 27151.594400000005, 27074.271200000003, 26999.865200000004, 26935.553600000003, 26858.863200000003, 26806.510400000006, 26756.8732, 26729.251200000002, 26730.1564, 26706.838, 26703.538400000005, 26730.200000000004, 26726.385999999995, 26706.618000000002, 26687.084000000003, 26686.362800000003, 26701.736400000005, 26704.214400000008, 26700.407600000006, 26712.752400000012, 26759.58400000001, 26808.215200000006, 26870.508, 26925.9636, 26983.083599999998, 27015.912800000002, 27042.6368, 27061.147200000003, 27065.648, 27092.9472, 27074.361199999996, 27043.327999999998, 27026.7904, 26996.324399999998, 26987.0608, 26977.178399999997, 26971.968399999998, 26984.0216, 26989.093599999993, 26980.6216, 26946.7792, 26898.1544, 26863.9012, 26809.891600000003, 26772.9576, 26723.182399999998, 26679.0388, 26614.7472, 26544.526400000002, 26480.4008, 26438.967999999997, 26437.9376, 26479.953600000004, 26539.027199999997, 26598.3656, 26667.81560000001, 26743.175200000005, 26801.952800000003, 26868.590000000004, 26933.805599999996, 26993.860799999995, 27022.799199999994, 27050.4964, 27095.6004, 27166.913599999993, 27259.4584, 27333.304399999994, 27389.13879999999, 27486.711999999992, 27581.961999999996, 27676.0308, 27772.4496, 27876.6688, 27974.731200000002, 28060.775600000004, 28127.346800000003, 28181.418400000002, 28213.3684, 28246.903599999994, 28245.4756, 28265.3288, 28282.7816, 28280.610399999994, 28274.024799999996, 28266.743599999998, 28252.069999999996, 28245.492800000004, 28258.428000000004, 28269.730000000003, 28284.379600000004, 28298.99520000001, 28291.7416, 28294.004800000006, 28254.8316, 28207.497200000005, 28145.266000000007, 28062.508400000002, 27962.084800000004, 27867.7464, 27762.925600000002, 27681.697600000003, 27586.647199999996, 27496.1184, 27430.151599999997, 27399.8144, 27364.443199999998, 27325.4264, 27275.0176, 27224.8572, 27169.5696, 27148.1396, 27121.959200000005, 27085.5936, 27047.298800000004, 26985.8928, 26916.930799999995, 26883.181999999997, 26858.156799999997, 26852.7244, 26838.997199999998, 26830.68, 26848.025199999996, 26897.92, 26941.5808, 26982.6112, 27026.834800000004, 27104.230800000005, 27164.256400000006, 27182.412000000008, 27228.133600000005] 22 close = pd.Series(m_averages) 23 close.plot() 24 plt.show() 25 # 株価を対数差分変換 26 ld_close = logdiff(close) 27 ld_close.plot() 28 plt.show() 29 30 fig = plt.figure(figsize=(8,5)) 31 ax = fig.add_subplot() 32 # 自己相関係数 33 sm.graphics.tsa.plot_acf(ld_close, lags=20, ax=ax) 34 35 fig = plt.figure(figsize=(8,5)) 36 ax = fig.add_subplot() 37 # 偏自己相関係数 38 fig = sm.graphics.tsa.plot_pacf(ld_close, lags=20, ax=ax) 39 plt.show() 40 plt.close() 41 42 # ARMAモデル 43 arma_mod11 = sm.tsa.ARMA(ld_close, (1, 1)).fit() 44 45 # ls_closeの[:204]までを訓練データとし,204~220をテストデータとする 46 plt.plot(ld_close.values[:204], label='Obserbations') 47 arma_mod11.predict(204, 220, dynamic=True).plot(style='r--') 48 plt.show() 49 50 # 対数差分系列を元に戻す(実装したい部分) 51 pred = arma_mod11.predict(204, 220, dynamic=True) 52 pred = pd.Series(pred) 53 54 # 株価のグラフを出力 55

補足画像

株価の元データ
株価を対数差分変換したもの
赤の点線部分がARMAモデルで予測した値。この赤線部分を株価の元データに変換しなおして、グラフを出力したいです。

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

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

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

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

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

guest

回答1

0

得られる予測値predは前の値からの差分を表す値でしょうか。
であれば、予測の計算元となる初期実績値から累積的に逆演算していけばよいと思います。
以下はitertools.accumulateで累積演算していくコード例です。

Python

1import numpy as np 2import itertools 3 4# 「次の値」を求める関数 5def func(val_cur, val_pred): 6 x = np.log(val_cur) + val_pred / 100 7 return np.e**x 8 9st = 12300 # 予測の計算元となる初期実績値 10pred = np.array([100,0,-100]) # 予測値 [上がって, 変わらず, 下がる] -> 結局元に戻る 11ret = itertools.accumulate(pred, func, initial=st) 12print(list(ret)) # [12300, 33434.86649004621, 33434.86649004621, 12299.999999999984]

投稿2022/12/08 06:01

can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問