「日本株式日次リターンデータ」を月次リターンに変換する

Rubyの勉強をしていて、無性に Array#reduce が使いたくなったので、 日経メディアマーケティング株式会社が販売している「日本株式日次リターンデータ」を月次リターンに変換するスクリプトを書いてみました。

標準入力からデータを読み込んで、日経会社コード別の月次リターンと売買高を計算します。毎日の日次リターンを単純に集計しているだけの単純なスクリプトです。

# -*- coding: utf-8 -*-
#
# 標準入力から NPM データを読み込み、
# 月次収益率と月間取引量を表示する
# 日経会社コードを集計の基準にする

ret_vol = Hash.new{|hash,key| hash[key]=[]}
prev_nkcode = "0000000"

def print_monthly_returns(ret_vol,nkcode)
  ret_vol.keys.sort.each{|date|
    retvol = ret_vol[date].transpose
    returns = (retvol[0].map{|x| 1 + x/100.0}.reduce(1,:*)-1)*100
    volume = retvol[1].reduce(0,:+)
    printf("%s,%s,%.2f,%d\n",nkcode,date,returns,volume)
  }
end

while line=gets do
  line.chomp!
  nkcode, date, ret, vol = line.split.values_at(0,1,20,22)
  ret = ret.to_f
  vol = vol.to_i
  date = date[0,6]
  
  if(nkcode != prev_nkcode) 
    print_monthly_returns(ret_vol,prev_nkcode)
    ret_vol = Hash.new{|hash,key| hash[key]=[]}
    prev_nkcode = nkcode
  else
    ret_vol[date] << [ret,vol]
  end
end
print_monthly_returns(ret_vol,prev_nkcode)