読者です 読者をやめる 読者になる 読者になる

そろそろRの本当の力を見せておくか

R Ruby

「RってTwitterで遊ぶためのものなのか」とか思われるとあれなので、ちょいまじめネタで行くことにします。「株価データの収集、基本的なデータの解析、株価の予想モデルの作成まで全部Rでできちゃうよ」編です*1

とりあえず、株価データの収集をしてくる関数から。infoseekのファイナンスのところから取ってきてます。

finance <- function(site){
  ruby <- paste("
#!/usr/bin/ruby -Ke
# -*- coding: utf-8 -*-

require %q[rubygems]
require %q[mechanize]
require %q[kconv]

finance = \"",site,"\"

agent = WWW::Mechanize.new
agent.max_history = 1
page = agent.get(finance)

source = Hpricot(agent.get_file(finance))

day = []
(source/%q[tbody>tr>th]).each{ |item|
  day.push item.inner_text
}

price = []
(source/%q[tbody>tr>td.emph]).each{ |item|
  price.push item.inner_text.gsub(/,/,%q[])
}

finance = [day,price].transpose
finance.each{|item|
  puts %[#{item[0].toutf8}\t#{item[1]}]
}
",sep="")
  return(read.table(textConnection(system(paste("echo '",ruby,"'"," | ruby ",sep=""),intern=TRUE),"r")))
}

で、こんな感じで株価データを取ってきます。ちなみに任天堂のデータ。基本統計量とかplotとかもRなのでお手のもの。

> f <- finance('http://money.www.infoseek.co.jp/MnStock/slast.html?qt=7974.t&sy=2008&sm=1&sd=1&ey=2008&em=7&ed=2&k=d')
> head(f)
              V1    V2
1 2008070160000
2 2008063059400
3 2008062760600
4 2008062662800
5 2008062561300
6 2008062460600
> summary(f[,2])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  55300   57600   58250   58470   59380   62800 
> plot(rev(f[,2]),pch=10,type="l",main="終値の推移",lwd=4,cex=2,lty=1,col=2)


で、Rは統計modelとか楽勝にできちゃうので、時系列modelを作成して、株価の予想modelとかも簡単にできちゃうわけです。95%信頼区間とかも簡単に出せちゃう。今回は時系列の基本的なarimaモデルといわれるものを使用しました。

fit <- arima(rev(f[,2]),order = c(1,1,0))
fit <- predict(fit, n.ahead = 10)
SE1 <- fit$pred+2*fit$se
SE2 <- fit$pred-2*fit$se
ts.plot(as.ts(rev(f[,2])),fit$pred,SE1,SE2,gpars=list(lty=c(1,2,3,3),col=c(1,2,4,4)))
legend(locator(1),c("実測値","予測値","2*SE"),lty=c(1,2,3),col=c(1,2,4))


まあ、簡単なmodelなので当てにはなりませんが、色々遊びがいがあるんじゃないかと思います。

例えば

毎日株価の収集のbotを走らせているyukinobuさんだったら、plot、分析などがexcelとかをかまさずにできるとしたら、それは結構うれしいんじゃないかなと思います。関数とかも圧倒的にRのほうが多いし、信頼できるし。

という感じで、Rの活用の仕方はたくさんあるよ、と例でした!!

*1:一部Ruby混在