R抛物线SAR和前瞻偏差

时间:2016-06-10 10:03:10

标签: r trading algorithmic-trading sar back-testing

我正在使用Joshua Ulrich实施的优秀R软件包中的 SAR() 函数在 TTR 中对此进行测试。我不确定这是否是抛物线SAR的标准行为。如果是的话,我需要一些帮助来实施未来的盲人" SAR。

为了简单起见,我将使用短向量和整数值而不是实时序列数据。

L <- c(1:4, 5)
H <- c(2:5, 6)

ParSAR <- SAR(cbind(H, L))
cbind(L, H, ParSAR)

     L H   ParSAR
[1,] 1 2 1.000000
[2,] 2 3 1.000000
[3,] 3 4 1.080000
[4,] 4 5 1.255200
[5,] 5 6 1.554784

我只会在最后时间间隔更改一个值,其中 Low - High 范围现在为5 - 7,而不是5 - 6。 / p>

L <- c(1:4, 5)
H <- c(2:5, 7)

我们得到:

     L H    ParSAR
[1,] 1 2 0.5527864
[2,] 2 3 0.5817307
[3,] 3 4 0.6784614
[4,] 4 5 0.8777538
[5,] 5 7 1.2075335

预期的行为是抛物线SAR的所有历史都得到了显着改变吗?如果第1行上的1到4行的SAR值被第5行上的不同未来值修改,则会对先前行引入前瞻性偏差。

如果这是抛物线SAR的标准行为,我需要它进行回测,我将不得不为每一行重新计算它,总是屏蔽所有未来的数据(行)。

期望的结果是每行都有抛物线SAR值,因为我可以在特定时刻见证它,而不知道未来。

编辑2016-06-18

user3666197的简化代码示例:

> SAR(cbind(c(2, 3, 4, 5, 6), c(1, 2, 3, 4, 5)), c(0.02, 0.2))
[1] 1.000000 1.000000 1.080000 1.255200 1.554784

> SAR(cbind(c(2, 3, 4, 5, 7), c(1, 2, 3, 4, 5)), c(0.02, 0.2))
[1] 0.5527864 0.5817307 0.6784614 0.8777538 1.2075335

3 个答案:

答案 0 :(得分:1)

@ user3666197:

您的测试为两个简短示例提供了相同的结果,因为在这两种情况下都使用默认值initGap = 0.。如上所述,R包装函数的情况并非如此:

  # Gap for inital SAR
  initGap <- sd(drop(coredata(HL[,1] - HL[,2])), na.rm=TRUE)

答案 1 :(得分:0)

pSAR没有实施任何预见性偷看

轻微的code-review of Joshua ULRICH's pSAR implementation可能会在源代码中确认零前瞻性。

问题可能来自函数调用签名,但the R-wrapper修复了这些问题。

#'@export
"SAR" <-
function(HL, accel=c(.02,.2)) {

  # Parabolic Stop-and-Reverse (SAR)
  # ----------------------------------------------
  #       HL = HL vector, matrix, or dataframe
  # accel[1] = acceleration factor
  # accel[2] = maximum acceleration factor
  ...

  # Gap for inital SAR
  initGap <- sd(drop(coredata(HL[,1] - HL[,2])), na.rm=TRUE)

  # Call C routine
  sar <- .Call("sar", HL[,1], HL[,2], accel, initGap, PACKAGE = "TTR")

  reclass( sar, HL )
}

SAR() 实施使用已发布的 sar() 的调用界面:

  

SEXP sar ( SEXP hi, /* HIGH[]-s */ SEXP lo, /* LOW[]-s */ SEXP xl, /* [initial AF value, max AF value] */ SEXP ig /* initial GAP */ )

在任何for(){...}扫描仪中都没有窥视未来(零预测)(所有扫描仪都只是回顾)。

更新

测试两个给定数据集的输出:

|>>> sar( ( 2, 3, 4, 5, 6 ), ( 1, 2, 3, 4, 5 ), ( 0.02, 0.2 ) )
[1.0, 1, 1.08, 1.2552, 1.5547840000000002]
|
|>>> sar( ( 2, 3, 4, 5, 7 ), ( 1, 2, 3, 4, 5 ), ( 0.02, 0.2 ) )
[1.0, 1, 1.08, 1.2552, 1.5547840000000002]

在Joshua ULRICH实施的pSAR算法中,有零预测偷看

Q.E.D.

事后

  

从一开始就注意到, sar() 功能被证明是正确实施的pSAR技术指标。 R包装器是问题所在,因为它决定调用底层的,正确工作的函数sar()的参数。 在一个案例中,呼叫签名加载了具有前瞻性偏见的参数,该函数不应归咎于此类行为,而是指责用户。 {{1} }

Q.E.D.

答案 2 :(得分:0)

抛物线SAR的R实现具有前瞻性偏见。

initGap值是所有时间HL数据的标准偏差:

initGap <- sd(drop(coredata(HL[, 1] - HL[, 2])), na.rm = TRUE)

参考文献:https://github.com/joshuaulrich/TTR/issues/23

对我原始示例的巨大影响是由于数据样本短和使用的极值。