volemont / insights:chart.EquityCurve.R:绘制累积回报峰值的错误?

时间:2016-03-28 13:20:45

标签: algorithmic-trading quantstrat

感谢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')
)

1 个答案:

答案 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。