前回、ようやく配列を拡張して移動平均線を実現出来るようになった。
機能は単純で限定的に見えるが、さにあらず、
意外と応用が効くものである。
坂本タクマ先生、
当然の如く実装後にテストをちゃんとするのだが、
単純な動作検証に終わらないところが、エラい。
移動平均や、区間高値、安値の基本をチェックした後、
map_indicatorを使って、「何か計算」のバリエーションを試す。
高値と安値の中間は簡単。
前日との増減は、以下のコードで実現できる。
ワタクシは盲点だった、区間を2として引くだけだった。
array.map_indicator(2) do |vals|
vals.last – vals.first
end
区間の増減の平均は思いつくかな。
それから、ちょっと複雑な指数移動平均を実装している。
1.αというものを求める。α=2/(n+1)である。
2.最初(1日目)の指数移動平均は、普通の平均値である。
3.2日目以降は、前日の指数移動平均にα×(当日の値-前日の指数移動平均)を加えたものになる。
そういう理屈だそうで、それをそのまま実装している。
なかなか応用範囲が広いことが分かる。
試しに、ボリンジャーバンドで使う標準偏差を3日区間で出してみた。
以下のコードをarray_check.rbに追加。
sd_array = array.map_indicator(3) do |vals|
m = vals.average
v = vals.inject { |a,b| a + (b – m) ** 2 } / (vals.size – 1)
Math.sqrt(v)
end
p sd_array
おお、何かそれらしく動いている。
簡単な仕組みだけど、応用が様々に効く。
頼もしい武器を手に入れたみたい。
自作も自由が効いて悪くないのではないか。
また、
プログラミングが好きで、Rubyに慣れてるなら、
Rubyという選択も良いかもしれない。
分かりやすい言語ではないと思うが、簡潔に自由に書けるからね。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。