statsmodelsのトレンド解析と乖離率を使った株の儲け方：株価を時系列解析（２）

##  移動平均乖離率を使って投資できるか？

[時系列解析: 自己回帰型モデル・状態空間モデル・異常検知 (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)
の1.8章は移動平均乖離率です。
Ｐ１８に
「乖離率とチャートの関係性を観察し乖離率の閾値を決めることで変化点の検出に役立てることができる。」
とあります。
これは株価の解析に使えるかも知れません。

## 移動平均乖離率とは

移動平均乖離率は、次の式で表されます。

```math

移動平均乖離率　=　\frac{（原系列の値－移動平均値）}{移動平均値} ×100

```
これは、rollingを使えば簡単にできます。
まず`df_end_value`に、`index``として年月日を`Datetime`で、値として終値を入れました。

```Python
#日付
#2020-01-06    1759.0
#2020-01-07    1789.0
#2020-01-08    1765.0
#2020-01-09    1794.0
#2020-01-10    1800.0
#Name: 終値, dtype: float64


```

このデータを使って、移動平均の計算方法は、

```python
#rollingで移動させて、meanで平均を取る。
ma24 = df_end_value.rolling(24).mean()
#原系列のデータから移動平均値を引いて、移動平均値で割ります
diff_ma24 = (df_end_value - ma24) / ma24 * 100
#これはグラフ
plt.plot(df_end_value.index,ma24,c='r',label='price_average')
plt.plot(df_end_value.index,df_end_value,c='b',label='price_real')
plt.ylabel('topix_price',fontsize=16)
plt.xticks(rotation=45)
plt.legend()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/d7e9c949-9c74-018c-7e40-89fda80d5f90.png)





これが移動平均ですが、これでなくても、前回説明した`statsmodesl`の`trend`で、同じようなトレンド成分が計算できますので、これで計算してみましょう。


```Python
#statsmodelsのインポート
import statsmodels.api as sm

#２５日間周期で加法モデルで時系列解析を行う
ts = sm.tsa.seasonal_decompose(df_end_value, freq=25,model='additive')

#frq25なので前後の値を削除して、乖離率を計算に、
res = (df_end_value.values.flatten()[12:-12] - ts.trend[12:-12])/ts.trend[12:-12] * 100


plt.plot(df_end_value.index,ts.trend,c='r',label='price_trend')
plt.plot(df_end_value.index,df_end_value,c='b',label='price_real')
plt.ylabel('topix_price',fontsize=16)
plt.xticks(rotation=45)
plt.legend()
plt.show()

plt.hist(res)
plt.xlabel('乖離率',fontsize=16)
plt.ylabel('頻度',fontsize=16)
plt.show()
plt.plot(df_end_value.index[12:-12],res)
plt.xticks(rotation =45)
plt.ylabel('乖離率',fontsize=16)
plt.show()
```
計算自体は簡単です。
ざっと傾向を見てみましょう！！

## ２０年の解析
結果の解析結果です。
一番上のグラフが移動平均線。真ん中が、乖離率のヒストグラム、一番下が乖離率の時系列です。
コロナで大きく落ちて、２０年３月の大きく乖離したところがありますが、それ以外は、だいたいプラスもマイナスも３％近辺で反転しています。
この計算で乖離率が３％近くなったら、逆張りすれば価格はトレンド線へ戻ろうとしますので、利益が出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/b49a466e-7d01-9f5c-929d-7ff1e0fb264a.png)

では他の年は？

## １９年の解析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/87d452f2-1f6e-615c-422d-d03442136a78.png)

１９年だと２％くらいのあたりで反転しています。

## １８年の解析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/01425743-87a2-55e9-1700-fef578af2f75.png)

１８年は乖離率が若干大きくて３％から４％で反転しています。もう忘れてしまっていますが、１８年も大きく株価が下落した年でした。

## １７年の解析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/375a1f6c-3618-43e9-57aa-d4747440a935.png)

１７年は、１％程度で半単しているところが多くなります。

毎年微妙に乖離率が異なります。このあたりは経済状況とか、他の要因が効いていると思われるので、時系列解析だけでは、乖離率何％が良いのかは少し無理があるかもしれません。他の予測で閾値を決められるかは考えたいと思います。まぁ、今はだいたい２~３％で逆張りで大丈夫そうです。

逆張り投資はこれで可能かもしれません。

### 　　　逆張り投資で大儲け！！


次回は、株価に自己相関・定常性があるか検定を行っていきたいと思います。こちらは順張り投資で儲けられるかの検討です。