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分のデータ足の移動平均をとっています。
コメント
ATRを利用した順張りスイングトレードで仮想通貨のBOTを作ってGMOで運用していますがあまり利益が出ていません。ML(Machine Learning), DL(Deep Learning)なども試しましたが期待したほど結果が出ていません。richmanbtcさんのようになるのは難しいですね!
私のサイトです:
https://money-or-ikigai.com/