時間序列

本用戶指南章節概述串流運算式和數學運算式中提供的一些時間序列功能。

時間序列彙總

timeseries 函數會利用 Solr 的內建分面和日期數學功能,執行快速、分散式時間序列彙總。

以下範例會對每日股票價格資料的集合執行每月時間序列彙總。在此範例中,會計算特定日期範圍內股票代碼 AMZN 的每月平均收盤價。

timeseries(stocks,
           q=ticker_s:amzn,
           field="date_dt",
           start="2010-01-01T00:00:00Z",
           end="2017-11-01T00:00:00Z",
           gap="+1MONTH",
           format="YYYY-MM",
           avg(close_d))

當此運算式傳送至 /stream 處理器時,會回應:

{
  "result-set": {
    "docs": [
      {
        "date_dt": "2010-01",
        "avg(close_d)": 127.42315789473685
      },
      {
        "date_dt": "2010-02",
        "avg(close_d)": 118.02105263157895
      },
      {
        "date_dt": "2010-03",
        "avg(close_d)": 130.89739130434782
      },
      {
        "date_dt": "2010-04",
        "avg(close_d)": 141.07
      },
      {
        "date_dt": "2010-05",
        "avg(close_d)": 127.606
      },
      {
        "date_dt": "2010-06",
        "avg(close_d)": 121.66681818181816
      },
      {
        "date_dt": "2010-07",
        "avg(close_d)": 117.5190476190476
      }
]}}

使用 Zeppelin-Solr,可以使用折線圖視覺化此時間序列。

timeseries1

向量化時間序列

在平滑或建模時間序列之前,需要將資料向量化。col 函數可用於將資料的欄從元組清單複製到陣列中。

以下運算式示範如何將 date_dtavg(close_d) 欄位向量化。然後使用 zplot 函數,在 x 軸上繪製月份,在 y 軸上繪製平均收盤價。

timeseries2

平滑

時間序列平滑通常用於消除時間序列中的雜訊,並協助找出潛在趨勢。數學運算式庫有三種用於時間序列平滑的滑動視窗方法。這些方法使用滑動資料視窗的摘要值來計算一組新的平滑資料點。

這三個滑動視窗函數是延遲指標,這表示它們直到趨勢影響滑動視窗的摘要值時才開始朝趨勢的方向移動。由於這種延遲特性,這些平滑函數通常用於確認趨勢的方向。

移動平均

movingAvg 函數會計算資料滑動視窗的簡單移動平均。以下範例會產生時間序列,將 avg(close_d) 欄位向量化,並計算視窗大小為 5 的移動平均。

移動平均函數會傳回一個長度比原始向量短的陣列。這是因為只有在有完整資料視窗可供計算平均值時才會產生結果。如果視窗大小為 5,則移動平均將在第 5 個值開始產生結果。先前的值不會包含在結果中。

然後使用 zplot 函數,在 x 軸上繪製月份,在 y 軸上繪製平均收盤價和移動平均。請注意,ltrim 函數用於從 x 軸和平均收盤價中修剪前 4 個值。這樣做是為了對齊這三個陣列,使它們從第 5 個值開始。

movingavg

指數移動平均

expMovingAvg 函數使用不同的公式來計算移動平均,該公式對基礎資料中的變更反應更快。這表示它比簡單移動平均的延遲指標少。

以下範例會計算移動平均和指數移動平均,並與原始 y 值一起繪製。請注意,指數移動平均對 y 值的變更更敏感。

expmoving

移動中位數

movingMedian 函數使用滑動視窗的中位數,而不是平均值。在許多情況下,移動中位數比移動平均更穩健,不容易受到離群值的影響。

以下範例會計算移動中位數

movingMedian

差分

差分可用於透過移除序列中的趨勢或季節性,使時間序列保持平穩。

一階差分

差分技術的核心概念是使用數值之間的差異,而非原始數值。一階差分取的是數值與其前一個數值之間的差。一階差分常被用於去除時間序列中的趨勢。

以下範例使用一階差分來使兩個時間序列達到平穩,如此一來它們便可以在沒有趨勢影響的情況下進行比較。

在這個範例中,我們將比較兩支股票:亞馬遜和 Google 的每月平均收盤價。下圖繪製了應用差分前的兩個時間序列。

timecompare

在下一個範例中,diff 函數會被套用至 zplot 函數內的兩個時間序列。diff 可以像 let 函數內的其他函數一樣,直接套用在 zplot 函數內。

請注意,現在兩個時間序列的趨勢都已去除,並且可以研究股票價格的每月變動,而不會受到趨勢的影響。

diff1

在下一個範例中,時間序列視覺化的 zoom 函數被用來放大到特定的月份範圍。這樣可以更仔細地檢查資料。仔細檢查資料後,似乎兩支股票的每月變動之間存在某種關聯。

diffzoom

在最後一個範例中,已差分的時間序列會使用 corr 函數進行關聯性分析。

diffcorr

落後差分

diff 函數有一個可選的第二個參數,用於指定差分的落後期數。如果指定了落後期數,則取的是數值與過去指定落後期數的數值之間的差。落後差分常被用於去除時間序列的季節性。

以下簡單範例演示了落後差分的工作原理。請注意,範例中的陣列遵循一個簡單的重複模式。這種模式通常會顯示季節性。

season

在這個範例中,我們使用落後期數為 4 的 diff 函數來移除這個模式。這將減去落後當前索引四個索引的值。請注意,結果集的大小是原始陣列大小減去落後期數。這是因為 diff 函數只會針對可以計算落後期數為 4 的值回傳結果。

seasondiff

異常偵測

movingMAD(移動平均絕對偏差)函數可用於透過測量滑動視窗內的離散度(與平均值的偏差)來找出時間序列中的異常值。

movingMAD 函數的操作方式與移動平均類似,但它測量的是視窗內的平均絕對偏差,而不是平均值。透過尋找異常高或低的離散度,我們可以找出時間序列中的異常值。

在這個範例中,我們將使用亞馬遜兩年期間的每日股價。每日股票資料將提供更大的資料集進行研究。

在以下範例中,search 表達式用於回傳股票代碼為 AMZN 的兩年期間每日收盤價。

anomaly

下一步是將 movingMAD 函數套用至資料,以計算 10 天視窗內的移動平均絕對偏差。以下範例顯示了如何套用和視覺化這個函數。

mad

一旦計算出移動 MAD 後,我們可以使用 empiricalDistribution 函數來視覺化離散度的分佈。以下範例繪製了具有 10 個組距的經驗分佈,建立了一個時間序列離散度的 10 組距直方圖。

這個視覺化圖表顯示,大多數的平均絕對偏差都落在 0 到 9.2 之間,最後一個組距的平均值為 11.94。

maddist

最後一步是使用 outliers 函數偵測序列中的離群值。outliers 函數使用機率分佈來找出數值向量中的離群值。outliers 函數需要四個參數:

  • 機率分佈

  • 數值向量

  • 低機率閾值

  • 高機率閾值

  • 從中選取數值向量的結果清單

outliers 函數會迭代數值向量,並使用機率分佈來計算每個值的累積分佈機率。如果累積分佈機率低於低機率閾值或高於高閾值,則會將該值視為離群值。當 outliers 函數遇到離群值時,會從第五個參數提供的結果清單中回傳對應的結果。它還會包含累積分佈機率和離群值的值。

以下範例顯示了套用至亞馬遜股價資料集的 outliers 函數。移動平均絕對偏差的經驗分佈是第一個參數。包含移動平均絕對偏差的向量是第二個參數。-1 是低機率閾值,而 .99 是高機率閾值。-1 表示不會考慮低離群值。最後一個參數是包含 close_ddate_dt 欄位的原始結果集。

outliers 函數的輸出包含偵測到離群值的結果。在此情況下,偵測到 5 個高於 .99 機率閾值的結果。

outliers

建模

Solr 中支援的數學表達式包含許多可用於對時間序列進行建模的函數。這些函數包括線性迴歸、多項式和諧波曲線擬合、局部加權迴歸和 KNN 迴歸。

這些函數中的每一個都可以對時間序列進行建模,並用於內插(預測資料集內的值),其中一些函數還可以用於外插(預測超出資料集的值)。

線性迴歸、曲線擬合和機器學習章節的使用者指南中詳細介紹了各種迴歸函數。

以下範例使用 polyfit 函數(多項式迴歸)來將非線性模型擬合到時間序列。所使用的資料集是亞馬遜八年期間的每月平均收盤價。

在這個範例中,polyfit 函數會回傳 y 軸的擬合模型,也就是使用 4 次多項式的每月平均收盤價。多項式的次數決定了模型中的曲線數量。擬合模型設定為變數 y1。然後使用 zplot 直接繪製擬合模型以及原始的 y 值。

視覺化圖表顯示了通過平均收盤價資料的平滑線擬合。

timemodel

預測

polyfit 函數也可以用來外推時間序列,以預測未來的股價。以下範例展示了 10 個月的預測。

在範例中,polyfit 函數將模型擬合至 y 軸,並且模型設定為變數 m。然後,為了建立預測,將 10 個零附加到 y 軸,以建立稱為 y10 的新向量。然後,使用 natural 函數建立新的 x 軸,該函數會回傳從 0 到 y10 長度的整數序列。新的 x 軸儲存在變數 x10 中。

predict 函數使用擬合模型來預測儲存在變數 x10 中的新 x 軸的值。

然後使用 zplot 函數在 x 軸上繪製 x10 向量,並在 y 軸上繪製 y10 向量和外推模型。請注意,y10 向量在觀察到的資料結束的地方降至零,但預測會沿著模型的擬合曲線繼續。

forecast