Rでチャートを書いてみる(7)

前回でマスターまで取得ができたので、このマスターを用い、全銘柄分のデータを取得することにします。

取得したデータはリレーショナルデータベースへ格納するのが一般的かと思いますので、ここは簡単に扱えるSQLiteに入れることにします。

SQLiteをインストール

MacOSXの場合には以下のコマンドで一発です

brew install sqlite

つぎにRSQLiteパッケージをインストールします

install.packages("RSQLite")

準備が整ったらスクリプトを用意しこれを実行します

(前回までのRFinaiceYJの拡張関数を実行しておくこと)

library(RSQLite)
drv<-dbDriver("SQLite")
con<-dbConnect(drv,dbname="stock.db")
rs<-dbSendQuery(con,"drop table historicalData")
rs<-dbSendQuery(con,"create table historicalData (date text,open real,high real,
	low real,close real,volume real,adj_close real,code text)")
rs<-dbSendQuery(con,"create unique index idx_historicalData on historicalData(code,date)")

stockMaster<-quoteStockMasterTsData()

for(code in stockMaster$code){
	#cat(paste("code=",code,"\n",sep=""))
	data<-quoteStockTsData(code,"2010-01-01")
	data<-transform(data,code=code)
	data$code<-as.character(data$code)
	data$date<-as.character(data$date)
	dbBeginTransaction(con)
	dbSendQuery(con,paste("delete from historicalData where code='",code,"'",sep=""))
	dbSendPreparedQuery(con,"insert into historicalData
		(date,open,high,low,close,volume,adj_close,code)
	 	values(:date, :open, :high, :low, :close, :volume, :adj_close, :code)",bind.data=data)
	dbCommit(con)
}

かなり時間がかかると思いますが無事SQLiteにはいっていることが確認できます

sqlite> select * from historicalData;
2010-01-04|293.0|294.0|290.0|291.0|28100.0|291.0|3076
2010-01-05|293.0|293.0|288.0|288.0|81500.0|288.0|3076
..
2014-08-19|1534.0|1536.0|1505.0|1505.0|22900.0|1505.0|3791
2014-08-20|1505.0|1520.0|1505.0|1516.0|7100.0|1516.0|3791
  • 2014-8-24

もう少し使い勝手よくしてみました

library(RSQLite)

# fromDate: yyyy-MM-dd
getStockHistricalData<-function(stockMaster,fromDate){
	drv<-dbDriver("SQLite")
	con<-dbConnect(drv,dbname="stock.db")
	rs<-dbSendQuery(con,"drop table historicalData")
	rs<-dbSendQuery(con,"create table historicalData (date text,open real,high real,
		low real,close real,volume real,adj_close real,code text)")
	rs<-dbSendQuery(con,"create unique index idx_historicalData on historicalData(code,date)")

	#stockMaster<-quoteStockMasterTsData()

	for(code in stockMaster$code){
		print(paste("code=",code,sep=""))
		tryCatch({
			data<-quoteStockTsData(code,fromDate)
			data<-transform(data,code=code)
			data$code<-as.character(data$code)
			data$date<-as.character(data$date)
			dbBeginTransaction(con)
			dbSendQuery(con,paste("delete from historicalData where code='",code,"'",sep=""))
			dbSendPreparedQuery(con,"insert into historicalData
				(date,open,high,low,close,volume,adj_close,code)
			 	values(:date, :open, :high, :low, :close, :volume, :adj_close, :code)",bind.data=data)
			dbCommit(con)
		},
		error = function(e){
			message(paste("ERROR:",code))
			message(e)
		
		})
	}
}