1

私は現在 R を使用して調査を行っていますが、次の変数を作成する方法について、スマートなアイデアや事前にパッケージ化された関数を誰かが持っているかどうか疑問に思っていました。

私は金融資産の毎日の終値の一変量の一連の価格を持っています。これは 10 年前にさかのぼります。(これは xts オブジェクトです)

x を 2% に選択しました

私の価格データの毎日。x%を超える(潜在的に絶対的な)リターン(当時の取引に対する先見の明があったと仮定)を作成するために必要な最小日数を知りたい. この変数は、その x% のリターンを生成するために必要な日数/月数/年数を返します。x% を超えるリターンを生成するためにデータの先頭を超えて戻る必要がある場合、NA は初期段階で返されます。

これを行うための手動で不格好な方法をいくつか考えることができますが、多くのループを使用して、日付/価格の負荷をチェックして、毎日の正しい値を返し、次の日にプロセスが繰り返されます.. .10 年間のデータまたは日中のデータではかなり問題があるため、より迅速な解決策に対して賛成票が投じられます....

4

2 に答える 2

2

for ループなしでこれを行う方法はわかりませんが、以下のソリューションはかなり高速です (2.2Ghz ラップトップで 10,000 行あたり約 1 秒)。

coredataxts オブジェクトの を取得し、dim属性を ( 経由で) ドロップしていることに注意してくださいdrop。これはベクトルを返します。これを行うのは、xts/zoo の数学演算がインデックスで整列するためです。そのため、収益を計算する前に分子からインデックスを削除する必要があります。

ただし、これにより、分子がクラスでNextMethod分母がクラスであるため、除算ディスパッチが呼び出されます。数値ベクトルで除算を実行することにより、そのオーバーヘッドを回避します。numericxts

library(quantmod)
getSymbols("^GSPC",from="1900-01-01")

x <- Ad(GSPC)

lookback <- function(x, p) {
  # lookback() assumes x is xts
  # select first column, take coredata, drop dims
  dcx <- drop(coredata(x[,1]))
  # initialize result object
  f <- dcx*NA
  # loop over all rows in 'x'
  for(i in 1:nrow(x)) {
    # Calculate cumulative return through today
    r <- dcx[i]/dcx-1 # or log(dcx[i]/dcx)
    # This really slows things down:
    # r <- dcx[i]/x-1
    #
    # Find which returns are greater than 'p'
    w <- which(abs(r[1:i]) > p)
    # If any returns are greater than 'p', then
    # record the closest location to 'p'
    if(length(w)!=0)
      f[i] <- max(w)-i
  }
  # return an xts object
  xts(f, index(x))
}
nrow(x)
# [1] 15791
system.time(lookback(x,0.02))
#    user  system elapsed 
#  15.761   0.152  16.040 
于 2012-10-03T11:18:14.347 に答える
1

最初に時系列を逆にして、最小の正の値を持つ x 値が時間的に最も近くなり、より遠い過去のポイントが右に出るようにする必要があります。次に、現在の値を取得して、次のように言うことができます。

set.seed(123)
yval=cumsum(0.01*rnorm(100))
plot(1:100, yval, type="b")
which(rev(yval) < 0.95*yval[100])
which(rev(yval) < (1- 0.05)*yval[100])[1]
[1] 5

日時または日付クラスの変数を含むサンプル データセットを提供していただければ、必要な変換を行うことができたはずです。

于 2012-10-03T05:50:17.773 に答える