我的答案与lakesh 的答案非常相似。但我会认为你的问题是插值。
首先,移动平均线,或函数的时间平均线,是它在一段时间内的积分,除以时间长度。
在您的情况下,积分可以看作是一个总和,因为大多数情况下,每分钟的函数值都是相同的。但是,您的数据具有不相等的时间间隔。这可以看作是函数的缺失点。让我解释一下:对于每一分钟x,你应该有一个价格f(x)。但有时会说x=5,f(x) 是未定义。
消除函数不连续性的方法之一是插值 - 根据一些计算规则为缺失点分配一些值。最简单的算法就是“保持之前的值”,本质上就是lakesh的思路。
但是在这方面思考的好处在于能够使您的数据更加准确。它可能不适用于股票市场的情况,但通常应该是正确的,例如温度测量或风速,保证随着时间的推移平滑变化(而不是保持 2 分钟不变,1 秒钟突然变化)。您可以使用不同的插值技术来完善数据。从这个意义上说,“抛光”是可以的,因为无论如何你都必须使用“平均”的概念。良好的插值应该使数据更接近已被证明可以解决实际问题的模型。
代码 - 我将最大间隔设置为 5 分钟,以显示两种方法之间的巨大差异。这取决于您的观察和经验来决定哪种(或任何其他)方法最适合“预测过去”。
% reproduce your scenario
N = 20;
max_interval = 5;
time = randi(max_interval,N,1);
time(1) = 1; % first minute
price = randi(10,N,1);
figure(1)
plot(cumsum(time), price, 'ko-', 'LineWidth', 2);
hold on
% "keeping-previous-value" interpolation
interp1 = zeros(sum(time),1)-1;
interp1(cumsum(time)) = price;
while ismember(-1, interp1)
interp1(interp1==-1) = interp1(find(interp1==-1)-1);
end
plot(interp1, 'bx--')
% "midpoint" interpolation
interp2 = zeros(sum(time),1)-1;
interp2(cumsum(time)) = price;
for ii = 1:length(interp2)
if interp2(ii) == -1
t1 = interp2(ii-1);
t2 = interp2( find(interp2(ii:end)>-1, 1, 'first') +ii-1);
interp2(ii) = (t1+t2)/2;
end
end
plot(interp2, 'rd--')
% "modified-midpoint" interpolation
interp3 = zeros(sum(time),1)-1;
interp3(cumsum(time)) = price;
for ii = 1:length(interp3)
if interp3(ii) == -1
t1 = interp3(ii-1);
t2 = interp3( find(interp3(ii:end)>-1, 1, 'first') +ii-1);
alpha = 1 / find(interp3(ii:end)>-1, 1, 'first');
interp3(ii) = (1-alpha)*t1 + alpha*t2;
end
end
plot(interp3, 'm^--')
hold off
legend('original data', 'interp 1', 'interp 2', 'interp 3')
fprintf(['"keeping-previous-value" (weighted sum) \n', ...
' result: %2.4f \n'], mean(interp1));
fprintf(['"midpoint" (linear interpolation) \n', ...
' result: %2.4f \n'], mean(interp2));
fprintf(['"modified-midpoint" (linear interpolation) \n', ...
' result: %2.4f \n'], mean(interp3));
注意:未定义的点应该由NaN 呈现,但-1 似乎更容易玩。