我有一个横截面数组,其中列作为每个日期的价格。我想创建另一个具有 30 天窗口滚动总和的数组。我宁愿不使用 for 循环。目前,我在一列中使用以下代码:
for i=31:n
for j=i-30:i-1
x = x + y(j)
end
sum(i) = x
end
我需要对所有证券执行此操作,因此代码必须针对数据集中的所有元素运行多次。
对于每一列x
,您可以与 30 个序列进行卷积,然后删除初始和最终瞬态:
N = 30;
y = conv(x,ones(N,1));
y = y(N:end-N+1);
如果X
是一个矩阵,您可以类似地同时处理所有列:
y = conv2(ones(N,1),1,X);
y = y(N:end-N+1,:);
这很容易使用filter
.
假设你有一个简单的向量:
x = ones(100,1);
然后我们只是对它应用一个过滤器,如下所示:
filter(ones(1,30),1,x)
如果x
是矩阵,这也适用,例如ones(100,2)
。
使用cumsum
's 的组合!
data = 1:10;
n = length(data);
window = 3;
rollSum = cumsum(data)-[zeros(1,window), cumsum(data(1:n-window))];
rollSum =
1 3 6 9 12 15 18 21 24 27
1=1
1+2=3
1+2+3=6
2+3+4=9
3+4+5=12
启动 Matlab 2016a 有命令movsum