« 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 |

Comments

*
画像に書かれた文字を入力してください

スパム対策用画像
ログインすると画像認証なしで投稿できます

ホットワード 株価 padding margin 統計 処理
割引クーポンまとめ情報 - クー割