【问题标题】:Implementing Double Exponential Smoothing, aka Double Exponential Moving Average (DEMA)实施双指数平滑,又名双指数移动平均线 (DEMA)
【发布时间】:2011-07-28 20:38:02
【问题描述】:

如果我有时间序列数据——{x,y} 对的列表——并且想要平滑它,我可以使用指数移动平均线,如下所示:

EMA[data_, alpha_:.1] := 
  Transpose @ {#1, ExponentialMovingAverage[#2, alpha]}& @@ Transpose@data

你将如何实现double exponential smoothing

DEMA[data_, alpha_, gamma_] := (* unstub me! *)

如果它自己找出好的 alpha 和 gamma 值,那就太好了。


有关如何处理时间序列中存在间隙的情况的相关问题,即样本随时间分布不均匀:

Exponential Moving Average Sampled at Varying Times

【问题讨论】:

  • 我对这个问题几乎一无所知,但似乎(来自en.wikipedia.org/wiki/Exponential_smoothing)你可能需要一个趋势估计。 reference.wolfram.com/applications/timeseries/…
  • 请告诉我 Sasha 的代码是否给出了正确的输出
  • @Mr.Wizard:在我拥有的一些数据上尝试它时,它看起来很合适。 (不幸的是,这也让我相信这实际上并不是我想要的!但这是我自己的问题。希望这对将来在 Mathematica 中搜索 DEMA 的人有用!)
  • 我用它几次来进行金融(市场)时间序列分析。你用它做什么?
  • @belisarius:我试图改进黑客的饮食(fourmilab.ch/hackdiet)。例如,beeminder.com/d/mass

标签: wolfram-mathematica smoothing


【解决方案1】:

我不确定这是最快的代码,但似乎可以做到这一点:

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)))}

【讨论】:

  • 谢谢萨沙!我相信这是正确的。请注意,这并不完全符合规范,因为 data 是具有 {x,y} 对的时间序列。但这没关系;这个与内置的 ExponentialMovingAverage 相似。
【解决方案2】:

这是我的公式:

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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多