[PYTHON] Zeitreihenanalyse Teil 1 Autokorrelation

Zweck

Daten

Ich habe mich vorerst für die Verwendung von TOPIX-Verlaufsdaten entschieden, weil ich beim Lesen meine Hände bewegen wollte. https://quotes.wsj.com/index/JP/TOKYO%20EXCHANGE%20(TOPIX)/180460/historical-prices Ich konnte es von der WSJ-Website herunterladen.

Es scheint, dass vorerst keine Werte fehlen. Der Zeitraum ist vom 30. Dezember 2008 bis zum 29. November 2019. Historische Daten von 4 Werten ohne Ex-Dividenden-Anpassung. Bei der Darstellung des Schlusskurses sieht es wie in der folgenden Abbildung aus. Es ist eine Zeit von der Zeit, als die 1.000 Punkte unmittelbar nach dem Lehman-Schock gebrochen wurden, bis zur Zeit, als Avenomics bestanden wurde. TOPIX.png Die täglichen Renditen sind wie folgt. Da es täglich ist, wird es keinen großen Unterschied machen, aber ich habe eine logarithmische Rückgabe verwendet ($ \ Delta \ log {y_t} = \ log {(y_t)} - \ log {(y_ {t-1})} $). save.png save.png Der größte Rückgang wurde am 15. März 2011 bei $ \ Delta \ log {y_t} = -0.0995 $ verzeichnet. Die Ursache war, dass das Offshore-Erdbeben im Pazifischen Ozean der Region Tohoku etwa 15 Minuten vor dem Ende des Vortages auftrat.

Verschiedene Statistiken

durchschnittlich \bar{y} = \frac{1}{T}\displaystyle{\sum_{t=1}^{T}y_t}

tpx_return = np.log(tpx['close'].values)[1:] - np.log(tpx['close'].values)[:-1]
tpx_return.mean()
0.00025531962222667643

** Autokovarianz ** \hat{\gamma}_k = \frac{1}{T} \displaystyle{\sum\_{t=k+1}^{T}}(y\_t-\bar{y})(y\_{t-k}-\bar{y}),\quad k = 0,1,2,...

import statsmodels.api as sm
sm.tsa.stattools.acovf(tpx_return, fft=True, nlag=5)
array([ 1.57113176e-04,  1.16917913e-06,  3.48846296e-06, -4.67502133e-06, -5.31500282e-06, -2.82855375e-06])

Ich bin nicht an die Statistikbibliothek gewöhnt, also überprüfe sie von Hand.

# k=0
((tpx_return-tpx_return.mean())**2).sum() / len(tpx_return)
0.00015711317609153836
# k=4
((tpx_return-tpx_return.mean())[4:]*(tpx_return-tpx_return.mean())[:-4]).sum() / len(tpx_return)
-5.315002816332674e-06

** Autokorrelation ** \hat{\rho}_k = \frac{\hat{\gamma}\_k}{\hat{\gamma}\_0},\quad k=1,2,3,...

sm.tsa.stattools.acf(tpx_return)[:5]
array([ 1.        ,  0.00744164,  0.0222035 , -0.02975576, -0.03382913])

Wenn Sie die Ergebnisse von $ k = 0 $ und $ k = 4 $ früher überprüfen,

-5.315002816332674e-06 / 0.00015711317609153836
-0.03382913482212345

Es scheint also, dass die Bibliothek die Berechnung so durchführt, wie ich es mir vorgestellt habe.

Ich werde auch ein Cholerogramm zeichnen. Ein Cholerogramm ist ein Diagramm des Autokorrelationskoeffizienten.

autocorr = sm.tsa.stattools.acf(tpx_return)
ci = 1.96 / np.sqrt(len(tpx_return))
plt.bar(np.arange(len(autocorr)), autocorr)
plt.hlines([ci,-ci],0,len(autocorr), linestyle='dashed')
plt.title('Correlogram')
plt.ylim(-0.05,0.05)
plt.show()

save.png

CI (Konfidenzintervall) ist ein Konfidenzintervall. Wenn Daten unabhängig voneinander sind und derselben Verteilung folgen, ergibt $ \ hat {\ rho} _k $ allmählich einen Durchschnitt von $ 0 $ und Varianzen $ \ frac {1} {T. Wir berechnen 95% auf beiden Seiten unter Verwendung der Eigenschaft, der Normalverteilung von} $ zu folgen.

Bei Verwendung der Bibliothek sieht es so aus. Modisch.

sm.graphics.tsa.plot_acf(tpx_return)
plt.ylim(-0.05,0.05)
plt.show()

save.png

Denken Sie ein wenig über die Zahlen nach, die Sie haben. \hat{\rho}\_{k=11}=-0.0421, \quad \hat{\rho}_{k=16}=0.0415 Es ist zweimal etwas höher als $ CI = 0,0379 $. Insbesondere ist $ \ hat {\ rho} \ _ {k = 12} = -0,0323 $ ebenfalls ein negativer Wert, was darauf hindeutet, dass die Dynamik in etwa 2 Wochen endet, selbst wenn der Marktpreis einmal zu steigen oder zu fallen beginnt. Möglicherweise können Sie denken, dass Sie es tun.

Taschentest (Portmanteau-Test)

Eine Methode zum Testen der Nullhypothese, dass mehrere Autokorrelationskoeffizienten alle 0 sind. H_0 : \rho_1 = \rho_2 =\quad ... \quad= \rho_m = 0 Hier werden wir den Test anhand der in dem Buch vorgestellten Statistiken von Ljung und Box (1978) durchführen. Der Ansatz besteht darin, das unten stehende $ Q (m) $ mit dem 95% -Punkt der Chi-Quadrat-Verteilung zu vergleichen. Q(m) = T(T+2)\displaystyle{\sum\_{k=1}^{m}}\frac{\hat{\rho}^2_k}{T-k} \sim \chi^2(m) Zusätzlich wird eine Statistik namens P-Wert definiert, die die Wahrscheinlichkeit angibt, dass eine stochastische Variable nach einer Chi-Quadrat-Verteilung einen Wert größer als $ Q (m) $ annimmt. Das heißt, wenn das Signifikanzniveau 5% beträgt, wird $ H_0 $ zurückgewiesen, wenn der P-Wert kleiner als 0,05 ist. In Bezug auf den Wert von $ m $ scheint $ m \ approx \ log {(T)} $ ein Leitfaden zu sein, aber es scheint üblich zu sein, mehrere $ m $ zu testen und ein umfassendes Urteil zu fällen. Ist.

Zunächst aus dem Muster, das die Bibliothek der Statistikmodelle verwendet. $ m \ approx \ log {(T)} = 7,89 $ Berücksichtigen Sie also vorerst die Verzögerung im Bereich von bis zu 16.

lvalue, pvalue = sm.stats.diagnostic.acorr_ljungbox(tpx_return)

Das ist es. Sehr leicht. save.png

Der P-Wert fiel unabhängig vom Wert von $ m $ nicht unter 0,05, und das Ergebnis war, dass die tägliche Änderungsrate von TOPIX keine Autokorrelation aufweisen konnte. Nun, der Marktpreis ist nicht so einfach.

Versuchen Sie schließlich ohne Bibliothek, Ihr Verständnis zu vertiefen.

from scipy.stats import chi2

def Q_func(data, max_m):
    T = len(data)
    auto_corr = sm.tsa.stattools.acf(data)[1:]
    lvalue = T*(T+2)*((auto_corr**2/(T-np.arange(1,len(auto_corr)+1)))[:max_m]).cumsum()
    pvalue = 1 - chi2.cdf(lvalue, np.arange(1,len(lvalue)+1))
    return lvalue, pvalue

Bestätigen Sie, dass das gleiche Ergebnis erzielt wird.

l_Q_func, p_Q_func = Q_func(tpx_return,max_m=16)
l_sm, p_sm = sm.stats.diagnostic.acorr_ljungbox(tpx_return, lags=16)
((l_Q_func-l_sm)**2).mean(), ((p_Q_func-p_sm)**2).mean()
(0.0, 7.824090399073146e-34)

Wenn Sie sich den Fall von $ m = 8 $ genauer ansehen,

T = len(tpx_return)
auto_corr = sm.tsa.stattools.acf(tpx_return)[1:]
lvalue = T*(T+2)*((auto_corr**2/(T-np.arange(1,len(auto_corr)+1)))[:8]).sum()
print(lvalue)
8.604732778577853
1-chi2.cdf(lvalue,8)
0.37672860496603844

save.png

Es stellt sich also heraus, dass es ziemlich schwierig ist, die Nullhypothese abzulehnen.

Recommended Posts

Zeitreihenanalyse Teil 1 Autokorrelation
Zeitreihenanalyse Teil 3 Prognose
Python: Zeitreihenanalyse
Zeitreihenanalyse Teil 2 AR / MA / ARMA
RNN_LSTM1 Zeitreihenanalyse
Zeitreihenanalyse 1 Grundlagen
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Umsatzprognose für die Zeitreihenanalyse
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Zeitreihenanalyse 2 Stabilität, ARMA / ARIMA-Modell
Ich habe versucht, Zeitreihen zu analysieren! (AR-Modell)
Zeitreihenzerlegung
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
Zeitreihenanalyse Nr. 6 Gefälschte Rückkehr und republikanischer Teil
Pandas Serie Teil 1
Python: Zeitreihenanalyse: Erstellen eines SARIMA-Modells
Python: Zeitreihenanalyse: Konstanz, ARMA / ARIMA-Modell
Kaggle ~ Gehäuseanalyse Part ~ Teil1
Python-Zeitreihenfrage
TOPIX-Zeitreihen anzeigen
Zeitreihendiagramm / Matplotlib
Python 3.4 Windows7-64bit-Umgebung erstellen (für die Analyse finanzieller Zeitreihen)
Python-Anwendung: Pandas Teil 2: Serie
Herausforderung für die zukünftige Umsatzprognose: ② Zeitreihenanalyse mit PyFlux
Eine Lernmethode für Anfänger zum Erlernen der Zeitreihenanalyse
[Python] Zeichnen Sie Zeitreihendaten
Wrap-Analyse Teil1 (Datenaufbereitung)
Herausforderung für die zukünftige Umsatzprognose: ⑤ Zeitreihenanalyse von Prophet
Herausforderung für die zukünftige Umsatzprognose: ① Was ist Zeitreihenanalyse?
[Statistik] [Zeitreihenanalyse] Zeichnen Sie das ARMA-Modell und erfassen Sie die Tendenz.
Einfache Vorhersage von Zeitreihen mit Prophet
Zeitreihenplot gestartet ~ Python Edition ~
Über Zeitreihendaten und Übertraining
Japanische Analyseverarbeitung mit Janome Teil1
Differenzierung von Zeitreihendaten (diskret)
Bewegungsstatistik zur Vorhersage von Zeitreihen
LSTM (1) zur Zeitreihenvorhersage (für Anfänger)
Mehrdimensionale Datenanalysebibliothek xarray Teil 2
Leistungsfähigkeit von Vorhersagemethoden in der Zeitreihendatenanalyse Halboptimierung (SARIMA) [Memo]
Veranschaulichen Sie sofort die vorherrschende Periode in Zeitreihendaten mithilfe der Spektralanalyse