感谢Simon Otziger,我结合了绘制战略累积回报和回归高峰的功能,结合了闪亮和量子化的一个很好的例子。源代码为here。代码大部分时间都可以正常工作,但是对于某些数据,它不能正确地绘制峰值。
代码已简化,但关键逻辑未更改。我使用从三个示例策略复制的三组数据(cumPNL1,cumPNL2,cumPNL3)运行代码,其中第一个数据将导致代码无法正确绘制峰值。
我分别用cumPNL1,cumPNL2,cumPNL3运行以下代码。使用cumPNL2和cumPNL3,代码可以成功生成累积返回线和峰值点。但是,使用cumPNL1代码只能生成线,但峰值不在正确的位置。
我注意到,基于cumPNL2和cumPNL3的peakIndex的第一个值都为TRUE,因此当我通过添加一行peakIndex[1] <- TRUE
更改代码时,cumPNL1将与修改后的代码一起正常工作。
虽然现在它适用于修改过的代码,但我不知道它为什么会这样。有人可以看看吗?感谢
cumPNL1 <- c(-193,-345,-406,-472,-562,-543,-450,-460,-544,-659,-581,-342,-384,276,-858,-257.99)
cumPNL2 <- c(35.64,4.95,-2.97,-6.93,11.88,-19.8,-26.73,-39.6,-49.5,-50.49,-51.48,-48.51,-50.49,-55.44,143.55,770.22,745.47,691.02,847.44,1141.47,1007.82,1392.93,1855.26,1863.18,2536.38,2778.93,2811.6,2859.12,2417.58)
cumPNL3 <- c(35.64,4.95,-2.97,-6.93,11.88,-19.8,-26.73,-39.6,-49.5,-50.49,-51.48,-48.51,-50.49,-55.44,143.55,770.22,745.47,691.02,847.44,1141.47,1007.82,1392.93,1855.26,1863.18,2536.38,2778.93,2811.6,2859.12,2417.58)
peakIndex <- c(cumPNL3[1] > 0, diff(cummax(cumPNL3)) > 0)
# peakIndex[1] <- TRUE
dev.new()
plot(cumPNL3, type='n', xlab="index of trades", ylab="returns in cash", main="cumulative returns and peaks")
grid()
lines(cumPNL3)
points(cbind(1 : length(cumPNL3), cumPNL3)[peakIndex, ],
pch=19, col='green', cex=0.6)
legend(
x='bottomright', inset=0.1,
legend=c('Net Profit','Peaks'),
lty=c(1, NA), pch=c(NA, 19),
col=c('black','green')
)
答案 0 :(得分:1)
cumPNL1
具有单个峰值,R将尺寸从数值矩阵缩小为长度为2的数值向量。points
函数使用x绘制y轴上的两个数值向量值-axis index 1和2:
peakIndex1 <- c(cumPNL1[1] > 0, diff(cummax(cumPNL1)) > 0)
peakIndex3 <- c(cumPNL3[1] > 0, diff(cummax(cumPNL3)) > 0)
str(cbind(1 : length(cumPNL1), cumPNL1)[peakIndex1,])
str(cbind(1 : length(cumPNL3), cumPNL3)[peakIndex3,])
输出:
> str(cbind(1 : length(cumPNL1), cumPNL1)[peakIndex1,])
num [1:12, 1:2] 1 15 16 19 20 22 23 24 25 26 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "" "cumPNL1"
> str(cbind(1 : length(cumPNL3), cumPNL3)[peakIndex3,])
Named num [1:2] 14 276
- attr(*, "names")= chr [1:2] "" "cumPNL3"
通常设置plot = FALSE
会保留对象,例如str(cbind(1 : length(cumPNL3), cumPNL3)[peakIndex3, drop = FALSE])
,在这种情况下,该对象在某种程度上不起作用。但是,将points
行更改为以下内容可解决问题:
points(seq_along(cumPNL3)[peakIndex], cumPNL3[peakIndex], pch = 19,
col = 'green', cex = 0.6)
感谢您报告此问题。我明天会把修复程序推到GitHub。