我想在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