简单说明:我的目标是弄清楚如何获得如下所示的利润列。我想为每对变化值(-1到1和1到-1)计算val
的差异。
indicator
为1或-1,则存储该值。 indicator
(第3行为-1)。保存这个val。从中减去第一个值(.85 .-。84)。将其存储在利润列中。 特定于此案例
直到找到下一个对面的val(第8行)。保存此值。减去值,保存在利润列中。 财务解释(如果有用) 我正在尝试编写一个函数来计算一列值和一列指标(买入/卖出/持有)的利润。我知道这是在一些大包(quantmod,quantstrat)中实现的,但我似乎无法找到一种简单的方法来实现它。
df<-
data.frame(VAL = C(0.84,0.83,0.85,0.83,0.83,0.84,0.85,0.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
注释
如果需要,我很乐意提供更多信息。
答案 0 :(得分:0)
在将问题分成两部分之后,我更容易在脑中解决这个问题,这两部分对应于下面显示的两个循环。第一部分涉及标记指标值发生变化的行,而第二部分涉及从相关行(即第1部分中选择的那些行)中减去val。仅供参考,我假设您打算在您的示例中为第4行添加-02?如果没有,那么请说明在计算利润时减去哪些行。
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"]
}