Wolfram mathematica 实现双指数平滑,也称为双指数移动平均(DEMA)
如果我有时间序列数据——一个{x,y}对的列表——并且想要平滑它,我可以使用指数移动平均值,如下所示:Wolfram mathematica 实现双指数平滑,也称为双指数移动平均(DEMA),wolfram-mathematica,smoothing,Wolfram Mathematica,Smoothing,如果我有时间序列数据——一个{x,y}对的列表——并且想要平滑它,我可以使用指数移动平均值,如下所示: EMA[data_, alpha_:.1] := Transpose @ {#1, ExponentialMovingAverage[#2, alpha]}& @@ Transpose@data 您将如何实施 如果它能自己算出alpha和gamma的好值,那就太好了 关于如何处理时间序列中存在差距的情况的相关问题,即样本在一段时间内分布不均匀: 我不确定这是最快的代码,但以下
EMA[data_, alpha_:.1] :=
Transpose @ {#1, ExponentialMovingAverage[#2, alpha]}& @@ Transpose@data
您将如何实施
如果它能自己算出alpha和gamma的好值,那就太好了
关于如何处理时间序列中存在差距的情况的相关问题,即样本在一段时间内分布不均匀:
我不确定这是最快的代码,但以下几点似乎可以做到:
DEMA[data_, alpha_, gamma_] :=
Module[{st = First[data], bt = data[[2]] - data[[1]], btnew, stnew},
Reap[
Sow[st];
Do[
stnew = alpha y + (1 - alpha) (st + bt);
btnew = gamma (stnew - st) + (1 - gamma) bt;
Sow[stnew];
st = stnew;
bt = btnew;
, {y, Rest@data}]][[-1, 1]
]]
这几乎直接来自您引用的页面。您可以在源代码中修改b的初始条件。将bt初始设置为零可恢复单指数平滑
In[81]:= DEMA[{a, b, c, d}, alpha, gamma]
Out[81]= {a, (1 - alpha) b + alpha b,
alpha c + (1 - alpha) ((1 - alpha) b +
alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b +
alpha b) gamma),
alpha d + (1 -
alpha) (alpha c + (1 -
gamma) ((-a + b) (1 - gamma) + (-a + (1 - alpha) b +
alpha b) gamma) + (1 - alpha) ((1 - alpha) b +
alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b +
alpha b) gamma) +
gamma (-(1 - alpha) b - alpha b +
alpha c + (1 - alpha) ((1 - alpha) b +
alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b +
alpha b) gamma)))}
以下是我的表述:
DEMA[data_, alpha_, gamma_] :=
FoldList[
Module[{x, y},
x = #[[1]] + #[[2]];
y = #2 - alpha x;
{y + x, #[[2]] + gamma * y}
] &,
{data[[1]], data[[2]] - data[[1]]},
alpha * Rest@data
][[All, 1]]
我对这个问题几乎一无所知,但你可能需要一个趋势估计。请告诉我Sasha的密码是否正确output@Mr.Wizard:在我拥有的一些数据上尝试时,我觉得它是对的。(不幸的是,这也让我确信这不是我真正想要的!但这是我自己的问题。希望这对将来在Mathematica中搜索DEMA的人有用!)我曾多次将其用于金融(市场)时间序列分析。你用它干什么?@belisarius:我在努力改善黑客的饮食()。谢谢萨沙!我相信这是正确的。请注意,这与规范并不完全一致,因为数据是一个具有{x,y}对的时间序列。但那很好;这一个与内置的指数移动平均值平行。
DEMA[data_, alpha_, gamma_] :=
FoldList[
Module[{x, y},
x = #[[1]] + #[[2]];
y = #2 - alpha x;
{y + x, #[[2]] + gamma * y}
] &,
{data[[1]], data[[2]] - data[[1]]},
alpha * Rest@data
][[All, 1]]