Je ne sais pas combien de personnes dans le monde ont besoin pour faire ce calcul.
La corrélation moyenne des actions par paire est la moyenne des coefficients de corrélation des mouvements de prix entre les actions. En général, l'environnement est tel que le marché dans son ensemble baisse fortement lors d'une crise comme le choc Lehman ou la crise de la dette européenne, puis augmente fortement en réaction, et le coefficient de corrélation entre les actions augmente. Lorsque la corrélation augmente, toutes les actions se comportent de la même manière, créant un environnement de marché dans lequel il est difficile pour les investisseurs actifs en actions de gagner un revenu excédentaire en sélectionnant des actions. Alors, utilisez cette métrique pour ajuster le niveau de risque de votre portefeuille (réduisez le risque lorsque vous avez peu de chances de gagner, etc.). À titre d'exemple plus bâclé, les gestionnaires de titres actifs l'utilisent comme excuse pour dire: "Je n'ai pas gagné récemment, mais c'est l'environnement du marché, alors pardonnez-moi."
Préparez d'abord les données. Préparez un DataFrame (m x n) avec la date verticalement (supposée être m jours), les stocks horizontalement (supposé être n) et les rendements quotidiens des stocks dans chaque élément.
Cette fois, j'ai préparé les données à l'extérieur et je les ai lues avec csv.
Cet article, etc., téléchargez le cours de l'action de yahoo en utilisant des pandas et utilisez la méthode pct_change ()
pour les retours quotidiens Vous pouvez le réparer.
Et enfin je vais calculer le coefficient de corrélation,
#Calcul de la corrélation par paires(Le résultat est Panel)
result = df.rolling(window=60, min_periods=30).corr()
Le calcul de la corrélation par paire roulante est terminé dans cette ligne! Ce que nous faisons, c'est "Calculer une matrice de corrélation (matrice nxn) qui prend le coefficient de corrélation entre tous les stocks pour 60 jours de rendements quotidiens jusqu'à ce jour. Cependant, pour les actions qui ne disposent pas de données pendant 30 jours," Aucun " Et répétez ceci pour toutes les dates. " Le "résultat" résultant est un objet "pandas.Panel" qui est un "DataFrame" bidimensionnel avec un axe supplémentaire (axe du temps) pour le rendre tridimensionnel (m x n x n).
J'ai pu calculer la corrélation, mais il faut du travail pour obtenir la moyenne. Puisqu'il s'agit d'une matrice de corrélation, 1 est inclus dans la composante diagonale et il est nécessaire de prendre la moyenne sans cela.2) Si le coefficient de corrélation ne peut pas être calculé en raison d'une perte de données, la valeur Aucun est incluse. Il y a deux raisons pour lesquelles vous devez prendre la moyenne sur cela.
Tout d'abord, c'est le composant diagonal 1, mais j'utiliserai np.fill_diagonal ()
de Numpy
et le changerai en valeur None
. Pour un seul DataFrame, nous utilisons quelque chose comme np.fill_diagonal (df, None)
, mais cette fois nous utilisons la méthode ʻapply () pour l'appliquer à l'ensemble du
Panel` comme suit:
#Convertir le composant diagonal en Aucun
tmp = result.apply(lambda x: np.fill_diagonal(x.values, None), axis=(1,2))
Appliquez ensuite la méthode mean (skipna = True)
pour calculer la valeur moyenne, en ignorant la valeur None. Il s'agit de la corrélation moyenne par paire. Ceci est également appliqué sur l'axe des temps avec une seule méthode ʻapply () `.
#Ignorer Aucun et calculer la moyenne
apc = result.apply(lambda x: x.unstack().mean(skipna=True), axis=(1,2))
Avec Panel.apply (..., axis = (1,2))
, vous pouvez traiter la matrice de corrélation à chaque point dans le temps comme DataFrame x
tout en déplaçant l'axe des temps.
Le calcul est terminé! Tracons-le.
apc.plot()
Vous pouvez voir que la corrélation saute au moment où le marché est influencé par des facteurs macroéconomiques occasionnels.
C'est tout ce qu'il faut pour élaborer le code. C'est facile. Les pandas ne sont développés que par l'auteur Wes McKinney pendant son mandat au fonds spéculatif AQR Capital, ce qui facilite la gestion des données financières.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#Lecture des données
df = pd.read_csv('data.csv', na_values=' ', index_col=0, parse_dates=True)
#Calcul de la corrélation par paires(Le résultat est Panel)
result = df.rolling(window=60, min_periods=30).corr()
#Convertir le composant diagonal en Aucun
tmp = result.apply(lambda x: np.fill_diagonal(x.values, None), axis=(1,2))
#Ignorer Aucun et calculer la moyenne
apc = result.apply(lambda x: x.unstack().mean(skipna=True), axis=(1,2))
#Terrain
apc.plot()
rolling
a changé depuis pandas 0.18.0, veuillez donc mettre à jour les derniers pandas avant de l'utiliser.
http://pandas.pydata.org/pandas-docs/stable/computation.html#window-functionsRecommended Posts