käytännön opetusohjelma Ar(p)-prosessista aikasarja-analyysiin Pythonilla
tässä käytännön tutoriaalissa käsitellään aikasarjamallinnusta autoregressiivisin prosessein.
tässä artikkelissa käsitellään seuraavia aikasarja-analyysin avaintekijöitä:
- autoregressiivinen prosessi
- Yule-Walkerin yhtälö
- stationarity
- Augmented Dicker-Fuller-testi
varmista, että Jupyter-muistikirja on valmiina seurattavaksi. Koodi ja aineisto löytyvät täältä.
Let ’ s get started!
opi työskentelemään monimutkaisempien mallien, kuten SARIMAXIN, VARMAXIN, kanssa ja käytä syväoppimismalleja (LSTM, CNN, ResNet, autoregressive LSTM) aikasarja-analyysiin sovelletulla aikasarja-analyysillä Python-kielellä!
Autoregressiivinen prosessi
autoregressiivinen malli käyttää lineaarista yhdistelmää kohteen aiemmista arvoista ennusteiden tekemiseen. Toki regressio tehdään itse kohdetta vastaan. Matemaattisesti AR(p) – malli ilmaistaan seuraavasti:
missä:
- P: on järjestys
- C: on vakio
- Epsilon: noise
AR (P) – malli on uskomattoman joustava ja sillä voidaan mallintaa monenlaisia aikasarjakuvioita. Tämä on helppo visualisoida, kun simuloimme autoregressiivisiä prosesseja.
yleensä autoregressiivisiä malleja sovelletaan vain kiinteisiin aikasarjoihin. Tämä rajoittaa Phi-parametrien valikoimaa.
esimerkiksi AR(1) – malli rajoittaa phi: n välille -1 ja 1. Nämä rajoitteet monimutkaistuvat mallin järjestyksen kasvaessa, mutta ne otetaan automaattisesti huomioon Pythonilla mallinnettaessa.
Ar(2) – prosessin simulointi
simuloidaan AR(2) – prosessia Pythonissa.
aloitamme tuomalla joitakin kirjastoja. Kaikkia ei käytetä simulaatioon, mutta niitä tarvitaan tämän opetusohjelman loppuosaan.
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
käytämme ArmaProcess-kirjastoa aikasarjan simulointiin. Se vaatii meitä määrittelemään muuttujamme.
simuloimme seuraavaa prosessia:
koska kyseessä on autoregressiivinen malli järjestyksessä 2, meidän on määriteltävä kerroin viiveellä 0, 1 ja 2.
myös kumotaan liukuvan keskiarvon prosessin vaikutus.
lopulta syntyy 10 000 datapistettä.
koodissa:
ar2 = np.array()
ma = np.array()simulated_AR2_data = ArmaProcess(ar2, ma).generate_sample(nsample=10000)
voimme piirtää aikasarjan:
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);
voit nähdä, että kerroin hajoaa hitaasti. Tämä tarkoittaa, että se on epätodennäköistä liukuvan keskiarvon prosessi ja se viittaa siihen, että aikasarja voidaan todennäköisesti mallinnetaan autoregressiivinen prosessi (mikä on järkevää, koska mitä me simuloidaan).
jotta tämä olisi varmasti oikein, piirretään osittaisen autokorrelaation tontti:
kuten näette, kertoimet eivät ole merkittäviä viiveellä 2. Siksi osittaisen autokorrelaation kuvaaja on hyödyllinen AR(p) – prosessin järjestyksen määrittämiseksi.
voit tarkistaa myös kunkin kertoimen arvot juoksemalla:
pacf_coef_AR2 = pacf(simulated_AR2_data)
print(pacf_coef_AR2)
nyt reaaliprojektiasetuksessa ar(p) – prosessin järjestys voi olla helppo löytää, mutta on löydettävä tapa arvioida kertoimia phi.
tähän käytetään Yule-Walker-yhtälöä. Tämän yhtälön avulla voimme arvioida ar(p) – mallin kertoimia, koska tiedämme järjestyksen.
rho, sigma = yule_walker(simulated_AR2_data, 2, method='mle')
print(f'rho: {-rho}')
print(f'sigma: {sigma}')
kuten näette, Yule-Walkerin yhtälö teki kelpo työtä arvioidessaan kertoimiamme ja pääsi hyvin lähelle 0,33: ta ja 0,5: tä.
Ar(3) – prosessin simulointi
nyt simuloidaan AR(3) – prosessia. Erityisesti, me simuloida:
samalla tavalla kuin aiemmin tehtiin, määritellään kertoimemme ja luodaan 10 000 datapistettä:
ar3 = np.array()
ma = np.array()simulated_AR3_data = ArmaProcess(ar3,ma).generate_sample(nsample=10000)
sitten voidaan visualisoida aikasarja:
plt.figure(figsize=); # Set dimensions for figure
plt.plot(simulated_AR3_data)
plt.title("Simulated AR(3) Process")
plt.show()
ja sinun pitäisi nähdä jotain vastaavaa:
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}')
taas arviot ovat melko lähellä todellisia arvoja.
Project — Forecasting the quarterly EPS for Johnson&Johnson
now, let ’ s apply our knowledge of autoregressive processes in a project setting.
tavoitteena on mallintaa Johnsonin neljännesvuosittainen osakekohtainen tulos (EPS)&Johnson vuosina 1960-1980.
luetaan ensin tietokokonaisuus:
import pandas as pddata = pd.read_csv('jj.csv')
data.head()
nyt ensimmäiset viisi riviä eivät ole meille kovin hyödyllisiä. Let ’ s juoni koko aineisto saada paremman visuaalisen esityksen.
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()
awesome! Nyt voimme, että siellä on selvä nouseva trendi tiedoissa. Vaikka tämä voi olla hyvä merkki yritykselle, se ei ole hyvä aikasarjamallinnuksen kannalta, koska se tarkoittaa, että aikasarja ei ole paikallaan.
kuten edellä, AR(p) – prosessi toimii vain stationäärisille sarjoille.
siksi meidän on sovellettava joitakin muunnoksia tietoomme, jotta se olisi paikallaan.
tässä tapauksessa otetaan lokiero. Tämä vastaa kunkin arvon lokin ottamista ja edellisen arvon vähentämistä.
# Take the log difference to make data stationarydata = np.log(data)
data = data.diff()
data = data.drop(data.index)
data.head()
muunnettujen aikasarjojen piirtäminen:
plt.figure(figsize=); # Set dimensions for figure
plt.plot(data)
plt.title("Log Difference of Quaterly EPS for Johnson & Johnson")
plt.show()
nyt näyttää siltä, että poistimme trendin. Meidän on kuitenkin varmistettava, että sarjamme on paikallaan ennen mallintamista AR(p) – prosessilla.
käytämme siis laajennettua Dicker-Fuller-testiä. Tämä antaa meille tilastollisen luottamuksen siihen, että aikasarjamme ovat todellakin paikallaan.
ad_fuller_result = adfuller(data)
print(f'ADF Statistic: {ad_fuller_result}')
print(f'p-value: {ad_fuller_result}')
koska saamme suuren negatiivisen ADF-tilaston ja p-arvon alle 0,05, voimme hylätä nollahypoteesin ja sanoa aikasarjamme olevan paikallaan.
nyt etsitään prosessin järjestys piirtämällä PACF:
plot_pacf(data);
plot_acf(data);
kuten näkyy, lagin 4 jälkeen pacf-kertoimet eivät ole enää merkittäviä. Siksi lähdemme autoregressiivinen prosessi järjestyksessä 4.
nyt arvioimme kertoimia näiden tietojen avulla Yule-Walker-yhtälön avulla:
# 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! Ymmärrät nyt, mitä autoregressiivinen malli on, miten tunnistaa autoregressiivinen prosessi, miten määrittää sen järjestys ja miten käyttää sitä mallintamaan tosielämän aikasarjaa.
Teroita aikasarja-analyysitaitojasi ja opettele uusimmat parhaat käytännöt aikasarja-analyysiin Pythonissa:
- sovellettu aikasarja-analyysi Pythonissa
Cheers 🍺