回测用于 R 交易的未平仓头寸计数器
Backtesting open position counter for trading in R
开始对一些交易数据进行回测,尤其是一个非常基本的均值回归想法,我无法理解如何处理这个概念。
一旦 DifFromFv(与公允价值的偏差)达到 -10,我将如何让 运行 'posy' 增加 1,随后随着 DifFromFv 扩展 'posy' 增加 1是 -3 的倍数(-13、-16、-19 等),同时每次 DifFromFv 从上次更改 'posy' 恢复 +5 时 'posy' 减少 1?简而言之,我在 DiffFromFv 达到 10 点时买入,每 3 点取平均值,同时将每个平均值减去 5 点利润。
例如:
DifFromFv posy
0.00 0
-10.00 1 #initial clip (target profit -5.00)
-11.50 1
-13.00 2 #avg #1 (target profit -8.00)
-16.60 3 #avg #2 (target profit -11.00)
-12.30 3
-11.00 2 #taking profit on avg #2
-14.10 2
-8.00 1 #taking profit on avg #1
-7.00 1
-5.00 0 #taking profit on initial clip
需要注意的是,每个剪辑的止盈始终设置为-5、-8、-11 等。增量,而不管平均值在何处填充,正如 avg #2 的目标利润为 -11.00 而不是 -11.60 所见。这既是为了减少现实生活中的填充与数据填充的误差幅度,而且我很确定应该使这个概念的方法更容易思考。
提前致谢!
下次请提供一些代码,尽管你的解释很清楚。
但是,你没有提到你想如何处理 DifFromFv 中的大跳跃(例如,如果它从 -3 到 -18),所以我把它留给你。
这是带注释的代码:
library(plyr)
firstPosy = FALSE
DiffFair <- c(0, -10, -11.5, -13, -16.6, -12.3, -11, -14.1, -8, -7, -5) # Your data here
posy <- c(0)
buyPrices <- c(0) # Stores the prices at which you by your asset
targetProfit <- c(0) # Stores the target profit alongside with the vector above
steps <- c(0) # Stores your multiples of -3 after -10 (-10, -13, -16...)
PNL = 0
for (i in 2:length(DiffFair)) {
# Case where posy increments for the first time by one
if (DiffFair[i] <= -10 & DiffFair[i] > -13 & firstPosy == FALSE) {
firstPosy = TRUE
posy <- c(posy, 1)
steps <- c(steps, round_any(DiffFair[i], 10, f = ceiling))
lastChangePosy = DiffFair[i]
buyPrices <- c(buyPrices, DiffFair[i])
targetProfit <- c(targetProfit, -5)
}
else if (DiffFair[i] <= -13 & firstPosy == FALSE) {
firstPosy = TRUE
lastChangePosy = DiffFair[i]
steps <- c(steps, round_any(DiffFair[i] + 10, 3, f = ceiling) - 10)
buyPrices <- c(buyPrices, DiffFair[i])
targetProfit <- c(targetProfit, -5)
posy <- c(posy, tail(posy, n=1) + (-round_any(DiffFair[i] + 10, 3, f = ceiling) / 3) + 1)
}
# Posy increase
else if (tail(steps, n=1) > round_any(DiffFair[i] + 10, 3, f = ceiling) - 10 & DiffFair[i] <= -10) {
posy <- c(posy, posy[i-1] + 1)
steps <- c(steps, round_any(DiffFair[i] + 10, 3, f = ceiling) -10)
lastChangePosy = DiffFair[i]
buyPrices <- c(buyPrices, DiffFair[i])
targetProfit <- c(targetProfit, tail(targetProfit, n=1) - 3)
}
# Posy decrease
else if (DiffFair[i] >= tail(targetProfit, n=1) & tail(posy, n=1) > 0) {
if (tail(targetProfit, n=1) == -5) {
posy <- c(posy, 0)
}
else {
posy <- c(posy, posy[i-1] - 1)
}
lastChangePosy = DiffFair[i]
# Compute PNL and delete the target profit and buy price from the vectors
PNL = PNL + (DiffFair[i] - tail(buyPrices, n=1))
buyPrices <- buyPrices[-length(buyPrices)]
targetProfit <- targetProfit[-length(targetProfit)]
steps <- steps[-length(steps)]
if (DiffFair[i] > -10) {
firstPosy = FALSE
}
}
# Posy doesn't change
else {
posy <- c(posy, posy[i-1])
}
}
print(PNL)
开始对一些交易数据进行回测,尤其是一个非常基本的均值回归想法,我无法理解如何处理这个概念。
一旦 DifFromFv(与公允价值的偏差)达到 -10,我将如何让 运行 'posy' 增加 1,随后随着 DifFromFv 扩展 'posy' 增加 1是 -3 的倍数(-13、-16、-19 等),同时每次 DifFromFv 从上次更改 'posy' 恢复 +5 时 'posy' 减少 1?简而言之,我在 DiffFromFv 达到 10 点时买入,每 3 点取平均值,同时将每个平均值减去 5 点利润。
例如:
DifFromFv posy
0.00 0
-10.00 1 #initial clip (target profit -5.00)
-11.50 1
-13.00 2 #avg #1 (target profit -8.00)
-16.60 3 #avg #2 (target profit -11.00)
-12.30 3
-11.00 2 #taking profit on avg #2
-14.10 2
-8.00 1 #taking profit on avg #1
-7.00 1
-5.00 0 #taking profit on initial clip
需要注意的是,每个剪辑的止盈始终设置为-5、-8、-11 等。增量,而不管平均值在何处填充,正如 avg #2 的目标利润为 -11.00 而不是 -11.60 所见。这既是为了减少现实生活中的填充与数据填充的误差幅度,而且我很确定应该使这个概念的方法更容易思考。
提前致谢!
下次请提供一些代码,尽管你的解释很清楚。 但是,你没有提到你想如何处理 DifFromFv 中的大跳跃(例如,如果它从 -3 到 -18),所以我把它留给你。
这是带注释的代码:
library(plyr)
firstPosy = FALSE
DiffFair <- c(0, -10, -11.5, -13, -16.6, -12.3, -11, -14.1, -8, -7, -5) # Your data here
posy <- c(0)
buyPrices <- c(0) # Stores the prices at which you by your asset
targetProfit <- c(0) # Stores the target profit alongside with the vector above
steps <- c(0) # Stores your multiples of -3 after -10 (-10, -13, -16...)
PNL = 0
for (i in 2:length(DiffFair)) {
# Case where posy increments for the first time by one
if (DiffFair[i] <= -10 & DiffFair[i] > -13 & firstPosy == FALSE) {
firstPosy = TRUE
posy <- c(posy, 1)
steps <- c(steps, round_any(DiffFair[i], 10, f = ceiling))
lastChangePosy = DiffFair[i]
buyPrices <- c(buyPrices, DiffFair[i])
targetProfit <- c(targetProfit, -5)
}
else if (DiffFair[i] <= -13 & firstPosy == FALSE) {
firstPosy = TRUE
lastChangePosy = DiffFair[i]
steps <- c(steps, round_any(DiffFair[i] + 10, 3, f = ceiling) - 10)
buyPrices <- c(buyPrices, DiffFair[i])
targetProfit <- c(targetProfit, -5)
posy <- c(posy, tail(posy, n=1) + (-round_any(DiffFair[i] + 10, 3, f = ceiling) / 3) + 1)
}
# Posy increase
else if (tail(steps, n=1) > round_any(DiffFair[i] + 10, 3, f = ceiling) - 10 & DiffFair[i] <= -10) {
posy <- c(posy, posy[i-1] + 1)
steps <- c(steps, round_any(DiffFair[i] + 10, 3, f = ceiling) -10)
lastChangePosy = DiffFair[i]
buyPrices <- c(buyPrices, DiffFair[i])
targetProfit <- c(targetProfit, tail(targetProfit, n=1) - 3)
}
# Posy decrease
else if (DiffFair[i] >= tail(targetProfit, n=1) & tail(posy, n=1) > 0) {
if (tail(targetProfit, n=1) == -5) {
posy <- c(posy, 0)
}
else {
posy <- c(posy, posy[i-1] - 1)
}
lastChangePosy = DiffFair[i]
# Compute PNL and delete the target profit and buy price from the vectors
PNL = PNL + (DiffFair[i] - tail(buyPrices, n=1))
buyPrices <- buyPrices[-length(buyPrices)]
targetProfit <- targetProfit[-length(targetProfit)]
steps <- steps[-length(steps)]
if (DiffFair[i] > -10) {
firstPosy = FALSE
}
}
# Posy doesn't change
else {
posy <- c(posy, posy[i-1])
}
}
print(PNL)