時間序列

不定期計算 EWMA 的線上算法?

  • January 14, 2020

什麼是用於計算以不規則間隔觀察到的輸入變數的 EWMA(指數加權移動平均值)的快速線上算法?

我知道定期採樣時的公式:

從半衰期計算 alpha:

$$ \alpha = 1 - e^{\frac{\ln{.5}}{H}} $$ 計算 x 的 EWMA:

$$ E = \alpha\cdot x + (1-\alpha)\cdot E_{-1} $$ 在採樣間隔不規則的情況下執行相同操作的算法是什麼?

編輯:

我在網上找到了一種算法,聲稱可以實現不規則的 EWMA。

double operator()(double x)
{
   if (isnan(prev_ewma_)) // we don't decay the first sample
   {
       prev_ewma_ = x;
       prev_time_ = Time::now();
       return x;
   }

   double time_decay = Time::now() - prev_time_;

   double alpha = 1 - std::exp(-time_decay / halflife_);
   double ewma  = alpha * x + (1 - alpha) * prev_ewma_;

   prev_ewma_ = ewma;
   prev_time_ = now;
   return ewma;
}

這個算法正確嗎?

上面的不規則 EWMA 程式碼並沒有給出半衰期 - 程式碼缺少 $ e^{\ln(.5)} $ 上式中找到的項。要獲得真正的半衰期,程式碼應如下所示:

double operator()(double x)
{
   if (isnan(prev_ewma_)) // we don't decay the first sample
   {
       prev_ewma_ = x;
       prev_time_ = Time::now();
       return x;
   }

   double time_decay = Time::now() - prev_time_;

   double alpha = 1 - std::exp(std::log(0.5) * time_decay / halflife_);
   double ewma  = alpha * x + (1 - alpha) * prev_ewma_;

   prev_ewma_ = ewma;
   prev_time_ = now;
   return ewma;
}

為了證明這是可行的,我們看看 alpha 在 EWMA 公式中是如何使用的。

$$ E = \alpha \cdot x + (1-\alpha) \cdot E_{-1} $$

我們預計在半衰期過去後,正好有一半 $ E_{-1} $ 將保留在我們的過濾值中。對於每個過濾時間步,剩餘的值 $ E_{-1} $ 將乘以 $ 1-\alpha $ , 意思是我們要解決 $ \alpha $ 這樣

$$ 0.5 = (1-\alpha)^N $$

在哪裡 $ N $ 是我們在半衰期中過濾的樣本數量。對於固定的時間步長 $ dt $ (程式碼中的time_decay),我們計算 $ N $ 作為

$$ N = \frac{H}{dt} $$

在哪裡 $ H $ 是半衰期。這給了我們

$$ 0.5 = (1-\alpha)^{\frac{H}{dt}} $$

插入我們的新公式 $ \alpha $ :

$$ \alpha = 1 - e^{\ln(0.5) \cdot \frac {dt} {H}} $$

$$ (e^{\ln(0.5)\cdot \frac {dt} {H}})^{\frac{H}{dt}} $$

$$ e^{\ln(0.5)} = 0.5 $$

將保留原始值的一半。

您計算兩個事件之間的不規則持續時間內的“單位間隔”的數量,並通過計數重複更新功能。攤銷時間是單位間隔的平均數。

在實際案例中,“單位間隔”更大(二次抽樣),因此這是在攤銷的常數時間內完成的。

引用自:https://quant.stackexchange.com/questions/35837