segmentby

语法

segmentby(func, funcArgs, segment)

详情

根据 segment 参数确定分组方案,把 funcArgs 分组,并把函数 func 应用到每个分组中。返回的结果与 segment 参数的长度相同。

参数

  • func 是一个函数。

  • funcArgs 是函数的参数。

  • segment 是分组向量。segment参数中连续相同的元素为一组。segment的长度必须和funcArgs相同。

例子

下面的例子中,y确定了3个分组:1 1 1、-1 -1 -1和1 1 1。第一个分组的index是0-2,第二个分组的index是3-5,第三个分组的index是6-9。按照这个规则把x分成3组,1 2 3、0 3 2和1 4 5,并把 cumsum 函数应用到x的每个分组,计算每个分组的累计和。

x=1 2 3 0 3 2 1 4 5
y=1 1 1 -1 -1 -1 1 1 1
segmentby(cumsum,x,y);
# output
[1,3,6,0,3,5,1,5,10]

segmentby 可用于止损回测。下面的例子把回报率ret分为两组,分别判断position=1和position=-1这两种情况下,是否需要止损。

def stoploss(ret, threshold){
     cumret = cumprod(1+ret)
     drawDown = cumret.cummax() / cumret - 1
     firstCutIndex = at(drawDown >= threshold).first() + 1
     indicator = take(false, ret.size())
     if(isValid(firstCutIndex) and firstCutIndex < ret.size())
         indicator[firstCutIndex:] = true
     return indicator
}
position = 1 1 1 1 1 -1 -1 -1 -1
ret = 0.01 0.02 -0.04 -0.02 -0.01 -0.005 -0.015 0.005 0.025
segmentby(stoploss{,0.05}, ret, position);
# output
[false,false,false,false,true,false,false,false,false]