[PYTHON] Animez les valeurs alpha et bêta des principales valeurs boursières mondiales avec pandas + matplotlib

1.Tout d'abord

J'étais intéressé à la fois par l'apprentissage automatique et l'ingénierie financière, j'ai donc visé deux oiseaux avec une pierre Apprentissage automatique pour le trading @ Udacity Je participe. J'ai découvert les indicateurs de cours de bourse $ \ alpha $ et $ \ beta $, donc sur pandas + matplotlib J'ai animé le changement d'heure et joué avec. L'objectif est le top 10 des actions du World Market Value Ranking en février 2017. Github est ici. Comme vous pouvez le voir, je suis un amateur, alors je vous serais reconnaissant de bien vouloir signaler des erreurs ou des lacunes.

ab_optimized.gif

2. Environnement

2-1. Obtention de données sur le cours des actions

Étant donné que les données quotidiennes sur le cours des actions sont utilisées, il est nécessaire de les obtenir à l'avance. Par exemple, vous pouvez l'obtenir depuis YAHOO! FINANCE en suivant la procédure suivante. Veuillez noter que ** le scraping est une violation des règles **.

  1. Accédez à la page récapitulative de l'action cible (Exemple: google ( GOOG.csv))
  2. Cliquez sur `` Données historiques '' en haut de la page.
  3. Confirmez que Période: '' est la période souhaitée et Fréquence: '' est Quotidien '', et cliquez sur Télécharger les données ''.
  4. Renommez le fichier selon vos besoins (par exemple table.csv GOOG.csv).

Dans cet article, nous supposerons que les données boursières telles que GOOG.csv sont stockées dans le répertoire `` data / ''.

2-2. python

Puisque pandas est utilisé pour la mise en forme des données et matplotlib est utilisé pour l'animation, il est nécessaire de l'installer à l'avance. Nous avons confirmé l'opération dans l'environnement suivant.

3. Indice d'évaluation

3-1. daily-return

Pour faire simple, le rendement quotidien $ r $ est le changement par rapport au jour précédent du cours de l'action. À proprement parler, il est défini par la formule suivante. Ici, $ x [t] $ représente le cours de clôture ajusté à la date $ t $.

r = \frac{x[t]}{x[t-1]} - 1 

Avec les pandas, vous pouvez facilement calculer le rendement quotidien. Pour plus de détails, veuillez consulter Machine learning for trading @ Udacity. Pour votre information, le rendement quotidien de GOOG du 1er décembre 2006 au 1er décembre 2016 est le suivant. Il est montré dans.

goog.png

3-2. Valeurs alpha et bêta

En comparant le rendement quotidien avec la moyenne du marché, vous pouvez évaluer les caractéristiques de l'action. Ici, SPY est supposé être la moyenne du marché, et SPY Dessinez un diagramme de dispersion de retour quotidien de quote / SPY? P = SPY) et GOOG et tracez une droite de régression. Je vais. La période va du 1er décembre 2006 au 1er décembre 2016.

figure_3.png

La section de cette droite de régression $ y = \ beta x + \ alpha $ est appelée ** valeur alpha **, et la pente est appelée ** valeur beta **. Lorsqu'une action correspond à la moyenne du marché, la ligne de régression doit correspondre à la ligne droite $ y = x $, c'est-à-dire $ \ alpha = 0 $ et $ \ beta = 1 $. Plus le $ \ alpha $ est élevé, plus le rendement excédentaire par rapport à la moyenne du marché est élevé, et plus le $ \ beta $ est élevé, plus le lien avec la moyenne du marché est important. À propos, dans le cas de la figure ci-dessus, c'est $ \ alpha = 0,000309329688614 $, $ \ beta = 0,917720842929 $. $ \ Alpha $ et $ \ beta $ sont des indicateurs utilisés pour évaluer les rendements actifs et passifs des actions individuelles.

4. Évaluation

Utilisez matplotlib pour animer la transition entre les valeurs alpha et bêta. L'objectif est les 10 principales actions suivantes dans le World Market Value Ranking en février 2017. Pour l'industrie, j'ai fait référence à Wikipedia. Je n'ai pas assez de connaissances, donc je n'ai aucune considération particulière. Tout ce que vous avez à faire est de regarder les résultats et les illusions.

# symbol Nom de la compagnie Industrie
1 AAPL Apple Équipement électrique
2 GOOG Alphabet conglomérat
3 MSFT Microsoft Industrie de l'information et de la communication
4 BRK-A Berkshire Hathaway Entreprise d'assurance
5 AMZN Amazon.com Commerce de détail
6 FB Facebook l'Internet
7 XON Exxon Mobil Produits pétroliers et houillers
8 JNJ Johnson & Johnson Industrie du service
9 JPM JPMorgan Chase Autre secteur financier
10 WFC Wells Fargo Secteur financier

4-1. Prétraitement

Lisez les informations sur le cours de l'action dans le fichier csv et calculez le rendement quotidien. Dans cet article, nous utilisons la fonction suivante [^ license] introduite dans Udacity.

4-2. Animé

J'ai créé une fonction pour animer $ \ alpha $ et $ \ beta $. Avec les paramètres par défaut, les valeurs des 10 actions ci-dessus («symboles») du 1er décembre 2006 («date_début») au 1er décembre 2016 («date_end») sont basées sur les données des deux dernières années («période»). Est calculé. Tout en décalant la plage de calcul de 10 jours (ʻinterval), dessinez une image à la fois avec ʻanimate_polyfit () et sortez ʻab.gif. La taille de la légende représente la taille du coefficient de corrélation entre «SPY» et le problème concerné. La date en haut à droite du graphique représente le dernier jour de la plage de calcul. En d'autres termes, la valeur calculée à partir de la date en haut à droite sur la base des données des derniers jours de «période» est affichée. De plus, il est nécessaire de mettre le fichier csv de chaque marque dans le répertoire data. Notez également que ʻudacity.py, qui définit les fonctions de la section 4.1, doit être placé dans le même répertoire.

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as ani
import matplotlib.cm as cm
import udacity  # Functions defined in "Machine learning for trading"


def animate_a_b(
        symbols=["AAPL", "GOOG", "MSFT", "BRK-A", "AMZN",
                 "FB", "XOM", "JNJ", "JPM", "WFC"],
        start_date="2006-12-01", end_date="2016-12-01",
        period=252 * 2):

    """ --- Preprocess: You have to take Udacity! --- """
    # Read data
    dates = pd.date_range(start_date, end_date)  # date range as index
    stock_data = udacity.get_data(symbols, dates)  # get data for each symbol

    # Fill missing values
    udacity.fill_missing_values(stock_data)
    # Daily returns
    daily_returns = udacity.compute_daily_returns(stock_data)

    """ --- Make animation --- """
    interval = 10  # Nframe interval
    frames = (len(stock_data) - period) / interval  # Num of frames
    markers = ["o", "^", "s"]

    def animate_polyfit(nframe):

        plt.clf()
        daily_returns_p = daily_returns[
            nframe * interval: nframe * interval + period]
        corr = daily_returns_p.corr(method="pearson")

        xmin, xmax = -0.003, 0.003
        ymin, ymax = 0.0, 2.0

        plt.plot([0, 0], [ymin, ymax], '--', color='black')
        plt.plot([xmin, xmax], [1, 1], '--', color='black')
        for n, symbol in enumerate(symbols[1:]):
            beta, alpha = np.polyfit(daily_returns_p["SPY"],
                                     daily_returns_p[symbol], 1)
            plt.plot(alpha, beta, markers[n % len(markers)], alpha=0.7,
                     label=symbol, color=cm.jet(n * 1. / len(symbols)),
                     ms=np.absolute(corr.ix[0, n + 1]) * 25)
        plt.xlim([xmin, xmax])
        plt.ylim([ymin, ymax])
        plt.xlabel("Alpha")
        plt.ylabel("Beta")
        plt.text(xmax, ymax, str(daily_returns_p.index[-1]),
                 ha="right", va="bottom")
        plt.legend(loc="upper left")

    fig = plt.figure(figsize=(8, 8))
    anim = ani.FuncAnimation(fig, animate_polyfit, frames=frames)
    anim.save("ab.gif", writer="imagemagick", fps=18)

ab_optimized.gif

Autour du choc Lehman autour de 2008, deux marques du secteur financier («JPM», «WFC») sont excitées ... À propos, «FB» est une entreprise relativement jeune, elle apparaîtra donc au milieu de l'animation.

5. Conclusion

J'ai essayé d'animer la transition de $ \ alpha $ et $ \ beta $ avec pandas + matplotlib. Outre son utilisation, l'animation peut être un moyen d'exprimer intuitivement le changement de temps d'indicateurs de deux dimensions ou plus [^ anime]. J'aimerais continuer à suivre ce cours et présenter tous les articles sur lesquels je peux écrire. Merci d'avoir lu jusqu'au bout!

[^ license]: Le code source n'est pas publié pour éviter les problèmes de droits. Ceci est un cours gratuit, alors suivez-le!

[^ anime]: En fait, je me souviens avoir vu une présentation utilisant un anime 100 fois plus cool que celui-ci chez TED, alors j'ai essayé de l'imiter. Je ne me souviens pas des détails, mais j'ai expliqué les mouvements des principaux pays autour du PIB et quelque chose.

Appendix. Trendalyzer Comme vous l'avez souligné dans les commentaires, la source de cet article est [Trendalyzer] de Hans Rosling (https://www.gapminder.org/tag/trendalyzer/). Trendalyzer peut être utilisé comme Motion Graph dans une feuille de calcul Google, alors j'ai essayé de l'utiliser. La feuille de calcul est disponible à l'adresse ici, alors n'hésitez pas à l'utiliser. Le corps de données est placé sur la feuille 1 et le graphique de mouvement est placé sur la feuille 2.

A-1. Préparation

J'ai enregistré le résultat du calcul au format Excel afin de pouvoir l'ouvrir avec une feuille de calcul Google. Créez pandas.DataFrame selon le Format [^ format] pour le graphique de mouvement.

save_a_b()


def save_a_b(
        symbols=["AAPL", "GOOG", "MSFT", "BRK-A", "AMZN",
                 "FB", "XOM", "JNJ", "JPM", "WFC"],
        start_date="2006-12-01", end_date="2016-12-01",
        period=252 * 2):

    """ --- Preprocess: You have to take Udacity! --- """
    # Read data
    dates = pd.date_range(start_date, end_date)  # date range as index
    stock_data = udacity.get_data(symbols, dates)  # get data for each symbol

    # Fill missing values
    udacity.fill_missing_values(stock_data)
    # Daily returns
    daily_returns = udacity.compute_daily_returns(stock_data)

    """ --- Calculate spreadsheet of alpha and beta ---"""
    sheet = pd.DataFrame(columns=["Symbol", "Date", "Alpha", "Beta", "Color",
                                  "Size"])
    interval = 10  # Nframe interval
    frames = (len(stock_data) - period) / interval  # Num of frames

    for nframe in range(frames):

        daily_returns_p = daily_returns[
            nframe * interval: nframe * interval + period]
        corr = daily_returns_p.corr(method="pearson")

        for n, symbol in enumerate(symbols[1:]):
            beta, alpha = np.polyfit(daily_returns_p["SPY"],
                                     daily_returns_p[symbol], 1)

            new_row = pd.DataFrame(
                [[symbol, daily_returns_p.index[-1].strftime("%Y/%m/%d"),
                  alpha, beta, n, np.absolute(corr.ix[0, n + 1]) * 25]],
                columns=sheet.columns)
            sheet = sheet.append(new_row, ignore_index=True)

    sheet.to_excel("ab.xlsx")

[^ format]: Je produis au format % m /% d /% Y, mais j'en étais accro car Google Teacher ne l'a pas converti en un graphique animé. Après tout, il a été résolu en sortant au format % Y /% m /% d et en spécifiant date dans format d'affichage> nombre dans la feuille de calcul Google. Je ne suis pas sûr ...: arc:

A-2. J'ai joué

Appuyez sur le bouton Démarrer pour démarrer l'animation. Il est également possible de modifier la vitesse de l'animation.

ab_resize.gif

Utilisez la barre de temps pour avancer et reculer rapidement à volonté. Vous pouvez afficher la trajectoire en sélectionnant une marque spécifique. Hou la la!

select_resize.gif

référence

En créant cet article, j'ai fait référence à ce qui suit. Merci beaucoup!

Recommended Posts

Animez les valeurs alpha et bêta des principales valeurs boursières mondiales avec pandas + matplotlib
Calculer la somme des valeurs uniques par tabulation croisée des pandas
Reformatez l'axe des temps du graphique de la série chronologique des pandas avec matplotlib
Ajustez la largeur du bac de manière nette et précise avec l'histogramme de matplotlib et seaborn
Alignez la taille de la barre de couleurs avec matplotlib
Obtenez les nièmes valeurs les plus importantes dans Pandas
Remplissez la valeur manquante (null) de DataFrame avec les valeurs avant et après avec pyspark
J'ai comparé la moyenne mobile du type de filtre IIR avec les pandas et scipy
Augmentez la taille de la police du graphique avec matplotlib
Implémentez "Data Visualization Design # 3" avec pandas et matplotlib
Analysez les journaux d'accès Apache avec Pandas et Matplotlib
Regroupez les valeurs VIP de Smash Bra avec les pandas
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python