実現したいこと
時系列分析をする際、元データを対数差分変換しているのですが、最終的にはもとデータと同じ株価の値に直してグラフを出力したいです。
すなわち、
・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
補足画像

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。