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.
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.
toget.csv
)]) (https://finance.yahoo.com/quote/GOOG?p=GOOG))Zeitraum:
der gewünschte Zeitraum ist und Häufigkeit:
Täglich
ist, und klicken Sie auf Daten herunterladen
. 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-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.
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.
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.
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 |
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 |
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).
get_data (symbol)
: Eine Funktion, die den angepassten Schlusskurs aus der CSV-Datei von symbol
liest und im Format pandas.DataFrame
ausgibt.fill_missing_values (stock_data)
: Eine Funktion, die die Lücken in stock_data
( pandas.DataFrame
) ausfüllt.compute_daily_returns (stock_data)
: Eine Funktion, die die tägliche Rendite von stock_data
(pandas.DataFrame
) berechnet und mit pandas.DataFrame
ausgibt.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)
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.
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.
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:
Drücken Sie die Starttaste, um die Animation zu starten. Es ist auch möglich, die Geschwindigkeit der Animation zu ändern.
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!
Bei der Erstellung dieses Artikels habe ich auf Folgendes verwiesen. Vielen Dank!