Dieser Artikel ist der Artikel zum 22. Tag von SFC Adventskalender 2019. Ich habe mich gefragt, worüber ich schreiben soll, aber dieses Mal habe ich beschlossen, den Code, den ich kürzlich geschrieben habe, neu zu schreiben und daraus einen Artikel zu machen.
In den letzten Jahren, mit der Entwicklung verschiedener Software und Bibliotheken, wurden Aktienkursdaten von Einzelpersonen verwendet. Die Aktienkursdaten japanischer Aktien sind jedoch aus urheberrechtlichen Gründen schwierig zu handhaben (siehe hier für Einzelheiten), sodass derzeit eine große Menge an Aktienkursdaten verfügbar ist. Es gibt keinen Dienst, mit dem Sie alle auf einmal kostenlos herunterladen können.
Es gibt jedoch einige Dienste, mit denen Sie ein Jahr lang tägliche Daten für jede Marke herunterladen können. Zum Beispiel Stock Investment Memo und Buffett Code.
Diese Dienste sind sehr nützlich, wenn Sie die Aktienkurse für ein Jahr analysieren möchten. Sie sind jedoch etwas unpraktisch, da Sie eine große Anzahl von Dateien verarbeiten müssen, wenn Sie die Aktienkurse für mehrere Jahre analysieren möchten.
Lassen Sie uns dieses Mal die Verwendung von Aktienkursdaten für mehrere Jahre ermöglichen, indem Sie einen Code erstellen, der mehrere CSVs kombiniert, die von Stock Investment Memo heruntergeladen wurden. Machen wir das. Durch die Verwendung des DataFrame von Pandas, einer Python-Bibliothek, ist die Verwendung bei der Analyse mit Python so wie sie ist einfach.
Wenn Sie das Obige lesen, fragen Sie sich möglicherweise: "Gibt es einen Code für den Download-Teil?" In dieser Hinsicht ist es natürlich möglich zu automatisieren, aber da unklar ist, ob Scraping und Automatisierung auf der Website des Stock Investment Memo zulässig sind, werde ich den Code in diesem Artikel nicht einführen.
Stattdessen wird Sehnsucht nach Freiberuflern dieser Code eingeführt. Sie können den Download mithilfe von vollständig automatisieren.
Darüber hinaus müssen zu diesem Zeitpunkt zwei Punkte geändert werden, sodass sie im Folgenden beschrieben werden.
Es wird empfohlen, "download_dir =" C: \ Python \ "durch" download_dir = ". / Csv" zu ersetzen. Auf diese Weise können Sie die heruntergeladene Datei im Ordner direkt unter dem aktuellen Verzeichnis ablegen.
Wenn Sie die Daten bis 2019 erhalten möchten, wo sie "für i in Reichweite" (Jahr 2019) sind: ", erhalten Sie die Daten bis" für i in Reichweite (Jahr 2020): ", 2020 Wenn Sie möchten, müssen Sie es um ein Jahr erhöhen, wie "für i in Reichweite (Jahr 2021):".
Laden Sie zunächst die Aktienkursdaten einer bestimmten Aktie für mehrere Jahre aus Stock Investment Memo herunter und speichern Sie sie mit der oben beschriebenen Methode.
Erstellen Sie Code zum Laden der heruntergeladenen CSV.
import pandas as pd
import codecs
def read_csv(file_name: str) -> pd.core.frame.DataFrame:
'''
kabuoji3.Dateiname von CSV von com heruntergeladen[file_name]Geben Sie an und lesen Sie, formatieren Sie und DataFrame[df]Rückgabe als.
'''
with codecs.open(file_name, 'r', 'Shift_JIS', 'ignore') as f:
df = pd.read_csv(f)
df.columns = df.iloc[0]
df.drop(df.index[[0,1]],inplace=True)
df.index = pd.to_datetime(df.index, format='%Y-%m-%d')
df.index.name = "Datum"
return df
Der CSV-Zeichencode, der in der Aktieninvestitionsnotiz heruntergeladen werden kann, lautet "Shift_JIS". Wenn Sie also die CSV auf die übliche Weise lesen, können verstümmelte Zeichen auftreten. Um dies zu verhindern, wird hier "Codecs" verwendet, um den Zeichencode zum Öffnen der Datei anzugeben, und "Pandas" -Funktion "read_csv ()" wird verwendet, um die CSV als "DataFrame" zu lesen. Darüber hinaus enthält die im Aktieninvestitionsprotokoll heruntergeladene CSV-Datei Markeninformationen im Kopfteil, und "Spalten" und "Index" werden nicht korrekt erkannt. Daher ist der Vorgang des Löschens des Kopfes nach direkter Angabe dieser enthalten. Ich werde. Darüber hinaus kann durch Ausführen der Verarbeitung "to_datetime" in der Spalte "date" von "index" das Datum von "index" so behandelt werden, wie es als Typ "datetime" ist. Die endgültige Ausgabe ist der "DataFrame" von "Pandas", der die Aktienkursdaten für ein Jahr enthält.
Erstellen Sie eine Liste mit CSV-Dateinamen in einem Ordner und erkennen Sie, wie viele Jahre Bestandsdaten jede Datei enthält.
from glob import glob
def get_price_data_by_year(year: int) -> pd.core.frame.DataFrame:
'''
Liste der Dateien im Ordner[FILES_DICT]Bestimmtes Jahr ab[year]Beziehen Sie sich auf den Dateinamen des Aktienkurs-CSV von, read und DataFrame[df]Rückgabe als.
'''
file_name = FILES_DICT[str(year)]
df = read_csv(file_name)
return df
if __name__ == "__main__":
#Geben Sie das Verzeichnis des Ordners an, der die heruntergeladene CSV enthält (relativer Pfad oder absoluter Pfad ist nach dem Ordnernamen zulässig)/*Vergiss nicht)
CSV_FOLDER_DIRECTORY = './csv/*'
#CSV oben_FOLDER_CSV-Dateiwörterbuch DATEIEN basierend auf VERZEICHNIS_Teil, der automatisch DICT erstellt (keine Bearbeitung erforderlich)
FILES_DICT = {}
files = glob(CSV_FOLDER_DIRECTORY)
files.sort()
for file_name in files:
FILES_DICT[file_name[-8:-4]] = file_name
Der Teil "CSV_FOLDER_DIRECTORY =". / Csv / * "gibt den Ordner an, in dem die CSV organisiert ist. Sie können entweder einen relativen oder einen absoluten Pfad angeben. Fügen Sie jedoch nach dem Ordnernamen / * hinzu. Im weiteren Verlauf des Prozesses erstellen Sie ein CSV-Dateiwörterbuch "FILES_DICT". Es sollte als globale Variable definiert werden, damit innerhalb der Funktion darauf verwiesen werden kann. Die CSV, die im Aktieninvestitionsprotokoll heruntergeladen werden kann, wird unter einem Namen wie "7203_2012.csv" gespeichert. Durch Extrahieren des Teils "2012" (Jahre) daraus, Erstellen eines "Wörterbuchs" mit dem "Schlüssel" und dem Dateinamen "Wert", einer CSV-Datei mit Aktienkursdaten für ein bestimmtes Jahr Sie können sich leicht auf den Namen beziehen.
Aktienkursdaten für mehrere Jahre vom angegebenen Jahr bis zum angegebenen Jahr werden der Reihe nach gelesen, kombiniert und als eine Daten ausgegeben.
def create_historical_data(open: int,last: int) -> pd.core.frame.DataFrame:
'''
Designiertes Jahr[open]Bestimmtes Jahr ab[last]Lesen Sie Bestandsdaten bis zu, kombinieren Sie sie und kombinieren Sie sie zu einem DataFrame[df]Rückgabe als.
'''
df = get_price_data_by_year(open)
for i in range(int(open) + 1,int(last) + 1):
df = pd.concat([df, get_price_data_by_year(i)])
return df
Aktienkursdaten vom angegebenen Jahr "offen" bis zum angegebenen Jahr "zuletzt" werden der Reihe nach gelesen, und der erhaltene "Datenrahmen" wird mit "pd.concat ()" kombiniert. Schließlich wird ein "DataFrame" mit allen kombinierten Daten ausgegeben. Wenn die Datei für das angegebene Jahr nicht vorhanden ist, tritt ein Fehler auf. Bitte stellen Sie sicher, dass Sie die Daten für die angegebene Anzahl von Jahren im Voraus heruntergeladen haben, bevor Sie sie ausführen.
Erstellt rückwirkend ab dem Ausführungsdatum Aktienkursdaten für die angegebene Anzahl von Jahren und gibt diese als eine Daten aus. Dies wird in Datumseinheiten ausgegeben, aber wenn das Datum, das genau die angegebene Anzahl von Jahren rückwirkend ist, nicht der Geschäftstag der Börse ist, wird "DataFrame" ausgegeben, das die Aktienkursdaten vom Geschäftstag unmittelbar danach bis zur Gegenwart enthält. Getan werden. Wenn das Ausführungsdatum nicht der Geschäftstag des Austauschs ist, wird in ähnlicher Weise ein "DataFrame" ausgegeben, der die Daten bis zum vorherigen Geschäftstag enthält.
import datetime as dt
from dateutil import relativedelta
def create_historical_data_by_date(years: int) -> pd.core.frame.DataFrame:
'''
Nur die angegebene Anzahl von Jahren ab dem Ausführungsdatum[years]Erstellen Sie winzige Aktienkursdaten und einen DataFrame[df]Rückgabe als.
'''
this_year = int(dt.datetime.now().year)
df = create_historical_data(this_year - years,this_year)
open = dt.datetime.now() - relativedelta.relativedelta(years=years)
df = df[df.index >= open]
return df
Verwenden Sie zuerst "datetime", um das aktuelle Jahr abzurufen, und verwenden Sie dann "create_historical_data ()" oben, um Bestandsdaten für die angegebene Anzahl von Jahren "abzurufen". Als nächstes erhalten wir mit "relativedelta" das Datum, das genau der angegebenen Anzahl von Jahren entspricht, ab dem Datum "datetime". Da der im vorherigen Schritt erhaltene "Index" des "DataFrame" bereits in den Typ "datetime" konvertiert wurde, können Sie den "DataFrame" mithilfe des Vergleichsoperators "> =" einfach filtern. Sie können Daten für die angegebene Anzahl von Jahren abrufen. Die endgültige Ausgabe ist ein "DataFrame", der Bestandsdaten für die angegebene Anzahl von Jahren enthält.
Ich konnte die Daten ausgeben, die ich im obigen Abschnitt verwenden wollte, aber um diese Daten extern zu verarbeiten, muss ich sie in einer Datei speichern. Als Beispiel stellen wir Ihnen vor, wie Sie in CSV speichern.
if __name__ == "__main__":
#Wenn Sie Aktienkursdaten vom angegebenen Jahr bis zum angegebenen Jahr speichern möchten
df = create_historical_data(2015,2019)
df.to_csv("2015-2019.csv")
#Wenn Sie Bestandsdaten für die angegebene Anzahl von Jahren rückwirkend ab dem Ausführungsdatum speichern möchten
df = create_historical_data_by_date(5)
df.to_csv("5years_price.csv")
Verwenden Sie zunächst die im obigen Abschnitt erstellten Funktionen wie "create_historical_data ()" und "create_historical_data_by_date ()" und speichern Sie das erhaltene Ergebnis in der Variablen "df". Dieses df
kann einfach als CSV mit to_csv ()
exportiert werden, was eine Funktion von pandas
ist. Außerdem muss der zu diesem Zeitpunkt zu speichernde Dateiname angegeben und die in "" "enthaltene Zeichenfolge als Argument von" to_csv () "übergeben werden. Stellen Sie sicher, dass am Ende ".csv" steht.
Der Zeichencode der zu diesem Zeitpunkt gespeicherten Datei lautet "UTF-8", und das Trennzeichen lautet ",". Wählen Sie beim Importieren mit Excel "Daten> Textdatei" und geben Sie den Zeichencode und das Trennzeichen an.
Der diesmal verwendete Code wird auf [GitHub] veröffentlicht (https://github.com/shota4/jp_stock_price_data/blob/master/edit_price_data.py). Wenn Sie interessiert sind, überprüfen Sie bitte von hier.
Bis zum Ende Danke fürs Lesen. Wir hoffen, dass Ihre Aktienanalyse und Weihnachten bereichert werden.
Recommended Posts