4

2 つのデータ フレームがあります。1 つは 3 つの変数、つまり「date」、「strike」、「vol」で構成され、1 日 20 回、1 か月 100 回、1 年 (取引日数) 1200 回の観測が行われ、次のようになります。

Date         Price       Vol
2008-09-01   20          0.2
2008-09-01   30          0.5
...

したがって、各月の価格とボリュームには、それぞれ 10 から 40、0.1 から 0.7 の範囲の特定の値があります。
2 番目の値には、最初の値から補間された値が含まれます。だから私はもう日付を持っていませんが、他の変数の小さなステップです:

  Price       Vol
   20          0.2
   21          0.21
   22          0.24
   30          0.5

したがって、1 つのフレームは離散時間の値を示しますが、もう 1 つのフレームは多かれ少なかれ連続的な性質を持っています。
ここで私の質問: R に 2 番目のデータ フレームを最初のデータ フレームにマージし、2 つの個別のデータ フレーム間の連続的な価格/ボリュームの日付を引き継いで、次のような結果を得るにはどうすればよいでしょうか。

Date         Price       Vol
2008-09-01   20          0.2
2008-09-01   21          0.21
2008-09-01   22          0.24
...
2008-09-01   30          0.5

私はそれを行う方法を理解できません。私は常に、昇順ではなくなった日付の NA 値になってしまいました。


ダニをご愛顧いただき誠にありがとうございます

4

2 に答える 2

4

まず、時系列クラス (zooまたは などxts) を使用します。

2 番目の補間された時系列には、たとえそれが 1 時間ごとまたは毎分であっても、タイムスタンプが残っている必要があります。使用mergeしてそれらをまとめてna.locfから、より低い頻度の時系列から値を繰り越すために使用します。

次に例を示します。

ts1 <- zoo(1:5, as.POSIXct(as.Date("2010-10-01") + 1:5))
ts2 <- zoo(1:(5 * 24), as.POSIXct("2010-10-01 00:00:00") + (1:(5 * 24) * 3600))
na.locf(merge(ts1, ts2))
于 2010-11-19T16:36:23.657 に答える
2

最初の投稿でポイントを完全に逃しました。これはデートをします。しかし、ダウンストリーム関数がデータ フレームを必要としない限り、時系列が良い考えであるというシェーンの意見に同意します。

A <- data.frame(date=rep("2001-05-25", 2), price=c(20, 30), vol=c(0.2, 0.5))
B <- data.frame(price=seq(min(A$price), max(A$price), by=1))
C <- merge(A, B, all=TRUE)
index <- which(!is.na(C$vol))
for (i in seq(nrow(A))[-1]) {
    C$date[index[i-1]:index[i]] <- rep(A$date[i-1], A$price[i] - A$price[i-1] + 1)
    C$vol[index[i-1]:index[i]] <- seq(A$vol[i-1], A$vol[i], length=(A$price[i] - A$price[i-1] + 1))
}
ans <- C[, c(2, 1, 3)]

 ans 
         date price  vol
1  2001-05-25    20 0.20
2  2001-05-25    21 0.23
3  2001-05-25    22 0.26
4  2001-05-25    23 0.29
5  2001-05-25    24 0.32
6  2001-05-25    25 0.35
7  2001-05-25    26 0.38
8  2001-05-25    27 0.41
9  2001-05-25    28 0.44
10 2001-05-25    29 0.47
11 2001-05-25    30 0.50
于 2010-11-19T19:40:12.080 に答える