2

私はここで求めていたのと同じようなことをしようとしていますが、残念ながらそれを解決することはできません。

これは私のデータフレーム(データ)、価格の時系列です:

Date          Price   Vol
1998-01-01     200      0.3
1998-01-02     400      0.4
1998-01-03     600     -0.2
1998-01-04     100      0.1
...
1998-01-20     100      0.1
1998-01-21     200     -0.4
1998-01-21     500      0.06
....
1998-02-01     100      0.2
1998-02-02     200      0.4
1998-02-03     500      0.3
1998-02-04     100      0.1
etc.

Rに伝えたいのですが

  • 「Vol」の最初の値を取り、それを「Price」の20番目の値で割ってから
  • 「Vol」の2番目の値を取り、それを「Price」の21番目の値で除算します。
  • 「Vol」の3番目の値を取り、それを「Price」の22番目の値で割ってから

私の他の投稿では、この関数を使用して、20日間の保有期間にわたるリターンを計算することができました。

> data.xts <- xts(data[, -1], data[, 1])
> hold <- 20
> f <- function(x) log(tail(x, 1)) - log(head(x, 1))
> data.xts$returns.xts <- rollapply(data.xts$Price, FUN=f, 
  width=hold+1, align="left", na.pad=T)

上記の問題に対して非常に似たようなことをする方法はありますか?だから何かのような

f1 <- function(x,y) head(x, 1) / tail(y,1)

ここで、xは「Vol」、yは「Price」で、「rollapply」を適用しますか?

どうもありがとうございます

更新:@ Dr G:ご提案ありがとうございます。少し変更を加えるだけで、私が望んでいたことを実行できました。

data.xts <- xts(data[, -1], data[, 1])
hold <- 20
data.xts$quo <- lag(data.xts[,2], hold) / data.xts[,1]

私の問題は、結果のデータフレームが次のようになることです。

    Date          Price   Vol     quo
1 1998-01-01     200      0.3     NA
2 1998-01-02     400      0.4     NA
3 1998-01-03     600     -0.2     NA
4 1998-01-04     100      0.1     NA
...
21 1998-01-20    180      0.2     0.003 

結果としてNAが存在する必要があることはわかっていますが、最初の20の観測ではなく、最後の20の観測に対してのみです。上記の式は正しい値を計算しますが、最初の行ではなく21番目の行から値を計算します。どうすればそれを変えることができるか知っていますか?

4

3 に答える 3

3

で使用by.column = FALSErollapplyます。投稿されたデータを使用するために、最初の行のボリュームを 3 番目の行の価格で割ります。

library(zoo)

Lines <- "Date          Price   Vol
1998-01-01     200      0.3
1998-01-02     400      0.4
1998-01-03     600     -0.2
1998-01-04     100      0.1
1998-01-20     100      0.1
1998-01-21     200     -0.4
1998-01-21     500      0.06
1998-02-01     100      0.2
1998-02-02     200      0.4
1998-02-03     500      0.3
1998-02-04     100      0.1"


# read in and use aggregate to remove all but last point in each day.
# In reality we would replace textConnection(Lines) with something 
#  like "myfile.dat"

z <- read.zoo(textConnection(Lines), header = TRUE, 
       aggregate = function(x) tail(x, 1))

# divide Volume by the Price of the point 2 rows ahead using by.column = FALSE
# Note use of align = "left" to align with the volume.
# If we used align = "right" it would align with the price.

rollapply(z, 3, function(x) x[1, "Vol"] / x[3, "Price"], by.column = FALSE,
    align = "left")

# and this is the same as rollapply with align = "left" as above
z$Vol / lag(z$Price, 2)

# this is the same as using rollapply with align = "right"
lag(z$Vol, -2) / z$Price

ちなみに、はaszooの符号に同じ規則を使用していますが、反対の規則を使用しているため、上記を に変換すると、ラグを無効にする必要があります。lagRxtsxts

于 2010-12-25T17:54:25.377 に答える
1

実際にはそれよりも簡単です。これを行うだけです:

data.xts <- xts(data[, -1], data[, 1])
hold <- 20
returns.xts = data.xts[,2] / lag(data.xts[,1], hold)

実際、これにはxtsの代わりにzooを使用しても機能します。

data.zoo<- zoo(data[, -1], data[, 1])
hold <- 20
returns.zoo = data.zoo[,2] / lag(data.zoo[,1], -hold)

変化するのはラグの兆候だけです(動物園の慣習はxtsとは異なります)

于 2010-12-25T11:37:02.687 に答える
0

あなたはただ使う必要があります

data.xts$quo <- data.xts[,2] / lag( data.xts[,1], -hold)
于 2010-12-25T17:20:58.327 に答える