2016-03-28 9 views
0

私は、動物園パッケージを使用してRでローリング収入/ストップロス検出機能を構築しようとしています。rローリングカスタム機能

x <- as.data.frame(rnorm(10000, 0, 1)) 
    x$cumul <- cumsum(x[, 1]) 
    plot(x$cumul, type = 'l') 
    y <- as.data.frame(x$cumul) 

    level_break <- function(x, n, z){ 
    if (min(c(1:nrow(x))[x[, 1] > z]) <= n 
     & (min(c(1:nrow(x))[x[, 1] > z]) < min(c(1:nrow(x))[x[, 1] < -z]) 
      | min(c(1:nrow(x))[x[, 1] < -z]) > n)){ 
     level <- 1 

    }else if (min(c(1:nrow(x))[x[, 1] < -z]) <= n 
      & (min(c(1:nrow(x))[x[, 1] < -z]) < min(c(1:nrow(x))[x[, 1] > z]) 
       | min(c(1:nrow(x))[x[, 1] > z]) > n)){ 
     level <- -1 

    } else { 
     level <- 0 
    } 
    return(level) 
} 

library(zoo) 
yy <- rollapply(data = y$`x$cumul`, width = 1000, align = 'left', function(x) level_break(y, n = 1000, z = 1)) 

私は間違っていると確信しています。どうやって動作させるのか理解してもらえますか?そうでなければ、私が行っていることを正確に行うパッケージには、専用の機能があることを知ってうれしいです。

すべて明確化した後:究極のテイク利益/ストップロスの機能:

#################### sl-tp 

x <- as.data.frame(rnorm(10000, 0, 1)) 
x$cumul <- cumsum(x[, 1]) 
plot(x$cumul, type = 'l') 
y <- as.data.frame(x$cumul) 


level_break <- function(x, n, tp, sl) { 
    if (min(c(1:length(x))[x > tp]) <= n 
     & (min(c(1:length(x))[x > tp]) < min(c(1:length(x))[x < sl]) 
      | is.infinite(min(c(1:length(x))[x < sl])) == T)) { 
     level <- 1 

    }else if (min(c(1:length(x))[x < sl]) <= n 
      & (min(c(1:length(x))[x < sl]) < min(c(1:length(x))[x > tp]) 
       | is.infinite(min(c(1:length(x))[x > tp])) == T)) { 
     level <- -1 

    } else { 
     level <- 0 
    } 
    return(level) 
} 

library(zoo) 

level <- 10 
window <- 1000 

start <- Sys.time() 
yy <- rollapply(data = y$`x$cumul` 
      , width = window 
      , align = 'left' 
      , function(x) level_break(x = x, n = window, tp = head(x + level, 1), sl = head(x - level, 1))) 
Sys.time() - start 

plot(yy, type = 'l') 
+0

「私は間違っていると確信しています。どうして? – ekstroem

+0

期待した結果が得られません。私が得るのは、 "1"または "-1"のベクトルです。この部分は私には議論の余地があります:rollapply(data = y $ 'x $ cumul'、width = 1000、align = 'left'、function(x)level_break(y、n = 1000、z = 1)動物園の機能はありますが、私はその窓を一切必要としません。私は速く線を通過する必要があります。次に私のカスタム関数にウィンドウを指定します。 – alexeymosco

答えて

0

あなたのオーケストレーション・ロジックで結構です。私はそれを実証するためにrollapplyの簡略版を書いた。完璧な10-幅100の入力に

[1] TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE 
[16] FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE 
[31] TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE 
[46] TRUE TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[61] FALSE TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE 
[76] FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE FALSE 
[91] FALSE 

91出力:

x = sample(1:1000,100,replace = T) 
stop_loss = function(vec){ 
    if(vec[10]< 0.75*mean(vec)) return(TRUE) 
    return(FALSE) 
} 

rollapply(x,width = 10,FUN = stop_loss) 

出力は次のようになります。それはあなたのロジックをテストするままにします。

あなたが書いたものを見ると、入力に問題があります。 dataframe ylevel_break関数に渡しています。それはxになるはずです。

xdataframeとする関数を作成しましたが、これはvectorとなります。

x <- as.data.frame(rnorm(10000, 0, 1)) 
x$cumul <- cumsum(x[, 1]) 
plot(x$cumul, type = 'l') 
y <- as.data.frame(x$cumul) 

level_break <- function(x, n, z){ 
    if (min(c(1:length(x))[x[1] > z]) <= n 
     & (min(c(1:length(x))[x[1] > z]) < min(c(1:length(x))[x[1] < -z]) 
     | min(c(1:length(x))[x[1] < -z]) > n)){ 
    level <- 1 

    }else if (min(c(1:length(x))[x[1] < -z]) <= n 
      & (min(c(1:length(x))[x[1] < -z]) < min(c(1:length(x))[x[1] > z]) 
       | min(c(1:length(x))[x[1] > z]) > n)){ 
    level <- -1 

    } else { 
    level <- 0 
    } 
    return(level) 
} 

library(zoo) 
yy <- rollapply(data = y$`x$cumul`, width = 1000, align = 'left', function(x) level_break(x, n = 1000, z = 1)) 

あなたは分をチェックする必要がありますが、それは警告をスローしcondition-:ここ

は、私はあなたのコードを変更するものです。 :)

+0

エラーが発生しましたが、警告がスローされますが、動作します。 (x(、1)> z)) z]) )== T)){ \t \tレベル< - -1 \t \t \t}他{ \t \tレベル< - 0 \t} \tリターン(レベル) } level_break(Y、N = 1000、Z = 21) ' – alexeymosco

0

jackStinger、急性の眼に感謝します。私は実際にx-yとデータフレームベクトルを混在させました。私は、コードを更新し、rollapplyでうまく動作するようだ:私は今、私の関数にXを渡しています

x <- as.data.frame(rnorm(10000, 0, 1)) 
x$cumul <- cumsum(x[, 1]) 
plot(x$cumul, type = 'l') 
y <- as.data.frame(x$cumul) 


level_break <- function(x, n, z){ 
    if (min(c(1:length(x))[x > z]) <= n 
     & (min(c(1:length(x))[x > z]) < min(c(1:length(x))[x < -z]) 
      | is.infinite(min(c(1:length(x))[x < -z])) == T)){ 
     level <- 1 

    }else if (min(c(1:length(x))[x < -z]) <= n 
      & (min(c(1:length(x))[x < -z]) < min(c(1:length(x))[x > z]) 
       | is.infinite(min(c(1:length(x))[x > z])) == T)){ 
     level <- -1 

    } else { 
     level <- 0 
    } 
    return(level) 
} 

level_break(y, n = 1000, z = 21) 

library(zoo) 

yy <- rollapply(data = y$`x$cumul`, width = 100, align = 'left', function(x) level_break(x, n = 100, z = 1)) 

plot(yy, type = 'l') 

、その関数の中には、ベクトルとして扱われます。それはうまくいくようです。最後のコード行は、期待される結果をプロットします。大いに感謝する!

+0

おい!お力になれて、嬉しいです!あなたが満足していれば、答えを受け入れるか/アップアップするかを感謝します。また、回答を追加する代わりに、回答を編集して情報を追加することもできます。乾杯! – jackStinger

+0

私はまだ新人ですので投票できません。ありがとうございました。私は冗長な答えを削除しました。ありがとう:) – alexeymosco