pandasで移動平均乖離率を求める

以下の前回の続きです。

csvファイルをpandasに取り込む - goodbyegangsterのブログ

取り込んだドル円日足データをもとに、25日単純移動平均の乖離率を求めたいと思います。pandasけっこう便利なんで驚きました。

初めに、csvファイルをpandasに取り込みます。

>>> import pandas
>>> df = pandas.read_csv("./USDJPY.csv")

作成したデータフレームに、計算結果のカラムを新規で追加してあげます。右辺が計算式ですね。

>>> df['25日移動平均'] = df['終値'].rolling(window=25).mean()
>>> df['乖離率'] = (df['終値'] - df['25日移動平均']) / df['25日移動平均'] * 100

移動平均を求める際には、「rolling」と「mean」という関数を利用します。実行したい処理内容でググったり、公式マニュアル内をさまよっていると、期待する関数はあっさり見つかります。

pandas.DataFrame.rolling — pandas 0.19.1 documentation

編集したデータフレームを見ると、カラムが追加されていることを確認できます。25日以前は、必要なデータ数が不足しているので、NaN(Not a Number)となってます。

>>> df
              日付      始値      高値      安値      終値   25日移動平均       乖離率
0     2007/04/02  117.84  118.08  117.46  117.84       NaN       NaN
1     2007/04/03  117.84  118.98  117.72  118.96       NaN       NaN
2     2007/04/04  118.92  119.08  118.56  118.72       NaN       NaN
3     2007/04/05  118.72  118.99  118.44  118.72       NaN       NaN
4     2007/04/06  118.72  119.39  118.67  119.27       NaN       NaN
5     2007/04/09  119.28  119.39  119.19  119.33       NaN       NaN
6     2007/04/10  119.34  119.37  118.77  119.06       NaN       NaN
7     2007/04/11  119.06  119.55  118.88  119.38       NaN       NaN
8     2007/04/12  119.38  119.52  118.81  119.16       NaN       NaN
9     2007/04/13  119.16  119.57  118.22  119.22       NaN       NaN
10    2007/04/16  119.21  119.86  118.98  119.74       NaN       NaN
11    2007/04/17  119.75  119.82  118.83  118.91       NaN       NaN
12    2007/04/18  118.90  119.03  118.11  118.69       NaN       NaN
13    2007/04/19  118.66  118.66  117.61  118.47       NaN       NaN
14    2007/04/20  118.47  118.97  118.26  118.69       NaN       NaN
15    2007/04/23  118.67  119.03  118.23  118.64       NaN       NaN
16    2007/04/24  118.66  118.94  118.25  118.59       NaN       NaN
17    2007/04/25  118.59  118.84  118.28  118.74       NaN       NaN
18    2007/04/26  118.71  119.66  118.54  119.56       NaN       NaN
19    2007/04/27  119.56  119.76  118.88  119.61       NaN       NaN
20    2007/04/30  119.60  119.75  119.18  119.52       NaN       NaN
21    2007/05/01  119.47  119.86  119.08  119.86       NaN       NaN
22    2007/05/02  119.86  120.28  119.57  120.16       NaN       NaN
23    2007/05/03  120.15  120.46  119.97  120.43       NaN       NaN
24    2007/05/04  120.44  120.47  119.91  120.17  119.1776  0.832707
25    2007/05/07  120.16  120.19  119.80  120.10  119.2680  0.697589
26    2007/05/08  120.09  120.13  119.53  120.03  119.3108  0.602795
27    2007/05/09  120.03  120.14  119.64  120.09  119.3656  0.606875
(以下略)

さらに、乖離率が指定パーセント以上超過している日のみを抽出したい場合、比較処理を用いて取得できます。以下では、5パーセント超過しているものを抽出してきています。

>>> df.query('乖離率 >= 5 | 乖離率 <= -5').loc[:,['日付','終値','25日移動平均','乖離率']]
              日付      終値   25日移動平均       乖離率
247   2008/03/14   99.34  105.2592 -5.623451
248   2008/03/17   97.34  104.8740 -7.183859
395   2008/10/08   99.14  105.5424 -6.066188
396   2008/10/09   99.83  105.2524 -5.151807
405   2008/10/22   97.66  103.1348 -5.308393
406   2008/10/23   97.33  102.8104 -5.330589
407   2008/10/24   94.64  102.3052 -7.492483
408   2008/10/27   92.78  101.7964 -8.857288
444   2008/12/16   89.04   94.1000 -5.377258
445   2008/12/17   87.25   93.7892 -6.972231
492   2009/02/24   96.64   91.1476  6.025831
493   2009/02/25   97.40   91.4644  6.489519
494   2009/02/26   98.52   91.8488  7.263241
495   2009/02/27   97.59   92.1988  5.847365
496   2009/03/02   97.41   92.5316  5.272145
497   2009/03/03   98.30   92.9048  5.807235
498   2009/03/04   99.07   93.2552  6.235363
1612  2013/06/14   94.18  100.0652 -5.881365
1613  2013/06/17   94.47   99.7720 -5.314116
1972  2014/11/03  114.02  108.3068  5.275015
1974  2014/11/05  114.65  108.6956  5.478051
1975  2014/11/06  115.16  108.9660  5.684342
1978  2014/11/11  115.77  109.7120  5.521730
1981  2014/11/14  116.27  110.6680  5.061987
1984  2014/11/19  117.95  111.9304  5.377985
1985  2014/11/20  118.21  112.4064  5.163051
2504  2016/11/18  110.89  105.4644  5.144485
2507  2016/11/23  112.52  106.3964  5.755458
2508  2016/11/24  113.33  106.7720  6.142060
2509  2016/11/25  113.07  107.1424  5.532450
2512  2016/11/30  114.49  108.1796  5.833262
2513  2016/12/01  114.11  108.5328  5.138723

トランプ大統領誕生以降で、連日超過していますね。乖離率は4パーセントを超えると異常値だと言われているので、この結果からもドル円が如何に異次元な動きをしていたのかというのが分かります。