金融魔法少女の病室

数学が難しすぎてハトニーちゃん病気になっちゃったよ。見舞いに来いよ。

銘柄情報のデータセットを作ろう友の会 with R

全上場企業の社名、コード、業種、市場区分なんかの情報が載ったデータセットがあると色々と作業が捗るよな。

例えば、卸売業の銘柄コードだけ使って分析したいだとか、ストックピッキングする際に5つ以上同じ業種の銘柄をポートフォリオに入れないっていう制約を入れたりだとか、レポートとして提出する際に何の銘柄が入っているか分かりやすいようにコードから社名に変換したりだとか…

ともかく便利ぽよ!

んで、銘柄情報は東証 : 東証上場銘柄一覧でxlsの形式で公開されている。ここの情報を使うのが一番信用できると思うのだけれど、毎月情報が更新する度ファイル名が変わってしまうからちょっと厄介だ。プログラムにurlをベタ書きしてしまうと毎月手作業でurlを修正する作業を行わなくてはならなくなってしまう。

ってことで、東証のサイトからxlsだけ引っこ抜いてurlの名前が動的に変わるプログラム書けば良くね?って思ってプログラム書いたから晒すぽよ~

library(XML)
library(gregmisc)

#東証のhtmlからxlsだけ削り取る#####################################################################
toushou.url     <- "http://www.tse.or.jp/market/data/listed_companies/"
doc 		<- htmlParse(toushou.url)
links 		<- xpathSApply(doc, "//a/@href")
xls 		<- grep("/market.+.xls", links)
market.url      <- paste("http://www.tse.or.jp",links[xls],sep="")
#市場の名前も取得###############################################################################
temp1 		<- xpathSApply(doc, "//table[@class='styleShiryo']/tr/td[not(@class='center')]")
temp2 		<- NULL
for(i in 1:length(temp1)) temp2[i] <- as(temp1[[i]], "character")
mkt.namae       <- gsub("(<td>|</td>| )", "", temp2)
#データを取得し縦結合############################################################################
t1.data 	<- read.xls(market.url[1], header=T, fileEncoding="UTF-8")
t1.data[, ncol(t1.data)+1]        <- mkt.namae[1]
colnames(t1.data)[ncol(t1.data)]  <- "市場"
mkt.data 		          <- t1.data

for(i in 2:length(mkt.namae) ){
	temp1	<- read.xls(market.url[i], header=T, fileEncoding="UTF-8")
	temp1[, (ncol(temp1)+1):ncol(t1.data)] 	 <- "ないぽよ"
	temp1[, ncol(t1.data)] 			 <- mkt.namae[i]
	colnames(temp1) 			 <- colnames(t1.data)
	mkt.data<- rbind(mkt.data, temp1)
}
#使用例########################################################################################
all.mkt.codes <- mkt.data$コード #すべてのコードが欲しい場合
mothers.codes <- mkt.data[mkt.data$市場 == "マザーズ(内国株)" , "コード"] #マザーズのコードが欲しい場合
oroshi.codes  <- mkt.data[mkt.data$X33業種区分 == "卸売業" , "コード"] #卸売業のコードが欲しい場合

#コードから銘柄情報を検索することもできる
temp.codes    <- c(6670, 9501, 3800, 6085)
mkt.data[match(temp.codes, mkt.data$コード) , ]

enjoy!