怎么计算CMRA因子

有两列数据,一列是日期,一列是收益率。我想基于每天,找出第21天的数,第42天,第36天......第252天的收益率。然后第二十一天的数作为第一个月收益率,42天收益率/21天收益率-1作为第二个月收益率,63/42-1做第三个月,以此类推,会得到12个月的收益率。这些数ln(x+1).然后每个月的值等于前面的累加(也就是算出来了12个值,然后这十二个值+1,再lin。得到12个新值。然后这些值,第一个作为第一个值,第1+2作为第二个值,第1+2+3作为第三个值。1+2+3+。。。+12作为第12个值)。最后,求出这12个里面最大值Max(Z(T)),最小值Min(Z(T))。最后LN(1+Max(Z(T)))-LN(1+Min(Z(T)))作为最终的结果,也就是当天的CMRA因子值。

这种除了循环有没有比较好的写法啊?

我能想到的,就是用日期循环,基于每个日期,然后选出252天,然后一步一步去标记去算。DolphinDB database有很多函数,想知道有没有更好的简便方法?

请先 登录 后评论

1 个回答

Jason Tang - 时序数据库技术支持
def calcCRMA(date, ret){
    t=table(date as date, ret as ret)
    t[`cr1] =log(move(ret, 21) +1)
    diff = t[`cr1] - log( move(ret, 21))
    for(x in 2 .. 12){
        t["cr" + string(x) ] = diff + log(move(ret, 21*x))
    }
    return exec log(1 + rowMax(cr1,cr2,cr3,cr4,cr5,cr6,cr7,cr8,cr9,cr10,cr11,cr12)) - log(1 + rowMin(cr1,cr2,cr3,cr4,cr5,cr6,cr7,cr8,cr9,cr10,cr11,cr12)) from t
}

//产生一些模拟数据
t=table(2019.01.01 + 0..252 as date,  norm(0.0005, 0.0001, 253)+ 0.01 as ret, take(`ibm, 253) as sym)

//计算全部股票每天的crma
select sym,date, ret, calcCRMA(date, ret) as crma from t context by sym
请先 登录 后评论