有人可以帮我矢量化移动斜率计算。我试图消除for循环,但我不知道该怎么做。
>> pv = [18 19 20 20.5 20.75 21 21.05 21.07 21.07]'; %% price vector
>> slen = 3; %% slope length
function [slope] = slope(pv , slen)
svec = (1:1:slen)';
coef = [];
slope = zeros(size(pv));
for i = slen+1 : size(pv,1)
X = [ones(slen,1) svec];
y = pv( (i - (slen-1)) : i );
a = X\y;
slope(i,1) = a(2);
end
>> slp = slope(pv,3)
slp =
0
0
0
0.75
0.375
0.25
0.15
0.035
0.01
由于
答案 0 :(得分:1)
编辑:完全改变答案以使其可扩展
function [slope] = calculate_slope(pv , slen) %% Note: bad practice to give a function and variable the same name
svec = (1:1:slen)';
X = [ones(slen,1) svec];
%% the following two lines basically create the all the sliding windows of length slen (as a submatrix of a larger matrix)
c = repmat ( flipud(pv), 1, length(pv))
d = flipud(reshape(c(1:end-1), length(pv)-1, length(pv) + 1));
%% then run MATLAB solver with all windows simultaneously
least_sq_result = X\d( end - slen + 1:end, (slen+1):end);
slope = [zeros(slen-1, 1); least_sq_result(2,:)']; %% padding with zeros is optional
编辑:固定交换指数
答案 1 :(得分:0)
使用最小二乘回归在滑动窗口中查找斜率等效于一阶Savitzy-Golay过滤(使用差分滤波器)。 SG滤波的概念是在滑动窗口中执行局部多项式拟合,然后使用局部模型来平滑信号或计算其导数。当数据点在时间上相等地间隔时(如它们在这里),通过预先计算一组滤波器系数,然后将它们与数据卷积,可以非常有效地运行计算。这应该比构建一个巨大的矩阵并对其进行回归要快得多。
这是一种非常标准的技术,并且肯定有现成的matlab代码。搜索类似'Savitzky-Golay differentiation'的内容。请注意,SG过滤器也可以执行平滑处理(matlab内置的SG过滤功能可以执行此操作),但您需要具有差异化功能的版本。
Savitzky and Golay (1964)。通过简化最小二乘法对数据进行平滑和区分