Časové Řady Předpovědi s Autoregresních Procesů

Foto Elena Koycheva na Unsplash

V této hands-on kurz, si budeme povídat na téma časové řady modelování s autoregresních procesů.

tento článek se bude zabývat následujícími klíčovými prvky v analýze časových řad:

  • autoregresních procesů
  • Yule-Walkerovy rovnice.
  • stacionarita
  • Rozšířené Dicker-Fuller test

ujistěte se, že máte Jupyter notebooku připraveni následovat. Kód a datová sada jsou k dispozici zde.

začněme!

Učit se, jak pracovat se složitějšími modely, jako například SARIMAX, VARMAX, a aplikovat hluboké učení modely (LSTM, CNN, ResNet, autoregresních LSTM) pro časové řady analýzy se Aplikuje Analýza Časových řad v Pythonu!

Autoregresních Proces

autoregresních model používá lineární kombinaci minulých hodnot do cíle, aby se předpovědi. Regrese se samozřejmě provádí proti samotnému cíli. Matematicky, AR(p) model je vyjádřen jako:

Autoregresních model

Kde:

  • p: je pořadí
  • c: je konstantní
  • epsilon: šum

AR (P) model je neuvěřitelně flexibilní a může modelovat mnoho různých typů vzorů časových řad. To lze snadno vizualizovat, když simulujeme autoregresivní procesy.

autoregresivní modely se obvykle používají pouze pro stacionární časové řady. To omezuje rozsah parametrů phi.

například model AR(1) omezí phi mezi -1 a 1. Tato omezení se stávají složitějšími, jak se zvyšuje pořadí modelu, ale jsou automaticky zvažována při modelování v Pythonu.

simulace procesu AR (2)

pojďme simulovat proces AR (2) v Pythonu.

začneme importem některých knihoven. Ne všechny budou použity pro simulaci, ale budou vyžadovány po zbytek tohoto tutoriálu.

from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.tsa.stattools import pacf
from statsmodels.regression.linear_model import yule_walker
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
import numpy as np%matplotlib inline

použijeme knihovnu ArmaProcess k simulaci časové řady. Vyžaduje to, abychom definovali naše parametry.

budeme simulovat následující proces:

AR(2) proces

Vzhledem k tomu, že se jedná o autoregresních model řádu 2, musíme definovat koeficient v mas 0, 1 a 2.

také Zrušíme efekt procesu klouzavého průměru.

nakonec vygenerujeme 10 000 datových bodů.

v kódu:

ar2 = np.array()
ma = np.array()simulated_AR2_data = ArmaProcess(ar2, ma).generate_sample(nsample=10000)

můžeme vykreslit časové řady:

plt.figure(figsize=); # Set dimensions for figure
plt.plot(simulated_AR2_data)
plt.title("Simulated AR(2) Process")
plt.show()

And you should get something similar to this:

Plot of the simulated AR(2) process

Now, let’s take a look at the autocorrelation plot (correlogram):

plot_acf(simulated_AR2_data);

Correlogram AR(2) proces

můžete vidět, že koeficient je pomalu se rozpadající. To znamená, že je nepravděpodobné, že klouzavý průměr procesu, a to naznačuje, že časová řada může pravděpodobně být modelovány s autoregresních proces (což dává smysl, protože to, co jsme simulaci).

abychom se ujistili, že je to správné, vykreslíme parciální autokorelační graf:

plot_pacf(simulated_AR2_data);

Parciální autokorelační pozemek pro AR(2) proces

Jak můžete vidět, že koeficienty nejsou signifikantní po zpoždění 2. Proto je parciální autokorelační graf užitečný pro určení pořadí procesu AR(p).

můžete také zkontrolovat hodnoty jednotlivých koeficientů spuštěním:

pacf_coef_AR2 = pacf(simulated_AR2_data)
print(pacf_coef_AR2)

Nyní, v reálném projektu nastavení, to může být snadné najít řádu AR(p) proces, ale musíme najít způsob, jak odhadnout koeficienty phi.

k tomu použijeme Yule-Walkerovu rovnici. Tato rovnice nám umožňuje odhadnout koeficienty modelu AR(p), vzhledem k tomu, že známe pořadí.

rho, sigma = yule_walker(simulated_AR2_data, 2, method='mle')
print(f'rho: {-rho}')
print(f'sigma: {sigma}')

Yule-Walker koeficient odhady,

Jak můžete vidět, Yule-Walkerovy rovnice dělal slušnou práci na odhadu našich koeficienty a dostal velmi blízko 0,33 a 0,5.

simulace procesu AR (3)

nyní simulujme proces AR(3). Konkrétně budeme simulovat:

AR(3) proces simulace

Podobně jako to, co bylo dříve, pojďme definovat koeficienty a generovat 10 000 datových bodů:

ar3 = np.array()
ma = np.array()simulated_AR3_data = ArmaProcess(ar3,ma).generate_sample(nsample=10000)

Pak můžeme vizualizovat časové řady:

plt.figure(figsize=); # Set dimensions for figure
plt.plot(simulated_AR3_data)
plt.title("Simulated AR(3) Process")
plt.show()

A měli byste vidět něco podobného:

Simulated AR(3) process

Now, looking at the PACF and ACF:

plot_pacf(simulated_AR3_data);
plot_acf(simulated_AR3_data);

PACF and ACF for an AR(3) process

You see that the coefficients are not significant after lag 3 for the PACF function as expected.

Finally, let’s use the Yule-Walker equation to estimate the coefficients:

rho, sigma = yule_walker(simulated_AR3_data, 3, method='mle')
print(f'rho: {-rho}')
print(f'sigma: {sigma}')

Yule-Walker koeficient odhady,

Opět platí, že odhady jsou poměrně blízko skutečné hodnoty.

Projektu — Předvídání čtvrtletní EPS pro Johnson&Johnson

Teď pojďme použít naše znalosti o autoregresních procesů v projektu stanovení.

cílem je, aby model čtvrtletní zisk na akcii (EPS) společnosti Johnson&Johnson mezi lety 1960 a 1980.

za Prvé, pojďme číst datový soubor:

import pandas as pddata = pd.read_csv('jj.csv')
data.head()

Prvních pět řádků datového souboru

Nyní, prvních pět řádků jsou velmi užitečné pro nás. Pojďme vykreslit celou datovou sadu, abychom získali lepší vizuální reprezentaci.

plt.figure(figsize=); # Set dimensions for figure
plt.scatter(data, data)
plt.title('Quaterly EPS for Johnson & Johnson')
plt.ylabel('EPS per share ($)')
plt.xlabel('Date')
plt.xticks(rotation=90)
plt.grid(True)
plt.show()

Čtvrtletní EPS pro Johnson&Johnson mezi lety 1960 a 1980

Úžasné! Nyní můžeme, že v datech je jasný vzestupný trend. I když to může být dobré znamení pro společnost, není to dobré z hlediska modelování časových řad, protože to znamená, že časové řady nejsou stacionární.

jak bylo uvedeno výše, proces AR(p) funguje pouze pro stacionární řady.

proto musíme použít některé transformace na naše data, aby byla stacionární.

v tomto případě bude mít rozdíl protokolu. To je ekvivalentní s odebráním protokolu každé hodnoty a odečtením předchozí hodnoty.

# Take the log difference to make data stationarydata = np.log(data)
data = data.diff()
data = data.drop(data.index)
data.head()

Vykreslování transformované časové řady:

plt.figure(figsize=); # Set dimensions for figure
plt.plot(data)
plt.title("Log Difference of Quaterly EPS for Johnson & Johnson")
plt.show()

Protokol rozdíl čtvrtletní EPS pro Johnson&Johnson

Nyní, zdá se, že jsme odstranili trend. Musíme si však být jisti, že naše série je stacionární před modelováním procesem AR(p).

použijeme tedy rozšířený Dicker-Fullerův test. To nám dá statistickou jistotu, že naše časové řady jsou skutečně stacionární.

ad_fuller_result = adfuller(data)
print(f'ADF Statistic: {ad_fuller_result}')
print(f'p-value: {ad_fuller_result}')

Výsledky ADF testu

Protože budeme mít velké negativní ADF statistika a p-hodnota menší než 0,05, můžeme zamítnout nulovou hypotézu a říci, že naše časová řada je stacionární.

nyní najdeme pořadí procesu vykreslením PACF:

plot_pacf(data);
plot_acf(data);

PACF a ACF

Jak můžete vidět, po lag 4, PACF koeficienty nejsou signifikantní. Proto budeme předpokládat autoregresivní proces objednávky 4.

nyní použijeme tyto informace k odhadu koeficientů pomocí Yule-Walkerovy rovnice:

# Try a AR(4) model
rho, sigma = yule_walker(data, 4)
print(f'rho: {-rho}')
print(f'sigma: {sigma}')

Yule-Walker coefficient estimates

Therefore, the function is approximated as:

Note that this equation models the transformed series.

Conclusion

Congratulations! Nyní pochopit, co autoregresních model je, jak rozpoznat autoregresních proces, jak určit jeho pořadí, a jak používat to, aby se model reálného života časové řady.

Zostřit vaše analýza časových řad dovednosti a učit se nejnovější osvědčené postupy pro analýzy časových řad v Pythonu:

  • Použita Analýza Časových řad v Pythonu

na Zdraví 🍺

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.