私は、動物園パッケージを使用して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')
「私は間違っていると確信しています。どうして? – ekstroem
期待した結果が得られません。私が得るのは、 "1"または "-1"のベクトルです。この部分は私には議論の余地があります:rollapply(data = y $ 'x $ cumul'、width = 1000、align = 'left'、function(x)level_break(y、n = 1000、z = 1)動物園の機能はありますが、私はその窓を一切必要としません。私は速く線を通過する必要があります。次に私のカスタム関数にウィンドウを指定します。 – alexeymosco