テクニカル指標の一つであるATR(Average True Range)についてです。
TradingViewでのATRと同じ値をPythonコードで実現する方法を紹介します。
ATRについて
外貨FXや仮想通貨FXのトレーディングで参考にされるテクニカル指標の一つ。
簡単に言うと「直近での値動き」を表す指標です。価格の上下に関係なく、値動きが激しい場合はATR値も上がる。
さて、このATR値ですが、TradingViewにて設定すると以下のオプションが表示されます。
そもそもATRはTR(True Range)を特定の日数に遡って平準化(スムージング)させたものです。「特定の日数」は「期間」で指定し、平準化の手法は「RMA/SMA/EMA/WMA」から選択します。デフォルトの平準化手法はRMA(修正移動平均線)です。
Pythonへの移植に苦労する
TradingViewにてPineスクリプトを使用し、ATRを用いたトレーディング戦略を検証した結果、その戦略が有効であると判断したとします。
実際にBotを作って売買の自動化を実現する場合は、PineスクリプトのコードをPythonなどのBotコードに変換する必要があります。
ここで問題が発生します。
Pineスクリプトのテクニカル指標は独自の関数を使っているので、それをPython(などの定形コード)に変換するためには「Pine関数の内部ロジックを把握する必要がある」のです。
これがSMAとかボリンジャーバンドとかだと簡単なのですが、ATRはそもそもスムージングメソッドが4種類あるので、それらのロジックの検証も必要。
更に、Ta-Lib(テクニカル指標の関数が詰まったライブラリ)のATR関数が何か変。TradingViewと違う結果を返してきます。
TradingViewと同じATR値をPythonで算出する方法
TradingViewのバックテストを基にBotを構築するので、TradingViewとPythonの結果で少しでも差異が発生するとバックテストを行った意味が全くなくなるので、ATRを使用したロジックを組む際は切実な問題です。
色々検証を重ねた結果、以下のリンクのコードが正しいと結論づけました。
具体的なコードとしては、以下。
df['TR'] = ta.TRANGE(df) df['ATR'] = df['TR'].ewm(alpha=1 / period).mean()
つまり、TRの算出にはTa-Libを使用します。さらに、TRのスムージングはTa-Libを使わずにPandasのデフォルト関数を使用します。
これでTradingViewでのRMAスムージングメソッドと同等の結果が得られるはずです。他のスムージングメソッドは試していませんが、同じようにPandasのデフォルト関数で表現できるはず。
ちなみに上記でも結果が違うと悩んでる方、検証に使用しているレコード数を確認してください。RMAの方程式の中には「前回のRMA値」が入っています。つまり、使用しているレコード数が少ないほど、結果に差異が出てきます。(ATR算出の期間のことではありません、算出に使用するレコードです)
コメント