« MicroArray Challenge ヒント2が出た | Home | Rで並列処理 (snowライブラリ) »
Rで株価データを取得
By kmgs | 11 月 26, 2008
またまたマイコンとは関連のない話題ですが。
ちょっと調べ物をしていたら、RからRubyを噛ませて株価を取得するようなコードサンプルを見つけました。Rubyは今まで10行くらいしか書いたことがないので良く分からないのですが(まだPythonの方が経験があるくらい)、R単品でも似たようなことは出来ると思い、ちょっと書いてみました。ローソク足を書くサンプルつきです。株取引はやったことがないので、間違いがあるかもしれません。何卒ご留意を。
まずRのソース(kabu.r)。
# kabu.r
# 例:
# x <- kabu("7203.t")
kabu <- function(code) {
# HTMLの取得
u <- url(paste("http://table.yahoo.co.jp/t?s=", code, "&g=d", sep=""), enc="EUC-JP")
a <- read.delim(u, as.is=T)
# 株価データらしき部分を抽出して整形、yahoo側の仕様変更があると使えなくなるかも?
sel <- a[grep("<t[dh]><small>(<b>)?[0-9]+(</b>)?", a[,1]),1]
sel <- gsub("<[^>]+>", "", sel)
sel <- gsub("[年月]", "-", sel)
sel <- gsub("[日,]", "", sel)
# 行列に整形、適宜データ型を揃える
mat <- matrix(sel, length(sel)/7, 7, by=T)
nums <- matrix(as.numeric(mat[,-1]), nrow(mat), ncol(mat)-1)
dat <- data.frame(as.Date(mat[,1]), nums)
colnames(dat) <- c("date", "open", "high", "low", "close", "volume", "adj_close")
# 日付順をひっくり返してリターン
dat[nrow(dat):1,]
}
ros <- function(x, logged=F) {
# 休日を飛ばしたローソク足
op <- par(mar=c(7,3,3,2))
on.exit(par(op))
# ローソクの太さ
b <- 0.3
# 描画領域の初期化
plot(
c(x[1,1], x[nrow(x),1]), c(min(x[,2:5]), max(x[,2:5])),
ty="n", log=ifelse(logged, "y", ""), xaxt="n",
xlab="", ylab=""
)
# x軸
xat <- axTicks(1)
axis(1, xat, as.Date(xat, origin="1970-01-01"), las=2)
# ローソク足
for (i in 1:nrow(x)) {
points(c(x[i,1], x[i,1]), c(x[i,3], x[i,4]), ty="l")
rect(x[i,1]-b, x[i,2], x[i,1]+b, x[i,5], col=ifelse(x[i,2]>x[i,5], "black", "white"))
}
}
ros2 <- function(x, logged=F) {
# 休日をそのまま扱ったローソク足
op <- par(mar=c(7,3,3,2))
on.exit(par(op))
# ローソクの太さ
b <- 0.3
# 描画領域の初期化
plot(
c(1, nrow(x)), c(min(x[,2:5]), max(x[,2:5])),
ty="n", log=ifelse(logged, "y", ""), xaxt="n",
xlab="", ylab=""
)
# x軸
xat <- axTicks(1)
axis(1, xat+1, x[xat+1,1], las=2)
# ローソク足
for (i in 1:nrow(x)) {
points(c(i, i), c(x[i,3], x[i,4]), ty="l")
rect(i-b, x[i,2], i+b, x[i,5], col=ifelse(x[i,2]>x[i,5], "black", "white"))
}
}これを読み込んで実行。念のためですが、特定の銘柄を推奨するものではありません。
> source("kabu.r")
> x <- kabu("7203.t") # トヨタ自動車、最近の50取引日
> dim(x)
[1] 50 7
> ros(x)
> ros2(x)取得したデータのプロットは著作権的にヤバイので、以下の図はそれっぽく適当に作成したものです。
RにはfTradingなんてパッケージがあるようなので、そのうちいじってみたいと思います。
Topics: R |

