Trend szeregu czasowego

Trend szeregu czasowego zawiera podstawowe informacje o zjawisku opisywanym przez rozpatrywany szereg czasowy. Artykuł pokazuje jak wykorzystać język Python i pakiet Pandas do wyznaczania trendów szeregów czasowych. Jest kontynuacją poprzedniego artykułu o podstawowych operacjach na szeregach czasowych w języku Python z pakietem Pandas dostępnego tutaj.

Analiza szeregów czasowych

W artykule Szeregi czasowe w Python i Pandas przedstawiłem podstawowe narzędzia do przetwarzania szeregów czasowych w języku Python z pakietem Pandas. Opisałem tam podstawowe operacje na szeregach czasowych, między innymi sposób generowania losowych szeregów czasowych, sposób wczytywania szeregów czasowych z plików tekstowych, sposoby indeksowania i selekcji szeregów czasowych, a także agregacji i grupowania szeregów czasowych oraz tworzenia ich wykresów. Kolejnym etapem pracy z szeregami czasowymi jest często wyznaczanie ich trendów, co omawiam w tym artykule.

Przed wykonaniem programów opisanych w tym artykule, należy wczytać dane z pliku tekstowego, tak jak opisano w artykule Szeregi czasowe w Python i Pandas.

Trend szeregu czasowego

Trend szeregu czasowego wyznacza się zazwyczaj za pomocą średniej ruchomej odpowiednio dobranej długości. Poniższy kod ilustruje wyznaczenie trendu szeregu czasowego za pomocą średniej ruchomej o długości 20.

Na początku definujemy szereg czasowy cen, który będzie poddany dalszej analizie.

cena = notowania['close']

Trend szeregu czasowego wyznaczany jest przez średnią ruchomą o długości 20, czyli średnią z ostatnich 20 obserwacji.

trend = cena.rolling(window=20, center=False).mean()

Poniższy kod rysuje wykres szeregu czasowego i jego trendu na wybranym okresie. Można zauważyć, że wyznaczony trend dość dobrze opisuje szereg czasowy, choć oczywiście rzeczywiste odnotowane wartości szeregu czasowego nie pasują idealnie do trendu, bo zawierają inne składniki, między innymi zaburzenie losowe.

cena['2014':'2016'].plot()
trend['2014':'2016'].plot()

trend szeregu czasowego

Warto też spojrzeć na wykres szeregu czasowego po usunięciu trendu, który można otrzymać za pomocą poniższego kodu

(cena - trend)['2014':'2016'].plot()

trend szeregu czasowego

Na zakończenie, można sprawdzić czy średnia ruchoma została poprawnie policzna

print cena.loc['2017-01-02':'2017-01-30']
print cena.loc['2017-01-02':'2017-01-30'].mean()
print trend.loc['2017-01-30']
time
2017-01-02    85.59
2017-01-03    84.75
2017-01-04    86.50
2017-01-05    89.34
2017-01-09    88.60
2017-01-10    88.30
2017-01-11    85.46
2017-01-12    86.39
2017-01-13    86.50
2017-01-16    85.04
2017-01-17    85.70
2017-01-18    85.75
2017-01-19    86.50
2017-01-20    82.50
2017-01-23    82.30
2017-01-24    82.31
2017-01-25    82.41
2017-01-26    81.50
2017-01-27    83.31
2017-01-30    81.31
Name: close, dtype: float64
85.003
85.003
print cena.iloc[-20:]
print cena.iloc[-20:].mean()
print trend.iloc[-1]
time
2017-07-18    111.95
2017-07-19    111.00
2017-07-20    109.90
2017-07-21    106.35
2017-07-24    105.90
2017-07-25    106.05
2017-07-26    108.20
2017-07-27    105.45
2017-07-28    106.55
2017-07-31    106.35
2017-08-01    107.45
2017-08-02    106.55
2017-08-03    106.60
2017-08-04    106.15
2017-08-07    105.50
2017-08-08    108.00
2017-08-09    107.80
2017-08-10    107.00
2017-08-11    106.25
2017-08-14    106.65
Name: close, dtype: float64
107.2825
107.2825