Prognostizieren Sie den Shanghai Comprehensive Stock Index unmittelbar nach dem Absturz mit Python

Einführung.

Aufgrund des Einflusses des neuen Koronavirus ist der Shanghai General Stock Index ein großer Schnäppchenverkauf mit einem Rabatt von 7%. image.png Wenn es so weit geht, wird die Regierung wahrscheinlich Geld investieren, und ich denke, es wird kurzfristig ein wenig zurückkehren. (Es tat mir leid, wenn ich es entfernt habe) Meine Frau (Chinesin), die Schnäppchenverkäufe liebt, empfiehlt, mit aller Kraft zu kaufen. Lassen Sie es uns also ein wenig quantitativ analysieren. Was ich wissen möchte, ist "ob es von der Reaktion vom Tag nach dem Absturz bis zum nächsten Monat profitabel sein wird".

Quantitatives Modellgerüst

Zscore also zuerst die täglichen Renditen und extrahiere nur die Tage, die -2σ überschreiten.

t\in\{t~|~{\rm zscore}(r_t)\leq -2\},~{\rm zscore}(r_t)=\frac{r_t - \mu}{\sigma}

Finden Sie dann die Beziehung zu den Retouren am Tag nach diesem Tag, eine Woche später, zwei Wochen später, drei Wochen später und einen Monat später.

E[r_{t+d}]=f(r_t), ~d\in\{1, 5, 10, 15, 20\}

Modell ① Autokorrelation

Schauen wir uns zunächst die Autokorrelation an. Die Shanghai-Synthese hat nur Ausreißer wie China, und ich bin der Meinung, dass die normale Korrelation des Pearson-Produktverhältnisses (die von Ausreißern beeinflusst werden kann) nicht gut ist. Hier ist also die Rangkorrelation von Spearman (weil sie eingestuft ist, wird sie von Ausreißern beeinflusst). Ich habe danach gefragt.

\rho=1-\frac{6\sum D^2}{N^3-N}

Dabei ist D die Differenz zwischen den entsprechenden X- und Y-Rängen und N die Anzahl der Wertepaare (Details siehe Wiki).

Das Finden der Rangkorrelation in Excel kann eine entmutigende Aufgabe sein, aber bei Pandas ist der folgende Code eine einmalige Aufgabe. Es ist wunderbar!

rho_spearman = df.corr(method='spearman')

Das Ergebnis der tatsächlichen Berechnung der Korrelation mit Pandas ist wie in der Abbildung gezeigt, und eine negative Autokorrelation wird insgesamt bestätigt (= wenn der Durchschnitt 0 ist, neigt sie zur Abstoßung). image.png

Modell ② Regressionsanalyse

Als nächstes verwenden wir die Regressionsanalyse, um die Rendite vom nächsten Tag bis zum nächsten Monat nach dem heutigen Absturz vorherzusagen (-7,72% zum Handelsschluss). Um den Einfluss des Regressionskoeffizienten aufgrund des Abweichungswerts abzuschwächen, muss wie üblich zunächst die Rendite (vor und nach) im Bereich von ± 2σ gewertet werden.

{\rm winsorize}(r_{t+d})={\rm min}({\rm max}(r_{t+d},~\mu-2\sigma),~\mu+2\sigma)

Dann wurde eine lineare Regression mit x als Rendite am Tag des Absturzes und y als Rendite an den nächsten d Tagen durchgeführt, und der vorhergesagte Wert y für die heutige Rendite x = -7,72% wurde für jedes d erhalten.

{\rm winsorize}(r_{t+d})=\beta_d*{\rm winsorize}(r_{t})+\alpha_d+\epsilon_{t+d}

Klicken Sie hier, um die prognostizierte Tagesrendite (Tagesrate pro Tag) als Ergebnis der Durchführung der obigen Regressionsanalyse mit linearer Regression von scicit-learn.linear_models anzuzeigen. image.png Wie Sie dieser Abbildung entnehmen können, scheint die Lebensdauer etwa 1 bis 2 Wochen zu betragen, selbst wenn sie abstößt. Als Einschränkung können einige Leute das Gefühl haben, dass der vorhergesagte Wert negativ ist, obwohl die Autokorrelation auch nach einem Monat negativ war, aber in erster Linie der Zeitraum, der die Bedingungen erfüllt ( Dieses Phänomen tritt auf, weil die durchschnittliche Rendite einen Monat später (an dem Tag, an dem die Rendite am Tag unter -2σ fiel) signifikant negativ war. Die Korrelation wird mit dem auf 0 gesetzten Mittelwert berücksichtigt, während bei der Regressionsanalyse der Mittelwert auch durch den Abschnittsbegriff berücksichtigt wird. Wenn die durchschnittliche Rendite ungleich Null ist, ist dies häufig der Fall. Daher ist es gefährlich, nur die Korrelation zu verstehen.

Darüber hinaus ist die folgende Abbildung ein Streudiagramm von x: Rendite am Tag (nur am Tag des Absturzes) und y: kumulative Rendite an den nächsten n Tagen (n = 1, 5, 10, 15, 20). Wenn Sie sns.regplot () von seaborn verwenden, werden die Regressionslinie und ihr Vorhersagebereich sofort im Streudiagramm dargestellt! Praktisch! image.png

Python-Code

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

df = pd.read_clipboard()
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date').astype('float')

df_clip = df.apply(lambda x: np.clip(x, x.mean() - x.std() * 2, x.mean() + x.std() * 2), axis='index')

span_list = df_clip.columns[1:-1]
pred = pd.Series(index=span_list)
X_pred = -0.0772
for span in span_list:
    X = df_clip['ret'].values.reshape(-1, 1)
    Y = df_clip[span].values.reshape(-1, 1)
    reg.fit(X, Y)
    pred[span] = reg.predict(np.array(X_pred).reshape(-1, 1)).flatten() * int(span[:-1])
    plt.clf()
    sns.regplot(x=df_clip['ret'], y=df_clip[span])
    plt.title('x: ret(t), y:average_ret(t+1:t+' + span[:-1] + ')')
    plt.savefig('span + '.png')

plt.clf()
fig, [ax1, ax2] = plt.subplots(ncols=1, nrows=2)
df_clip.corr(method='spearman').iloc[0, 1:-1].plot(kind='bar', ax=ax1)
ax1.set_title('conditional autocorrelation when ret < -2σ')
pred.plot(kind='bar', ax=ax2)
ax2.set_title('conditional predicted return when ret < -2σ')
plt.tight_layout()
plt.savefig('pred_ret.png')

Recommended Posts

Prognostizieren Sie den Shanghai Comprehensive Stock Index unmittelbar nach dem Absturz mit Python
Rufen Sie die API mit python3 auf.
Was soll ich denn mit der Python-Verzeichnisstruktur machen?
Extrahieren Sie die xz-Datei mit Python
Holen Sie sich das Wetter mit Python-Anfragen 2
Finden Sie die Bearbeitungsentfernung (Levenshtein-Entfernung) mit Python
Klicken Sie mit Python auf die Etherpad-Lite-API
Installieren Sie das Python-Plug-In mit Netbeans 8.0.2
Ich mochte den Tweet mit Python. ..
Beherrsche den Typ mit Python [Python 3.9 kompatibel]
Machen Sie die Python-Konsole mit UNKO bedeckt
[Python] Legen Sie den Diagrammbereich mit matplotlib fest
Hinter dem Flyer: Docker mit Python verwenden
Überprüfen Sie die Existenz der Datei mit Python
[Python] Ruft den Variablennamen mit str ab
[Python] Runden Sie nur mit dem Operator ab
Zeigen Sie Python 3 im Browser mit MAMP an
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Lesen wir die RINEX-Datei mit Python ①
Arbeiten mit OpenStack mit dem Python SDK
Laden Sie mit Python Dateien im Web herunter
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
[Python] Betreiben Sie den Browser automatisch mit Selenium
Lernen Sie das Designmuster "Facade" mit Python
Der Weg zum Kompilieren zu Python 3 mit Thrift
[Python] Ich habe die gleiche Berechnung versucht wie die Vorhersage von LSTM von Grund auf [Keras]
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung