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. 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})} $). 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.
durchschnittlich
tpx_return = np.log(tpx['close'].values)[1:] - np.log(tpx['close'].values)[:-1]
tpx_return.mean()
0.00025531962222667643
** Autokovarianz **
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 **
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()
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()
Denken Sie ein wenig über die Zahlen nach, die Sie haben.
Eine Methode zum Testen der Nullhypothese, dass mehrere Autokorrelationskoeffizienten alle 0 sind.
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.
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
Es stellt sich also heraus, dass es ziemlich schwierig ist, die Nullhypothese abzulehnen.
Recommended Posts