Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何计算股票200个周期高点以来的周期_R_Finance_Quantitative Finance - Fatal编程技术网

R 如何计算股票200个周期高点以来的周期

R 如何计算股票200个周期高点以来的周期,r,finance,quantitative-finance,R,Finance,Quantitative Finance,我想计算自单变量时间序列的200周期高点以来经过的周期数。例如,SPY的收盘价如下: require(quantmod) getSymbols("SPY",from='01-01-1900') Data <- Cl(SPY) 但现在我被卡住了。我如何将其合并回原始序列(数据)并计算序列中的每个点,自上一个n周期高点以来经过了多少周期?您修改后的问题的答案: require(zoo) x <- sample(300:500, 1000, replace=TRUE) str(rolla

我想计算自单变量时间序列的200周期高点以来经过的周期数。例如,SPY的收盘价如下:

require(quantmod)
getSymbols("SPY",from='01-01-1900')
Data <- Cl(SPY)

但现在我被卡住了。我如何将其合并回原始序列(
数据)并计算序列中的每个点,自上一个n周期高点以来经过了多少周期?

您修改后的问题的答案:

require(zoo)
x <- sample(300:500, 1000, replace=TRUE)
str(rollapply(x, 200, function(x) which.max(x)))
# int [1:801] 14 13 12 11 10 9 8 7 6 5 ...
 plot(x)
 plot(200:1000, rollapply(x, 200, function(x) 200-which.max(x)))

显然,除非对滚动最大值应用更宽松的定义,否则无法将任何内容合并回前200个日期。(在另一个涉及“shifty”数据的SO会话中,我演示了如何使用embed填充“trailing”句点:但我不知道是否要构造比输入数据大200倍的矩阵。)

这个小函数返回一个列表,其中包含:

  • high
    high日期的索引编号
  • recentHigh
    最近高点的指数
  • daysSince
    自上次高点以来的天数
  • 数据
    仅具有高天数的xts对象。用于绘图
守则:

daysSinceHigh <- function(data, days){
  highs <- days-1+which(apply(embed(data, days), 1, which.max)==1)
  recentHigh <- max(highs)
  daysSince <- nrow(data) - recentHigh
  list(
    highs=highs,
    recentHigh = recentHigh,
    daysSince = daysSince,
    data=data[highs, ])
}       

我编辑了前面答案中的代码,使它们是采用相同输入(单变量时间序列)并返回相同输出(自上一个n天高点以来的天数向量)的函数:


daysSinceHigh1假设我有一些样本数据要处理……那么如何定义200天的高点?价格高于前200天(营业日或日历日)的一天?如果是业务,那么是哪个金融中心?还有一个问题:对于您的样本数据,正确答案是什么,即预期结果?@Dwin:让我们简化一下,假设我们使用的是单变量时间序列,每个工作日观察一次。我们要计算自上一个200周期高点以来经过的周期数。我已经更新了我的问题以反映这一点。您是否认为可以修改此函数,使daysSince也是一个xts对象,与原始序列长度相同,用于计算序列中每个点自上次高点以来的天数?我想比较一下你的方法的速度和德温的方法的速度。@扎克,因为你已经分配了最佳答案,甚至在我发布我的答案之前,在我更改了问题之后,我将把它作为练习留给感兴趣的读者。我根据感兴趣的读者的努力结果编辑了我的主要问题。=)
plot( rollapply(coredata(Data), 200, function(x) 200-which.max(x)))
daysSinceHigh <- function(data, days){
  highs <- days-1+which(apply(embed(data, days), 1, which.max)==1)
  recentHigh <- max(highs)
  daysSince <- nrow(data) - recentHigh
  list(
    highs=highs,
    recentHigh = recentHigh,
    daysSince = daysSince,
    data=data[highs, ])
}       
daysSinceHigh(Data, 200)$daysSince
[1] 90

plot(Data)
points(daysSinceHigh(Data, 200)$data, col="red")
daysSinceHigh1 <- function(x,n) {
    as.vector(n-rollapply(x, n, which.max))
}

daysSinceHigh2 <- function(x, n){
    apply(embed(x, n), 1, which.max)-1
}
> getSymbols("^GSPC",from='01-01-1900')
[1] "GSPC"
> system.time(x <- daysSinceHigh1(Cl(GSPC), 200))
   user  system elapsed 
   0.42    0.00    0.42 
> system.time(y <- daysSinceHigh2(Cl(GSPC), 200))
   user  system elapsed 
   0.24    0.00    0.24 
> all.equal(x,y)
[1] "Mean relative difference: 0.005025126"
data <- c(1,2,3,4,5,6,7,7,6,5,6,7,8,5,4,3,2,1)
answer <- c(0,0,0,0,1,2,3,0,0,1,2,3,4,4)
x <- daysSinceHigh1(data, 5)
y <- daysSinceHigh2(data, 5)

> x
 [1] 0 0 0 1 2 3 4 4 0 1 2 3 4 4
> y
 [1] 0 0 0 0 1 2 3 0 0 1 2 3 4 4
> answer
 [1] 0 0 0 0 1 2 3 0 0 1 2 3 4 4
> all.equal(x,answer)
[1] "Mean relative difference: 0.5714286"
> all.equal(y,answer)
[1] TRUE