数据框数学根据指标计算利润
dataframe math to calculate profit based on indicator
简单说明:我的目标是弄清楚如何获得如下所示的利润栏。我正在尝试为每对变化的值(-1 到 1 和 1 到 -1)计算 val
的差异。
- 如果起始
indicator
为 1 或 -1,则存储该值。
- 找到相反的下一个
indicator
(因此第 3 行为 -1)。保存此值。从中减去第一个值 (.85.-.84)。将其存储在利润栏中。
- 重复
具体到这个案例
- 一直走到找到下一个相反的值(在第 4 行)。保存这个值。减去值,保存在利润栏中。 ()
一直走到找到下一个相反的值(在第 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
备注
- 多个指标应该被忽略(1111)意味着除了第一个应该被存储的指标之外什么都没有。 (第 4 行已存储,第 5、6、7 行未存储)
- 忽略0,持有不改变利润计算
如果需要,我很乐意提供更多信息。
把问题分成两个部分后,我更容易在脑海中解决这个问题,这两个部分对应于下面显示的两个循环。第一部分涉及标记指标值发生变化的行,而第二部分涉及从相关行(即在第 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"]
}
简单说明:我的目标是弄清楚如何获得如下所示的利润栏。我正在尝试为每对变化的值(-1 到 1 和 1 到 -1)计算 val
的差异。
- 如果起始
indicator
为 1 或 -1,则存储该值。 - 找到相反的下一个
indicator
(因此第 3 行为 -1)。保存此值。从中减去第一个值 (.85.-.84)。将其存储在利润栏中。 - 重复
具体到这个案例
- 一直走到找到下一个相反的值(在第 4 行)。保存这个值。减去值,保存在利润栏中。 ()
一直走到找到下一个相反的值(在第 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
备注
- 多个指标应该被忽略(1111)意味着除了第一个应该被存储的指标之外什么都没有。 (第 4 行已存储,第 5、6、7 行未存储)
- 忽略0,持有不改变利润计算
如果需要,我很乐意提供更多信息。
把问题分成两个部分后,我更容易在脑海中解决这个问题,这两个部分对应于下面显示的两个循环。第一部分涉及标记指标值发生变化的行,而第二部分涉及从相关行(即在第 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"]
}