Aufgrund des Einflusses des neuen Koronavirus ist der Shanghai General Stock Index ein großer Schnäppchenverkauf mit einem Rabatt von 7%. 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".
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\}
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).
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. 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!
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