« 田端・尾久 鉄道ウォッチング 2 | Home | 列車で日本縦断の旅 (4泊5日) »

Rで株価をクラスター分析

By kmgs | 12 月 25, 2008


直近50取引日の株価をYahooから取得し、クラスター分析するRコードを書いてみました。TOPIX core30だと、こんな感じ。

まずはTOPIX core30銘柄を入手(pdf)。テキストのみコピーして、サクラエディタ等で半角スペースをタブ('\t')に変換して"core30.txt"として保存。こんなデータを想定しています。

No.	コード	銘柄名
1	9999	日本xxx産業
...

次はRのソース。これを"kabu_cluster.r"として、上記の"core30.txt"と同じディレクトリに保存します。対数変換の後、銘柄ごとに平均(ここでは幾何平均)を差し引きます。赤は銘柄ごとの平均より上、緑は平均以下であることを示しています。
# kabu_cluster.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,]
}

core30 <- function() {
	a <- read.delim("core30.txt", as.is=T)
	l <- list()
	str <- paste(a[,2], a[,3])
	for (i in 1:nrow(a)) {
		print(str[i])
		l[[str[i]]] <- kabu(a[i,2])
		Sys.sleep(1)
	}
	l
}

plot_list <- function(l) {
	# 2009/01/11 終値から調整後終値に
	mat <- log2(sapply(l, function(X) X[,7]))
	mat <- sweep(mat, 2, colMeans(mat))

	rownames(mat) <- as.character(l[[1]][,1])
	heatmap(mat, scale="none", mar=c(15,4), Rowv=NA, zlim=c(-1, 1), col=c(rgb(0,100:0/100,0), rgb(1:100/100,0,0)))
}

これを実行すると、株価のクラスタリングを行って冒頭のヒートマップを作成します。
> source("kabu_cluster.r")
> l <- core30()
> plot_list(l)
図からは意図的に銘柄は抜いてありますが、実際に上記コードを実行した結果には銘柄が表示されてます。左の安定したクラスターには製薬/インフラ/通信系の企業があります。

この絵を見ても、私には何を買うべきか、分かりません...。あまり素人が手を出すべき相場でないことだけは、なんとなく分かっていますが。

[改訂履歴]
2009/01/11: 使用する株価を、終値から調整後終値に変更 (株式分割の影響回避)

Topics: R |

Comments

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

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

ホットワード 株価 クラスター分析 padding margin 統計
割引クーポンまとめ情報 - クー割