通过流式传输的协方差的高效计算在numpy中返回数据

Min*_*orm 6 python numpy python-2.7

我正在为我公司的投资组合模拟器设计一个python插件,当它逐步完成每天的模拟时,它会接收投资组合中所有工具的每日返回数据.

我的模块应该每天在仪器的横截面上更新其协方差矩阵.为了做到这一点,到目前为止我的方法是:

  1. 缓冲模块内的返回数据在numpy数组中(ret:shape =(num_days(D),num_instrs(N)),索引映射到环形缓冲区(日期di的数据进入di%ret.shape [0]).
  2. 通过将返回数组提取到具有np.take的1-d数组(因为它是环形缓冲区)并且成对地调用np.cov来填充协方差矩阵.

此实现具有以下低效率:

  1. 每天,我必须调用np.take()来环绕环形缓冲区(ndarray),从而产生大量的复制成本.如果我不这样做,我可以选择使用np.roll(),但这也涉及数组副本.
  2. 协方差计算在这些临时中间阵列上成对地进行(O(N ^ 2*D)).N(数百万)或D(250-1000天)不能很好地扩展.

在我的公司,我们正在研究一个相当大的横截面(N~ = 1E6 - 1E7).我需要我的实现可扩展,内存效率和快速.

您能否建议对当前方案进行任何改进,以使这项任务受益?