Prédisez l'indice boursier complet de Shanghai immédiatement après le crash avec Python

Introduction.

En raison de l'influence du nouveau virus corona, l'indice boursier général de Shanghai est une vente au rabais de 7%. image.png Si cela descend jusqu'à ce point, le gouvernement investira probablement de l'argent, alors j'ai l'impression qu'il va revenir un peu à court terme. (J'étais désolé si je l'ai supprimé) Ma femme (chinoise), qui aime les bonnes affaires, recommande d'acheter de toutes ses forces, alors analysons-le un peu quantitativement. Ce que je veux savoir, c'est "s'il sera rentable de la réaction du lendemain du crash au mois suivant".

Cadre de modèle quantitatif

Donc, tout d'abord, zscore les rendements quotidiens et extrayez uniquement les jours qui dépassent -2σ.

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

Ensuite, recherchez la relation avec les retours le lendemain de ce jour, une semaine plus tard, deux semaines plus tard, trois semaines plus tard et un mois plus tard.

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

Modèle ① Autocorrélation

Regardons d'abord l'autocorrélation. La synthèse de Shanghai n'a que des valeurs aberrantes comme la Chine, et j'estime que la corrélation normale du ratio de produit Pearson (qui est facilement affectée par les valeurs aberrantes) n'est pas bonne, voici donc la corrélation de rang du lancier (car il est classé, il est affecté par les valeurs aberrantes) Je l'ai demandé.

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

Où D est la différence entre les rangs X et Y correspondants, et N est le nombre de paires de valeurs (voir Wiki pour plus de détails).

Trouver la corrélation de rang dans Excel est une douleur, mais avec les pandas, le code suivant est un one-shot. C'est merveilleux!

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

Le résultat du calcul réel de la corrélation avec les pandas est comme indiqué sur la figure, et une autocorrélation négative est confirmée dans son ensemble (= si la moyenne est de 0, elle a tendance à se repousser). image.png

Modèle ② analyse de régression

Ensuite, utilisons l'analyse de régression pour prédire le retour du lendemain au mois suivant du crash d'aujourd'hui (-7,72% à la clôture). Comme d'habitude, afin d'atténuer l'influence du coefficient de régression due à la valeur de l'écart, gagnez d'abord la valeur du retour (avant et après) dans la plage de ± 2σ.

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

Ensuite, une régression linéaire a été effectuée avec x comme retour le jour de l'accident et y comme retour les d jours suivants, et la valeur prévue y pour le retour d'aujourd'hui x = -7,72% a été obtenue pour chaque jour.

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

Cliquez ici pour le rendement prévu pour le jour J (taux quotidien par jour) suite à l'analyse de régression ci-dessus avec régression linéaire de scicit-learn.linear_models. image.png Comme vous pouvez le voir sur cette figure, il semble que la durée de vie soit d'environ 1 à 2 semaines même si elle repousse. En guise d'avertissement, certaines personnes peuvent penser que la valeur prédite est négative même si l'autocorrélation était négative même après un mois, mais en premier lieu, la période qui remplit les conditions ( Ce phénomène se produit parce que le rendement moyen un mois après (le jour où le rendement du jour est tombé en dessous de -2σ) était significativement négatif. La corrélation est considérée avec la moyenne fixée à 0, alors que dans le cas de l'analyse de régression, la moyenne est également considérée par le terme de section. Si le rendement moyen est différent de zéro, c'est souvent le cas, il est donc dangereux d'essayer de ne comprendre que la corrélation.

De plus, la figure ci-dessous est un diagramme de dispersion de x: retour le jour (uniquement le jour de l'accident) et y: retour cumulatif sur les n jours suivants (n = 1, 5, 10, 15, 20). Si vous utilisez sns.regplot () de seaborn, il tracera la ligne de régression et sa plage de prédiction sur le diagramme de dispersion à la fois! Pratique! image.png

code python

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

Prédisez l'indice boursier complet de Shanghai immédiatement après le crash avec Python
Appelez l'API avec python3.
Que dois-je faire avec la structure de répertoires Python après tout?
Extraire le fichier xz avec python
Obtenez la météo avec les requêtes Python 2
Trouvez la distance d'édition (distance de Levenshtein) avec python
Accédez à l'API Etherpad-lite avec Python
Installer le plug-in Python avec Netbeans 8.0.2
J'ai aimé le tweet avec python. ..
Maîtriser le type avec Python [compatible Python 3.9]
Rendre la console Python couverte d'UNKO
[Python] Définissez la plage du graphique avec matplotlib
Derrière le flyer: utiliser Docker avec Python
Vérifier l'existence du fichier avec python
[Python] Récupère le nom de la variable avec str
[Python] Arrondissez avec juste l'opérateur
Afficher Python 3 dans le navigateur avec MAMP
Rechercher le labyrinthe avec l'algorithme python A *
Lisons le fichier RINEX avec Python ①
Travailler avec OpenStack à l'aide du SDK Python
Télécharger des fichiers sur le Web avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "Singleton" avec Python
[Python] Utiliser automatiquement le navigateur avec Selenium
Apprenez le modèle de conception "Façade" avec Python
La route de la compilation vers Python 3 avec Thrift
[Python] J'ai essayé le même calcul que la prédiction de LSTM à partir de zéro [Keras]
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for