请教更优算法

计算CNE6三级因子BETA:股票收益率对沪深 300 收益率进行时间序列回归,取回归系数,回归时间窗口为 252 个交易日,半衰期 63 个交易日。

定义函数cneBeta,输入股票收益率矩阵stock_ret和指数收益率矩阵index_ret

def cneBeta(stock_ret,index_ret){

beta= rolling(getWlsKey{63,`Coefficient,1,1}, [stock_ret,index_ret], 252)

return beta.rename!(tail(stock_ret.rowNames(),beta.shape()[0]),stock_ret.columnNames())

}

其中getWlsKey为获取回归值的聚合函数

defg getWlsKey(half_life,key,r,c,y,x){

/*

* key:r,c 取值`Coefficient : intercept:0,1; beta:1,1; stdError:1,2; tstat:1,3;  pvalue:1,4

*/

window=size(x)

W=halfLifeW(half_life,window)

        return wls(y,x,W,,2)[key][r,c]

        }

halfLifeW为计算半衰期权重函数

def halfLifeW(half_life,window){

L, Lambda = pow(0.5,1\half_life), pow(0.5,1\half_life)

W = array(DOUBLE, 0)

for(i in 0:(window)){

    W.append!(Lambda)

    Lambda = mul(Lambda,L)

}

        return reverse(W)

        }

以2015年以来数据计算(输入矩阵大小68M*2),耗时18分( i7-10700 CPU 16G RAM)。我觉得应该是回归值读取和权重严重拖了后腿,请教有没有更好的算法。

请先 登录 后评论

1 个回答

Polly

我尝试优化了以下函数,测试后发现性能可以提升:

def halfLifeW(half_life,window){i
    Lambda = pow(0.5,1\half_life)
    W = accumulate(mul{Lambda}, window-1, Lambda)
    return reverse(W)
 } def cneBeta(stock_ret,index_ret){ stock_ret_list = matrix(movingWindowData(stock_ret, 252, fixed=true)) index_ret_list = matrix(movingWindowData(index_ret, 252, fixed=true)) stock_ret_list=dropna(stock_ret_list) index_ret_list=dropna(index_ret_list) beta = peach(getWlsKey{63,`Coefficient,1,1}, stock_ret_list.transpose(), index_ret_list.transpose()) return beta }
请先 登录 后评论
  • 1 关注
  • 1 收藏,597 浏览
  • Gaxia320 提出于 2023-07-25 13:53

相似问题