RCI(Rank Correlation Index)を実装したくて、いろいろライブラリーを探したのですが、見つからないのでRubyで自作しました。
価格の重複がなければとても簡単なのですが、重複時の処理が手間取りました。
重複時は、順位を平均化しています。ミソは group_by
を使う所ですかね。
RubyのRCI計算のコード
def calc_rci(ddd)
ddd = ddd.reverse.each.with_index(1).map{|dd,ii| [dd,ii]} # 日時順位付与
ddd = ddd.sort.reverse.each.with_index(1).map{|dd,ii| dd<<ii} # 価格順位付与
hhh = ddd.group_by{|dd| dd[0]} # 重複価格対応
hhh.each{|kk,vv|
if vv.size > 1
rr = vv.transpose[2].sum.to_f/vv.size
vv.each{|v| v[2]=rr}
end
}
ddd = hhh.values.flatten(1)
rci_d = ddd.inject(0){|ss, dd| ss + (dd[1]-dd[2])**2}
((1 - (6.0*rci_d/(ddd.size**3-ddd.size)))*100).round(3)
end
配列を渡せば、結果が返ります。与えた配列の最後の値に対する結果です。
配列の数が n
になります。
使うときは、配列を1つづつずらして calc_rci
を呼べばOKです。
日経225先物miniに対してのRCIグラフ結果例
2019/12/25