Python PandasでATR(Average True Range)を計算する方法

ATR(Average True Range)とは何か?

文章で説明してもなかなかわかりづらいので、実際に計算するプログラムで確認していきましょう。

案外プログラムで実際に見てみると理解しやすかったりします。

プログラミングからみるATR

株式やFXなどの時系列データは5分足や4時間足など各期間での始値(Open), 高値(High), 安値(Low), 終値(Close), ボリューム(Volume)からなるOHLCVという表フォーマットで表されます。

例えば、2013年1月2日〜2013年1月7日のドル円の日足OHLCVデータです。

こういったOHLCVからATRを計算します。

OHLCVデータからATR(Average True Range)を計算するプログラム

具体的なプログラムは以下です。

h, l, c_prev = data.High, data.Low, pd.Series(data.Close).shift(1)
tr = np.max([h - l, (c_prev - h).abs(), (c_prev - l).abs()], axis=0)
atr = pd.Series(tr).rolling(periods).mean().bfill().values

1行1行ずつ見ていきます。

h, l, c_prev = data.High, data.Low, pd.Series(data.Close).shift(1) について

data には、上で紹介したOHLCVのDataFrameが入っています。

そのOHLCVデータから h(High), l(Low), c_prev(前日のClose)の列をとってきます。

shift(1)は

[1, 2, 3, 4, 5] のようなSeriesデータを

[NaN, 1, 2, 3, 4]のようにずらします。

tr = np.max([h - l, (c_prev - h).abs(), (c_prev - l).abs()], axis=0) について

  • High - Low
  • (前日のClose - High)の絶対値
  • (前日のClose - Low)の絶対値

のうちで最も大きい値をその日のTR(True Range)とします。

atr = pd.Series(tr).rolling(periods).mean().bfill().valuesについて

True RangeのSeriesデータをperiods(期間)でローリングして平均をとります。

.bfill()は欠損値NaNを次の隣のデータで埋めます。

>>> b
0 NaN
1 1.0
2 2.0
3 3.0
4 4.0
dtype: float64
>>> b.bfill()
0 1.0
1 1.0
2 2.0
3 3.0
4 4.0
dtype: float64

.valuesでpandas.Seriesのかわりにarrayを返します。

つまりATR(Average True Range)はTR(True Range)のperiods分のデータ足の移動平均をとっています。

コメント