hands-on kurz na AR(p) proces analýzy časových řad v Pythonu
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:
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:
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:
Now, let’s take a look at the autocorrelation plot (correlogram):
plot_acf(simulated_AR2_data);
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);
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}')
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:
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:
Now, looking at the PACF and ACF:
plot_pacf(simulated_AR3_data);
plot_acf(simulated_AR3_data);
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}')
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()
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()
Úž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()
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}')
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);
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}')
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í 🍺