有两列数据,一列是日期,一列是收益率。我想基于每天,找出第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有很多函数,想知道有没有更好的简便方法?
###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