代码之家  ›  专栏  ›  技术社区  ›  Kevin Chen

反向测试R交易的未平仓柜台

  •  0
  • Kevin Chen  · 技术社区  · 7 年前

    开始对一些交易数据进行回溯测试,特别是一个非常基本的均值回归想法,我无法理解如何处理这个概念。

    当DifFromFv(与公允价值的偏差)达到-10时,我该如何让运行中的“posy”增加1,然后随着DifFromFv扩展到-3的倍数(-13,-16,-19,等等),“posy”增加1,同时每次DifFromFv从上次更改的“posy”恢复到+5时,“posy”减少1?简单地说,我会在DifFromFv达到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等增量,无论在何处填充平均值,因为平均值#2的目标利润为-11.00,而不是-11.60。这既可以减少现实生活中填充与数据填充的误差幅度,也可以确保实现这一概念的方法更容易思考。

    提前感谢!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Vincent K    7 年前

    下次请提供一些代码,尽管您的解释很清楚。 但是,您没有提到如何处理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)