小桜町喫茶店

日常とか仕事とかプログラミングとか

投資とプログラミング〜Rubyで移動平均を求める

中国市場が大暴落して、ダウや日経平均までエライことになっている。
市場は阿鼻叫喚だが、売りポジションの人は笑いが止まらないだろう。
金融や投資に携わったことのない人には何を言っているのかわからないと
思うが、金融マンや投資家にとって、実は価格は上がっても下がっても、
動いてさえいればどっちでも良いのだ。

ところでテクニカル分析に基づいたシステムトレードを行う個人投資家
中には自分でマクロを組んでいる人も多い。
私も自分用だけでなく、知り合いの個人投資家用にプログラムを組んで
あげたことがある。
金融の業務システムでさすがにスクリプト言語は使えないが、個人用途
ならばむしろRubyの恩恵を受けられる。

例えばここ数日の日経平均終値で3日間の移動平均を求めてみる。
ちなみに、移動平均とは特定期間(この場合は3日間)の価格(終値を使う
場合が多い)の平均値だ。現在の価格が平均値とどのくらい乖離しているかを
判断する時に用いる基本中の基本の指標だ。

# 直近10日間の終値
prices = [20706.15, 20109.95, 20235.73, 20329.32, 20522.5, 
              20539.79, 20112.12, 20376.59, 19737.64, 19855.5]
 
# 期間
term = 3
 
prices.each_cons(term) do |arr|
  puts arr.inject(:+) / term.to_f
end

Enumerableのeach_consは取り出した要素の配列を作る。
3日間を指定しているので、3日分の終値の配列が出来上がる。
まさに移動平均線を作るために存在するようなメソッドだが、
他に用途があるのだろうか?
後はinjectメソッドで要素を合計し、期間で割るだけだ。

実行してみると。

20350.61
20225.0
20362.516666666666
20463.87
20391.47
20342.833333333332
20075.45
19989.91

8日分の移動平均しかないが、3日移動平均なので3日分の価格データが
ないと正しい値が作れない。最初の2日分は削られているのだ。
本日の終値が19,855.5円だが、移動平均と合わせてどのような判断が
できるだろうか。その判断が各投資家のセンスやスキル、経験によって
異なるところが面白さだ。
実際には3日間といった超短期の移動平均を使っている投資家は少ない
だろうし、他のインジケータと組み合わせてシステムを組む。

まぁ何が言いたかったかというと、「金融や投資は虚業」などと毛嫌い
したり、「プログラミングは難しそう」と決めつけないで、投資も
プログラミングも奥が深く、実際にやってみると面白いということだ。