読者です 読者をやめる 読者になる 読者になる

Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

R入門その2(最終回)

そもそも、なぜ R をやりはじめたかというと株の歩み値データから 1分足チャートを書きたかったのだった。そんなわけで、自分のやりたい事をひたすら調べながらトライアンドエラーでコードを書いているのでブログの内容がぜんぜん入門な感じじゃない上、出来たコードは未熟だろうけど、まぁ自分向け備忘録ということでひとつ。

やりたかったこと

こんな感じ↓のSBI証券からダウンロードできる歩み値データの CSV ファイルを読み込んで

日付,時間,出来高,約定値
20120104,1500,          11000,        202
20120104,1459,           1000,        202
20120104,1459,           1000,        202
20120104,1459,           1000,        201
20120104,1459,           1000,        202
20120104,1458,          10000,        202
20120104,1458,           1000,        201
20120104,1452,          10000,        201
20120104,1451,           1000,        201
20120104,1451,           1000,        200

歩み値をこんな感じ↓の4本足データに変換して

                    Open High Low Close Volume Adjusted
2012-01-04 09:00:00  195  196 193   193 119000      193
2012-01-04 09:01:00  195  195 195   195  12000      195
2012-01-04 09:02:00  195  195 195   195   4000      195
2012-01-04 09:04:00  196  196 195   195  30000      195
2012-01-04 09:09:00  195  195 195   195   1000      195
2012-01-04 09:17:00  195  195 194   194  22000      194

任意の日付の日中足チャートを書きたかったのであった。

出来たもの

コード
library(quantmod)

ohlc <- function(ttime,tprice,tvolume,fmt) {
    ttime.int <- format(ttime,fmt)
    data.frame(
    time = ttime[tapply(1:length(ttime),ttime.int,function(x) {head(x,1)})],
    Open = tapply(tprice,ttime.int,function(x) {head(x,1)}), 
    High = tapply(tprice,ttime.int,max),
    Low = tapply(tprice,ttime.int,min),
    Close = tapply(tprice,ttime.int,function(x) {tail(x,1)}),
    Volume = tapply(tvolume,ttime.int,function(x) {sum(x)}),
    Adjusted = tapply(tprice,ttime.int,function(x) {tail(x,1)}))
}

# CSVを読み込んで、列名の設定をする
csv <- read.csv("1234.csv", header=TRUE, fileEncoding="CP932")
names(csv) <- c("Date", "Time", "Volume", "Price")

# 日付,時刻をまとめて、日時を作成
times <- sprintf("%04d", as.numeric(csv$Time))
dateTimes <- as.character(paste(csv$Date, times, sep=""))
csv$Date <- NULL # Date 列を削除
csv[1] <- as.POSIXct(dateTimes, tz="", format="%Y%m%d%H%M")
names(csv) <- c("Datetime", "Volume", "Price")

# 歩み値を1分足に変換する
ohlc.1min <- ohlc(csv$Datetime, csv$Price, csv$Volume, "%Y%m%d %H%M")

# 日時を index にして、time 列を drop
rownames(ohlc.1min) <- ohlc.1min$time 
ohlc.1min$time <- NULL

# xts に変換後、ローソク足チャート表示
HOGE <- as.xts(ohlc.1min)
candleChart(HOGE, subset='2012-01-18 09:00::2012-01-18 15:00', theme='white')
実行結果

こんだけのコード書くのに(毎日やってたわけじゃないけど)2週間かかったわ・・・。R おそロシア。