以下の前回の続きです。
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パーセントを超えると異常値だと言われているので、この結果からもドル円が如何に異次元な動きをしていたのかというのが分かります。