怎么计算CMRA因子

发布于 2022-09-12 02:31:54 字数 470 浏览 15 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

假面具 2022-09-19 02:31:54
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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文