我是R语言的新手,我试图在R语言中重新创建Channel Normalization Operator,但效果不佳。 我要计算的公式是:
CNO = [(St - Smin(n))]/(Smax(n)-Smin(n)]
其中: St是时间t处的时间序列值。 Smin(n)是持续n天的时间序列的最小值。 Smax(n)是时间序列的最大值,最近n天。 n =通道回溯跨度,以天为单位(例如30天)。
到目前为止,我所做的是:
t <- c(RUT_2012_2017T$Close)
n <- 30 #look back period defined by the rule
CN <- {(t - min(tail(t,n)))/((max(tail(t,n)))/(min(tail(t,n))))}
但是它不起作用,因为它仅计算一个最小值。一个在n-30位置。
有人可以帮助我吗? 谢谢。
答案 0 :(得分:0)
创建一个CNO函数,该函数计算其参数的最后一个组件的CNO,并将其传递给rollapplyr
。出于示例目的,我们使用了25个长的随机序列,移动窗口的宽度为5。
library(zoo)
set.seed(123)
x <- rgamma(25, 1) # test data
CNO <- function(x) (tail(x, 1) - min(x)) / (max(x) - min(x))
rollapplyr(x, 5, CNO, fill = NA)
也可以这样做(也可以使用动物园):
mx <- rollmaxr(x, 5, fill = NA)
mn <- - rollmaxr(-x, 5, fill = NA)
(x - mn) / (mx - mn)
答案 1 :(得分:0)
请考虑以下内容:
doFx <- function(pos, len, x, fx) fx(x[(pos-len):pos])
len <- 100
t <- rnorm(len) # just some numbers to work with
n <- 30
# calculations for t[30:100]
Smin <- sapply(n:len, doFx, n, t, min)
Smax <- sapply(n:len, doFx, n, t, max)
CN <- (t[n:len] - Smin)/(Smax - Smin)
您的方程式不同,所以这是我最好的猜测。