そもそも、真の値幅の平均(ATR)って何?
ググる。
http://104m.jp/analysis/第4章 テクニカル分析実践-:atr/
「真の値幅」とは、「窓」が発生した場合も考慮した値幅のことです。
真の値幅 = 真の高値 - 真の安値
真の高値 = 当日の高値か、前日の終値のどちらか高い方
真の安値 = 当日の安値か、前日の終値のどちらか安い方
この真の値幅の移動平均がATRだそうです。
ATRは算出期間中の価格変動の大きさ(ボラティリティ)の目安ですので、ATRが大きいとボラティリティが大きいことを意味し、ATRが小さいとボラティリティが小さいことを意味します。
だそうです。
値が大きいほど、急な値動きってことは直感的に分かります。
ATRの3倍を手仕舞い目安として使う例が示されてます。
では、コードの方を見ます。
lib/indicator/average_true_range.rb
pricesは日付、始値、高値、安値、終値、出来高のマップの配列。
二日分のマップを順次取り出して、前日終値、当日高値、当日安値から、
真の値幅を計算し、新しい配列に順次詰めてゆきます。
これで、真の値幅の配列が出来、
配列から移動平均の配列を生成するようArrayは拡張されてますから、
最後にその機能を使って、真の値幅の移動平均の配列を返します。
順番に追ってゆけば、特別ひねったことはしていない。
強いて言えば、
prices.first[:close]
firstで2つのうち前を取り出し、それがマップなのでキーの終値を渡す。
という作業を非常にRubyらしく、省略して書いてるところ。
とか、
[previous_close, current_high].max
大小比較をするのに、要素2つの配列を作って、max,minのメソッドを利用。
(previous_close > current_high) ? previous_close : current_high
って、書くより短いかな。。
変数の名前が長いだけで、(c > h) ? c : h って変数にすれば短いよね。
毎回配列生成するより処理早い気もするが、
その方が書き方がキレイという判断なのだろう。
兎にも角にも、これでインジケータの実装は揃った。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。