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