前回でマスターまで取得ができたので、このマスターを用い、全銘柄分のデータを取得することにします。
取得したデータはリレーショナルデータベースへ格納するのが一般的かと思いますので、ここは簡単に扱える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) }) } }