[PYTHON] Analyser les cours des actions à l'aide de l'agrégation de données pandas et des opérations du groupe

La catégorisation des données et l'application de fonctions à chaque catégorie s'appellent agrégation ou transformation. Celles-ci sont considérées comme les parties les plus importantes du flux de travail d'analyse des données. pandas a une fonction puissante dans le calcul de groupe et peut être utilisé de manière intuitive.

Un article célèbre de Hadley Wickham, auteur de divers packages pour le langage R The Split-Apply-Combine Strategy for Data Analysis (PDF) Décrit le processus d'opération de groupe "combinaison-application-séparation". pandas adopte également ce modèle d'opération d'agrégation de groupe comme idée de base. Les données sont séparées par une ou plusieurs touches au début du processus, puis la fonction est appliquée à chaque groupe et le résultat de l'application de la fonction est combiné et stocké dans l'objet affichant le résultat.

J'ai essayé Obtenir des actions au Japon avec Ruby avant. Je voudrais essayer les pandas avec un exemple de manipulation des opérations de groupe sur les cours réels des actions en utilisant les données collectées.

Regroupez les cours des actions de plusieurs sociétés par année et appliquez la fonction

Les variables regroupées par groupby dans les pandas sont des objets GroupBy. La méthode apply sépare les données en éléments qui facilitent le travail, applique une fonction à chaque objet, puis les combine.

#Relevez les cours des actions de plusieurs entreprises
#Données NTT
stock_9613 = pd.read_csv('stock_9613.csv',
                         parse_dates=True, index_col=0)
# DTS
stock_9682 = pd.read_csv('stock_9682.csv',
                         parse_dates=True, index_col=0)
#Fonds informatiques
stock_3626 = pd.read_csv('stock_3626.csv',
                         parse_dates=True, index_col=0)
# NSD
stock_9759 = pd.read_csv('stock_9759.csv',
                         parse_dates=True, index_col=0)

#Extraire les cours de clôture après 2010 dans une seule base de données
df = pd.DataFrame([
    stock_9613.ix['2010-01-01':, 'le dernier prix'],
    stock_9682.ix['2010-01-01':, 'le dernier prix'],
    stock_3626.ix['2010-01-01':, 'le dernier prix'],
    stock_9759.ix['2010-01-01':, 'le dernier prix']
], index=['Données NTT', 'DTS', 'Fonds informatiques', 'NSD']).T

#=>Données de date DTS IT e NSD
# (Omission)
# 2015-01-05     4530  2553  1811  1779
# 2015-01-06     4375  2476  1748  1755
# 2015-01-07     4300  2459  1748  1754
# 2015-01-08     4350  2481  1815  1775
# 2015-01-09     4330  2478  1805  1756
# 2015-01-13     4345  2480  1813  1766
# 2015-01-14     4260  2485  1809  1770
# 2015-01-15     4340  2473  1839  1790
# 2015-01-16     4295  2458  1821  1791

Les cours des actions de chaque société depuis 2010 ont été obtenus. Eh bien, il semble que les nombreuses sociétés listées ici collaborent souvent, mais quelle est la corrélation réelle sur le marché boursier? De là, je vais être un peu curieux et essayer de trouver le coefficient de corrélation annuel pour les données NTT.

Trouvez le coefficient de corrélation entre les cours d'actions groupés

#Trouvez la transition
rets = df.pct_change().dropna()
#Grouper par année
by_year = rets.groupby(lambda x: x.year)
#Définir une fonction anonyme qui calcule le coefficient de corrélation
vol_corr = lambda x: x.corrwith(x['Données NTT'])
#Appliquer des fonctions à des objets groupés
result1 = by_year.apply(vol_corr)
print(result1)

#=>Données NTT DTS IT Ho NSD
# 2010        1  0.346437     0.492006  0.443910
# 2011        1  0.485108     0.575495  0.619912
# 2012        1  0.261388     0.268531  0.212315
# 2013        1  0.277970     0.358796  0.408304
# 2014        1  0.381762     0.404376  0.385258
# 2015        1  0.631186     0.799621  0.770759

Visualisons-le avec matplotlib.

1.png

Vous pouvez également utiliser la méthode apply pour rechercher la corrélation entre les colonnes. Par exemple, trouvons la corrélation entre le cours de l'action DTS et les données NTT.

#Appliquer une fonction anonyme pour trouver le coefficient de corrélation entre une colonne et une autre
result2 = by_year.apply(lambda g: g['DTS'].corr(g['Données NTT']))
print(result2)

#=>
# 2010    0.346437
# 2011    0.485108
# 2012    0.261388
# 2013    0.277970
# 2014    0.381762
# 2015    0.631186

Définir une fonction un peu plus complexe et l'appliquer aux cours de bourse groupés

Il en va de même pour les fonctions ordinaires. Par exemple, trouvons une régression linéaire par la méthode des moindres carrés (OLS) pour chaque groupe.

#Créez votre propre fonction de régression linéaire
def regression(data, yvar, xvars):
    Y = data[yvar]
    X = data[xvars]
    X['intercept'] = 1.
    result = sm.OLS(Y, X).fit() #Méthode de régression linéaire dans la bibliothèque d'économie métrique
    return result.params #Les résultats sont renvoyés

#Appliquer une fonction de régression linéaire aux cours d'actions groupés
result3 = by_year.apply(regression, 'DTS', ['Données NTT'])

#=>Interception de données NTT
# 2010  0.313685   0.000773
# 2011  0.509025  -0.000057
# 2012  0.360677   0.000705
# 2013  0.238903   0.002063
# 2014  0.395362   0.001214
# 2015  0.418843  -0.002459

Cela fait seulement un demi-mois depuis 2015, donc je ne peux rien en dire, mais pour le moment, les résultats pour chaque année sont obtenus. En appliquant la fonction aux données regroupées de cette manière, vous pouvez essayer l'analyse sous différents angles, ce qui est très pratique.

Résumé

Pouvoir appliquer la fonction elle-même avec la méthode apply ouvre de nombreuses possibilités. Les fonctions appliquées ici peuvent être librement écrites par l'analyste, à l'exception de la règle selon laquelle un objet ou une valeur scalaire est renvoyée comme valeur de retour.

Le code source de cet article est ici.

référence

Introduction à l'analyse de données avec le traitement des données Python avec NumPy et pandas http://www.oreilly.co.jp/books/9784873116556/

Recommended Posts

Analyser les cours des actions à l'aide de l'agrégation de données pandas et des opérations du groupe
[Python] Extraction / combinaison de données aléatoires à partir de DataFrame en utilisant random et pandas
Analyse de données à l'aide de pandas python
Regroupez et analysez les prix des produits à l'aide de l'API Rakuten Product Search [Python]
Méthode de visualisation de données utilisant matplotlib (+ pandas) (5)
Analyser le fichier jtl de JMeter à l'aide de pandas
Précautions lors de l'utilisation de codecs et de pandas
Méthode de visualisation de données utilisant matplotlib (+ pandas) (3)
Méthode de visualisation de données utilisant matplotlib (+ pandas) (4)
Analyser les données à l'aide du texte Flash 100x de RegEx
Collecte automatique des cours boursiers à l'aide de python
Vérifiez les cours des actions avec Slackbot en utilisant Python
Collectez des données à l'aide de scrapy et remplissez mongoDB
Lisez CSV et analysez avec Pandas et Seaborn