我正在为我公司的投资组合模拟器设计一个python插件,它可以在每天的模拟过程中接收投资组合中所有工具的每日返回数据。
我的模块应该每天更新仪器横截面上的协方差矩阵。为了做到这一点,到目前为止我的方法是:
- 在numpy数组中缓冲模块内的返回数据(ret:shape =(num_days(D),num_instrs(N)),索引映射到环形缓冲区(日期di的数据进入di%ret.shape [0 ])。
- 通过将带有np.take的返回数组提取到1-d数组来填充协方差矩阵(因为它是一个环形缓冲区)并且成对地调用np.cov。
醇>
此实施具有以下低效率:
- 每天,我必须调用np.take()来环绕环形缓冲区(ndarray),从而产生大量的复制成本。如果我不这样做,我可以选择使用np.roll(),但这也涉及数组副本。
- 协方差计算在这些临时中间阵列上成对地进行(O(N ^ 2 * D))。不能用N(数百万的数量级)或D(250-1000天)很好地扩展。
醇>
在我的公司,我们正在研究一个相当大的横截面(N~ = 1E6 - 1E7)。我需要我的实现可扩展,内存效率和快速。
您能否建议对当前方案进行任何改进,以使这项任务受益?