[PYTHON] Animieren Sie die Alpha- und Beta-Werte der weltweit besten Marktwertaktien mit Pandas + Matplotlib

1. Zuallererst

Ich interessierte mich sowohl für maschinelles Lernen als auch für Finanztechnik und strebte daher zwei Fliegen mit einer Klappe an Maschinelles Lernen für den Handel mit Udacity. Ich nehme teil. Ich habe etwas über die Aktienkursindikatoren $ \ alpha $ und $ \ beta $ erfahren, also unter pandas + matplotlib Ich habe die Zeitumstellung animiert und damit gespielt. Das Ziel sind die Top 10 Aktien im World Market Value Ranking ab Februar 2017. Github ist hier. Wie Sie sehen, bin ich ein Amateur, daher würde ich mich freuen, wenn Sie auf Fehler oder Mängel hinweisen könnten.

ab_optimized.gif

2. Umwelt

2-1. Abrufen von Aktienkursdaten

Da tägliche Aktienkursdaten verwendet werden, ist es notwendig, diese im Voraus zu erhalten. Sie können es beispielsweise wie folgt von YAHOO! FINANCE erhalten. Bitte beachten Sie, dass ** Scraping einen Verstoß gegen die Regeln ** darstellt.

  1. Rufen Sie die Übersichtsseite des Zielbestands auf (Beispiel: [google ( toget.csv)]) (https://finance.yahoo.com/quote/GOOG?p=GOOG))
  2. Klicken Sie oben auf der Seite auf "Historische Daten".
  3. Bestätigen Sie, dass Zeitraum: der gewünschte Zeitraum ist und Häufigkeit: Täglich ist, und klicken Sie auf Daten herunterladen.
  4. Benennen Sie die Datei nach Bedarf um (z. B. table.csv toget.csv).

In diesem Artikel wird davon ausgegangen, dass Bestandsdaten wie "toget.csv" im Verzeichnis "data /" gespeichert sind.

2-2. python

Da pandas für die Datenformung und matplotlib für die Animation verwendet wird, muss es im Voraus installiert werden. Wir haben den Betrieb in der folgenden Umgebung bestätigt.

3. Bewertungsindex

3-1. daily-return

Einfach ausgedrückt ist die tägliche Rendite $ r $ die Änderung des Aktienkurses gegenüber dem Vortag. Genau genommen wird es durch die folgende Formel definiert. Hier repräsentiert $ x [t] $ den angepassten Schlusskurs am Datum $ t $.

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

Mit Pandas können Sie die tägliche Rendite leicht berechnen. Weitere Informationen finden Sie unter Maschinelles Lernen für den Handel mit Udacity. Als Referenz lautet die tägliche Rückgabe von toget vom 1. Dezember 2006 bis 1. Dezember 2016 wie folgt. Es wird in gezeigt.

goog.png

3-2 Alpha und Beta Werte

Durch Vergleichen der täglichen Rendite mit dem Marktdurchschnitt können Sie die Merkmale der Aktie bewerten. Hier wird angenommen, dass SPY der Marktdurchschnitt ist, und SPY Zeichnen Sie ein Streudiagramm für die tägliche Rendite von quote / SPY? P = SPY) und toget und zeichnen Sie eine Regressionslinie. Ich werde. Der Zeitraum ist vom 1. Dezember 2006 bis zum 1. Dezember 2016.

figure_3.png

Der Abschnitt dieser Regressionslinie $ y = \ beta x + \ alpha $ heißt ** Alpha-Wert **, und die Steigung heißt ** Beta-Wert **. Wenn eine Aktie dem Marktdurchschnitt entspricht, sollte die Regressionslinie mit der geraden Linie $ y = x $ übereinstimmen, dh $ \ alpha = 0 $ und $ \ beta = 1 $. Je größer $ \ alpha $ ist, desto größer ist die Überschussrendite zum Marktdurchschnitt, und je größer $ \ beta $ ist, desto größer ist die Verknüpfung mit dem Marktdurchschnitt. Übrigens ist es im Fall der obigen Abbildung $ \ alpha = 0,000309329688614 $, $ \ beta = 0,917720842929 $. $ \ Alpha $ und $ \ beta $ sind Indikatoren zur Bewertung der aktiven und passiven Rendite einzelner Aktien.

4. Bewertung

Verwenden Sie matplotlib, um den Übergang zwischen Alpha- und Beta-Werten zu animieren. Das Ziel sind die folgenden Top-10-Aktien im World Market Value Ranking ab Februar 2017. Für die Branche habe ich mich auf Wikipedia bezogen. Ich habe nicht genug Wissen, daher habe ich keine besonderen Überlegungen. Alles was Sie tun müssen, ist die Ergebnisse und die Täuschung zu betrachten.

# symbol Name der Firma Industrie
1 AAPL Apple Elektrische Ausrüstung
2 GOOG Alphabet Konglomerat
3 MSFT Microsoft Informations- und Kommunikationsindustrie
4 BRK-A Berkshire Hathaway Versicherungsgeschäft
5 AMZN Amazon.com Einzelhandelsgeschäft
6 FB Facebook das Internet
7 XON Exxon Mobil Öl- und Kohleprodukte
8 JNJ Johnson & Johnson Dienstleistungsbranche
9 JPM JPMorgan Chase Andere Finanzindustrie
10 WFC Wells Fargo Finanzindustrie

4-1. Vorbehandlung

Lesen Sie die Aktienkursinformationen aus der CSV-Datei und berechnen Sie die tägliche Rendite. In diesem Artikel verwenden wir die folgende Funktion [^ Lizenz], die in [Udacity] eingeführt wurde (https://www.udacity.com/course/machine-learning-for-trading--ud501).

4-2. Animiert

Ich habe eine Funktion zum Animieren von $ \ alpha $ und $ \ beta $ erstellt. Mit den Standardeinstellungen basieren die Werte für die oben genannten 10 Aktien ("Symbole") vom 1. Dezember 2006 ("Startdatum") bis zum 1. Dezember 2016 ("Enddatum") auf den Daten der letzten zwei Jahre ("Zeitraum"). Ist berechnet. Zeichnen Sie beim Verschieben des Berechnungsbereichs um 10 Tage ("Intervall") jeweils einen Frame mit "animate_polyfit ()" und geben Sie "ab.gif" aus. Die Größe der Legende gibt die Größe des Korrelationskoeffizienten zwischen "SPY" und dem relevanten Problem an. Das Datum oben rechts in der Grafik repräsentiert den letzten Tag des Berechnungsbereichs. Mit anderen Worten, der Wert, der aus dem Datum oben rechts berechnet wird und auf den Daten der letzten "Periodentage" basiert, wird angezeigt. Außerdem muss die CSV-Datei jeder Marke im Verzeichnis "data" abgelegt werden. Beachten Sie außerdem, dass udacity.py, das die Funktionen in Abschnitt 4.1 definiert, im selben Verzeichnis abgelegt werden muss.

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

Rund um den Lehman-Schock um 2008 sind zwei Aktien der Finanzbranche (JPM, WFC) aufgeregt ... Übrigens ist FB ein relativ junges Unternehmen, daher wird es in der Mitte der Animation erscheinen.

5. Schlussfolgerung

Ich habe versucht, den Übergang von $ \ alpha $ und $ \ beta $ mit pandas + matplotlib zu animieren. Abgesehen von seiner Verwendung kann Animation eine Möglichkeit sein, die zeitliche Änderung von Indikatoren mit zwei oder mehr Dimensionen intuitiv auszudrücken [^ anime]. Ich möchte diesen Kurs fortsetzen und alle Artikel vorstellen, über die ich schreiben kann. Vielen Dank für das Lesen bis zum Ende!

[^ Lizenz]: Der Quellcode wird nicht veröffentlicht, um Rechteprobleme zu vermeiden. Dies ist ein kostenloser Kurs, also nehmen Sie ihn bitte!

[^ anime]: Eigentlich erinnere ich mich, dass ich eine Präsentation mit einem Anime gesehen habe, der 100-mal cooler ist als dieser bei TED, also habe ich versucht, ihn nachzuahmen. Ich erinnere mich nicht an die Details, aber ich erklärte die Bewegungen der großen Länder um das BIP und so.

Appendix. Trendalyzer Wie Sie in den Kommentaren betont haben, ist die Quelle dieses Artikels Hans Roslings Trendalyzer. Trendalyzer kann als Motion Graph in Google Spreadsheet verwendet werden, daher habe ich versucht, es zu verwenden. Die Tabelle ist unter [hier] verfügbar (https://docs.google.com/spreadsheets/d/187NFdwv4-KocUyrpSZRqgu4a2tdDrHtS1BdpHrsPqDc/edit?usp=sharing). Sie können sie also gerne verwenden. Der Datenkörper wird auf Blatt 1 und das Bewegungsdiagramm auf Blatt 2 platziert.

A-1. Vorbereitung

Ich habe das Berechnungsergebnis im Excel-Format gespeichert, damit ich es mit einer Google-Tabelle öffnen kann. Erstellen Sie "pandas.DataFrame" gemäß Format [^ Format] für Bewegungsgraphen.

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]: Ich habe im Format% m /% d /% Y ausgegeben, war aber süchtig danach, weil Google Teacher es nicht in ein Bewegungsdiagramm konvertiert hat. Immerhin wurde es gelöst, indem im Format "% Y /% m /% d" ausgegeben und "Datum" im "Anzeigeformat> Nummer" in der Google-Tabelle angegeben wurde. Ich bin nicht sicher ...: Bogen:

A-2. Ich habe gespielt

Drücken Sie die Starttaste, um die Animation zu starten. Es ist auch möglich, die Geschwindigkeit der Animation zu ändern.

ab_resize.gif

Verwenden Sie die Zeitleiste, um nach Belieben vor- und zurückzuspulen. Sie können die Flugbahn anzeigen, indem Sie eine bestimmte Marke auswählen. Beeindruckend!

select_resize.gif

Referenz

Bei der Erstellung dieses Artikels habe ich auf Folgendes verwiesen. Vielen Dank!

Recommended Posts

Animieren Sie die Alpha- und Beta-Werte der weltweit besten Marktwertaktien mit Pandas + Matplotlib
Berechnen Sie die Summe der eindeutigen Werte durch Pandas-Kreuztabellen
Formatieren Sie die Zeitachse des Pandas-Zeitreihendiagramms mit matplotlib neu
Stellen Sie die Behälterbreite mit dem Histogramm von Matplotlib und Seaborn klar und ordentlich ein
Richten Sie die Größe der Farbleiste an der Matplotlib aus
Holen Sie sich die besten n-ten Werte in Pandas
Füllen Sie den fehlenden Wert (null) von DataFrame mit den Werten davor und danach mit pyspark
Ich habe den gleitenden Durchschnitt des IIR-Filtertyps mit Pandas und Scipy verglichen
Erhöhen Sie die Schriftgröße des Diagramms mit matplotlib
Implementieren Sie "Data Visualization Design # 3" mit Pandas und Matplotlib
Analysieren Sie Apache-Zugriffsprotokolle mit Pandas und Matplotlib
Aggregieren Sie VIP-Werte von Smash Bra mit Pandas
Lesen Sie die CSV-Datei mit dem Jupiter-Notizbuch und schreiben Sie die Grafik übereinander
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen