数据框数学根据指标计算利润

dataframe math to calculate profit based on indicator

简单说明:我的目标是弄清楚如何获得如下所示的利润栏。我正在尝试为每对变化的值(-1 到 1 和 1 到 -1)计算 val 的差异。

  1. 如果起始 indicator 为 1 或 -1,则存储该值。
  2. 找到相反的下一个 indicator(因此第 3 行为 -1)。保存此值。从中减去第一个值 (.85.-.84)。将其存储在利润栏中。
  3. 重复

具体到这个案例

  1. 一直走到找到下一个相反的值(在第 4 行)。保存这个值。减去值,保存在利润栏中。 ()
  2. 一直走到找到下一个相反的值(在第 8 行)。保存这个值。减去值,保存在利润栏中。 财务说明(如果有用的话) 我正在尝试编写一个函数来计算给定一列值和一列指标 (buy/sell/hold) 的利润。我知道这是在一些大包(quantmod、quantstrat)中实现的,但我似乎找不到一种简单的方法来做到这一点。

    df<-
    

    data.frame(val=c(.84,.83,.85,.83,.83,.84,.85,.81),指标=c(1,0,-1 ,1,0,1,1,-1))

    df
    val      indicator  profit
    1 0.84         1       NA
    2 0.83         0       NA
    3 0.85        -1       .01  based on: (.85-.84) from 1 one to -1
    4 0.83         1       .02  based on (.85-.83) from -1 to 1
    5 0.83         0       NA 
    6 0.84         1       NA 
    7 0.85         1       NA
    8 0.81        -1       -.02  based on (.81-.83) from last change (row 4) to now 
    

备注

如果需要,我很乐意提供更多信息。

把问题分成两个部分后,我更容易在脑海中解决这个问题,这两个部分对应于下面显示的两个循环。第一部分涉及标记指标值发生变化的行,而第二部分涉及从相关行(即在第 1 部分中选择的行)中减去 val。仅供参考,我假设您打算在您的示例中将 -.02 用于第 4 行?如果不是,那么请说明在计算利润时从哪些行中减去哪些行。

data.frame(val=c(.84,.83,.85,.83,.83,.84,.85,.81),
           indicator=c(1,0,-1,1,0,1,1,-1)) -> x

x$num <- seq_along(x$val)
x$rollingProf <- NA
# start with indicator = 1

indicator <- 1
value <- .84

for (i in 1:(nrow(x) - 1)) {        
    x[i + 1, "indicator"] -> next_
    if (indicator * -1 == next_) {
        1 -> x[i + 1, "rollingProf"]
        indicator <- next_
    } 
}

x[!is.na(x$rollingProf), c("val", "num")] -> q
for (i in 2:nrow(q)) {
    q[i, "val"] - q[i - 1, "val"] -> q[i, "change"]
}