3

私はquantmodを介していくつかのyahoo財務データを研究しています。

データのローリングウィンドウでの最大価格と最小価格だけでなく、それらの高値と安値の正確なタイムスタンプもどのように決定しますか?rollapplyでwhich.max()を試しましたが、これはローリングウィンドウ自体の値のシーケンスのみを報告し、タイムスタンプを保持する行の.index()は報告しません。

誰かが解決策を提案できますか?

再現可能な例を以下に示します。いくつかのサンプル出力が必要です...

> library(quantmod)
> getSymbols("BET.L")
xmin <- rollapply(BET.L$BET.L.Close,10,min, ascending = TRUE)
names(xmin) <- "MinClose"

xmax <- rollapply(BET.L$BET.L.Close,10,max, ascending = TRUE)
names(xmax) <- "MaxClose"

head(cbind(BET.L$BET.L.Close, as.xts(xmax), as.xts(xmin)),15)
           BET.L.Close MaxClose MinClose
2010-10-22     1550.00       NA       NA
2010-10-25     1546.57       NA       NA
2010-10-26     1545.00       NA       NA
2010-10-27     1511.26       NA       NA
2010-10-28     1490.00  1550.00     1395
2010-10-29     1435.00  1546.57     1381
2010-11-01     1447.00  1545.00     1347
2010-11-02     1420.00  1511.26     1347
2010-11-03     1407.00  1490.00     1347
2010-11-04     1395.00  1447.00     1347
2010-11-05     1381.00  1447.00     1347
2010-11-08     1347.00  1490.00     1347
2010-11-09     1415.00  1490.00     1347
2010-11-10     1426.00  1490.00     1347
2010-11-11     1430.00  1490.00     1347

生成したい出力のタイプは次のようになります。

           BET.L.Close MaxClose MinClose    MaxDate    MinDate
2010-10-22     1550.00       NA       NA      NA       NA
2010-10-25     1546.57       NA       NA      NA       NA
2010-10-26     1545.00       NA       NA      NA       NA
2010-10-27     1511.26       NA       NA      NA       NA
2010-10-28     1490.00  1550.00     1395 2010-10-22 2010-11-04
2010-10-29     1435.00  1546.57     1381 2010-10-25 2010-11-05

理想的には、私が採用するアプローチは、一般的な重複価格の事実に対応する必要があります。この場合、ウィンドウに最大値の最初と最小値の最後を取得するように命令します。

4

2 に答える 2

3

この計画には大きな問題があります。coredata 要素は行列であるため、すべての要素はクラスレスで同じモードでなければなりません。xts オブジェクトに Date クラスのオブジェクトを含めることはできません。文字クラスを主張すると、他のすべての要素も文字に強制されます。which.maxしたがって、結果を計算し、その -value がオフセットである行番号を作成し、which.max最後にその結果をオブジェクトのインデックスとして使用することで、何かを行うことができindexます。(「which」と「index」の二重使用については申し訳ありません。コードから意味が明確になることを願っています。)

xmin <- rollapply(BET.L$BET.L.Close,10,min)
names(xmin) <- "MinClose"

xmax <- rollapply(BET.L$BET.L.Close,10,max, ascending = TRUE)
names(xmax) <- "MaxClose"
head(dat <- cbind(BET.L$BET.L.Close, as.xts(xmax), as.xts(xmin)),15))

w.MaxDate <- rollapply(BET.L$BET.L.Close,10, which.max)
names(w.MaxDate) <- "w.maxdt"
dat <- cbind(dat, as.xts(w.MaxDate) )
dat<-cbind(dat,as.xts(seq.int(236), order.by=index(dat)))
> head(dat)
           BET.L.Close MaxClose MinClose       w.maxdt ..2
2010-10-22     1550.00       NA       NA            NA   1
2010-10-25     1546.57       NA       NA            NA   2
2010-10-26     1545.00       NA       NA            NA   3
2010-10-27     1511.26       NA       NA            NA   4
2010-10-28     1490.00  1550.00     1395             1   5
2010-10-29     1435.00  1546.57     1381             1   6
dat$maxdate <- xts( index(dat)[dat$..2-5+dat$BET.L.Close.1], order.by=index(dat))
> head(dat)
           BET.L.Close MaxClose MinClose       w.maxdt ..2 maxdate
2010-10-22     1550.00       NA       NA            NA   1      NA
2010-10-25     1546.57       NA       NA            NA   2      NA
2010-10-26     1545.00       NA       NA            NA   3      NA
2010-10-27     1511.26       NA       NA            NA   4      NA
2010-10-28     1490.00  1550.00     1395             1   5   14904
2010-10-29     1435.00  1546.57     1381             1   6   14907

それで、日付の整数表現を取得しました。入力ベクトルの先頭を見るだけで、これらが正しい値であることがわかります。

> head(index(dat)[dat$..2-5+dat$w.maxdt])
[1] NA           NA           NA           NA           "2010-10-22" "2010-10-25"
于 2011-10-01T04:24:47.733 に答える
0

元の xts オブジェクトに日付を表​​す数値列をもう 1 つ追加してから、rollapply を使用できると思います。以下の例のxminmaxを見てください。

require(quantmod)
getSymbols("BET.L")

## add Date as numeric
BET.L$dt <- as.numeric(format(index(BET.L), "%Y%m%d"))
xmin <- rollapply(BET.L, 10, align='r', by.column = FALSE,
    FUN = function(dw)
        return(dw[which.min(dw[,'BET.L.Close']), c('BET.L.Close', 'dt')])
    )
xmax <- rollapply(BET.L, 10, align='r', by.column = FALSE,
    FUN = function(dw)
        return(dw[which.max(dw[,'BET.L.Close']), c('BET.L.Close', 'dt')])
    )

xminmax <- cbind(xmin, xmax)
## to get back to dates use: 
##  as.Date(as.character(as.integer(xminmax$dt.xmin)), format = "%Y%m%d")

## left edge of data window
x_ldt <- rollapply(BET.L$dt, 10, align='r', function(dw) return(dw[1]))

結果:

head(xminmax)
           BET.L.Close.xmin  dt.xmin BET.L.Close.xmax  dt.xmax
2010-11-04             1395 20101104          1550.00 20101022
2010-11-05             1381 20101105          1546.57 20101025
2010-11-08             1347 20101108          1545.00 20101026
2010-11-09             1347 20101108          1511.26 20101027
2010-11-10             1347 20101108          1490.00 20101028
2010-11-11             1347 20101108          1447.00 20101101
于 2012-01-31T22:07:27.903 に答える