statsmodels(Python)を使って株価を時系列解析（１）

### Advanced Python１　時系列解析
時系列解析のPython本って意外と少ないかも知れません。

[時系列解析: 自己回帰型モデル・状態空間モデル・異常検知 (Advanced Python) ](https://www.amazon.co.jp/%E6%99%82%E7%B3%BB%E5%88%97%E8%A7%A3%E6%9E%90-%E8%87%AA%E5%B7%B1%E5%9B%9E%E5%B8%B0%E5%9E%8B%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BB%E7%8A%B6%E6%85%8B%E7%A9%BA%E9%96%93%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BB%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5-Advanced-%E5%B3%B6%E7%94%B0-%E7%9B%B4%E5%B8%8C/dp/4320125010/ref=sr_1_3?keywords=%E6%99%82%E7%B3%BB%E5%88%97%E8%A7%A3%E6%9E%90&qid=1643374017&sr=8-3)

とりあえずこの本を使って、株価の時系列予測をしながら、日経平均株価と友達になりたいと思っています。

### 株価のstatsmodelsによる解析
株価をダウンロードするサイトがなくなってしまって、別の方法を考えないといけないのですが、とりあえず以前落としたデータを使って、まず`statesmodels`を使って、２０２０年のTopixのETF解析をしようと思います。
２０２０年と言えば、３月にコロナで株価大暴落をおこした年です。さて、コロナの大暴落は、時系列解析でどう表れるのでしょうか？


### 傾向変動、季節変動、不規則変動
最初は基本である変動の解析です。
`statsmodels`により、傾向変動と季節変動と不規則変動にわけます。
`python`の`statesmodels`では、`statsmodels.tsa.seasonal.seasonal_decompose`で処理をすると、`.trend`:傾向変動`.seasonal`季節変動`.resid`不規則変動が計算できます。
[`statsmodels`](https://www.statsmodels.org/dev/generated/statsmodels.tsa.seasonal.seasonal_decompose.html)

まず株価データをごちゃごちゃ`datatime`で`index`を作って、`index`を日付にして、終値がデータの`pandas`の`Series`を作成します。

```Python
print(df_end_value.head(3))

#日付
#2020-01-06    1759.0
#2020-01-07    1789.0
#2020-01-08    1765.0
#Name: 終値, dtype: float64

print(df_end_value.dtypes)
#float64

print(df_end_value.index.dtype)
#datetime64[ns]


```
とりあえずこの形にする必要はあるようです。
この形にしてしまえば後は簡単です。
これで`statsmodels.tsa.seasonal.seasonal_decompose`で傾向変動、季節変動、不規則変動が計算できます。
何も設定しなければ、加法モデルで`model='multiplicative'`と設定すると乗法モデルで計算されます。

## 加法モデルと乗法モデル

元のデータを時間tの関数とした時に,

```math
O(t):元のデータ\\
T(t):傾向変動\\
S(t):季節変動\\
I(t):不規則変動\\
\\

加法モデル\\
O(t)=T(t)+S(t)+I(t)\\


乗法モデル\\
O(t)=T(t)*S(t)*I(t)
```


スクリプトは次のようになります。 `freq=25`のところの数値が移動平均の日数になります

```Python
#import
import statsmodels.api as sm


#加法モデルのインスタンス作成
ts = sm.tsa.seasonal_decompose(df_end_value.values, freq=25)

# 原系列
df_end_value.plot()


# トレンド
plt.plot(df_end_value.index,ts.trend)
plt.xticks(rotation =45)
# 季節変動
plt.plot(df_end_value.index,ts.seasonal)
plt.xticks(rotation =45)
# 不規則変動
plt.plot(df_end_value.index,ts.resid)
plt.xticks(rotation =45)

#乗法モデルのインスタンス作成
ts_mult = sm.tsa.seasonal_decompose(df_end_value.values, freq=25,  model='multiplicative')

# トレンド
plt.plot(df_end_value.index,ts_mult.trend)
plt.xticks(rotation =45)
# 季節変動
plt.plot(df_end_value.index,ts_mult.seasonal)
plt.xticks(rotation =45)
# 不規則変動
plt.plot(df_end_value.index,ts_mult.resid)
plt.xticks(rotation =45)

```
## 傾向別のグラフを見てみよう。
#### 元のデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/ef5df8f8-7716-1089-8920-c6bff6fdab97.png)


２０２０年３月はコロナで株の大暴落をした月です。これが、成分をわけた時にどうなるか見てみましょう。

#### トレンド（２５日平均線です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/76e08045-0a19-200d-3f10-2d763264afed.png)

滑らかな線になっています。

#### 季節変動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/4989d734-5a0f-1d65-dc3c-4a9db3b3cde4.png)

なんと１年（前後は抜けるので１１カ月）のうちで１０回の同じパターンで、上下しています。こんなパターンが見つけることができるとは。。。

#### ノイズ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/ffec83b5-0f98-995b-f507-d755bb383151.png)

季節変動を見つけることが出来ましたが、ノイズが大きすぎます。特にコロナで落ち込んだところが、当たり前ですが大きなノイズになっています。

乗法モデルも計算したけど、加法モデルと同様の結果になりました。

今回はここまで。
次回は、[乖離率を使った株価解析での儲け方](https://qiita.com/motoyuki1963/items/e6284ce43dcc3433477e)を考えます。