« 田端・尾久 鉄道ウォッチング 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 |
