[PYTHON] Erfassung von Zeitreihendaten (täglich) von Aktienkursen

Ich möchte tägliche Bestandsdaten mit Python erhalten

Plötzlich wollte ich die Aktienkursdaten analysieren, also dachte ich darüber nach, wie es geht. Da ich keine Vorkenntnisse über Aktien habe, muss ich dies möglicherweise nicht wirklich tun. Aber ich konnte es bekommen, also werde ich es vorerst veröffentlichen.

Methode

Ich habe versucht, die Daten durch die folgenden drei Schritte zu erhalten.

1. 1. Holen Sie sich tägliche Daten mit pandas.read_html

Ich wollte keine seltsame Site verwenden und habe mich daher entschlossen, die Daten von Yahoo Fainance zu lesen.

pandas.read_html extrahiert "das ist wie eine Tabelle" aus HTML. Der Rückgabewert ist also eine Liste mit einem Datenrahmen.

Yahoo Fainance ist eine Seite wie die im Bild unten, und offensichtlich gibt es nur eine Tabelle. Da jedoch nur die tabellenähnlichen extrahiert werden, werden auch Orte wie "Panasonic Co., Ltd. 978.5 im Vergleich zum Vortag ..." extrahiert. Machen.

image.png

Als Lösung habe ich mit einer if-Anweisung gemäß der Tabelle gesiebt, die ich erhalten wollte.

2. Holen Sie sich aufeinanderfolgende Daten mit der Funktion datetime

Um die Daten für den gewünschten Zeitraum abzurufen, müssen Sie den Zeitraum mit URL angeben. Yahoo Fainance kann nur 20 Daten gleichzeitig anzeigen. Wenn Sie 20 oder weniger Daten möchten, können Sie alle Daten abrufen, indem Sie das angegebene Datum in die URL einbetten. Wenn Sie jedoch mehr Daten wünschen, können Sie diese nicht gut abrufen.

Daher habe ich darüber nachgedacht, eine Funktion zu erstellen, die eine Datumsdatenliste für einen bestimmten Zeitraum erstellt, damit diese auch während eines Zwischenzeitraums angegeben werden kann.

daterange.py


from datetime import datetime
from datetime import timedelta

def daterange(start, end):
	# -----make list of "date"---------------------------
	for n in range((end - start).days):
		yield start + timedelta(n)
	#----------------------------------------------------
	
start = datetime.strptime(str(day_start), '%Y-%m-%d').date()
end   = datetime.strptime(str(day_end), '%Y-%m-%d').date()

list_days = [i for i in daterange(start, end)]


Hier werden Start und Ende als tatetime-Funktionen bezeichnet, bei denen es sich nur um Datumsfunktionen handelt. Es kann nicht addiert oder subtrahiert werden.

datetime.html(n)

datetime.delta wird zum Hinzufügen und Subtrahieren von Daten für die datetime-Funktion verwendet. Da das erste Argument Tage ist, wird hier die Anzahl der Tage von Anfang bis Ende Tag für Tag addiert und ergibt.

Einige Leute kennen die Funktion Yield möglicherweise nicht. Um dies zu erklären, ist Yield eine Funktion, die den Rückgabewert in kleinen Stücken zurückgeben kann. Hier gibt es nicht viel Verdienst, aber eine Funktion, die eine große Liste auf einmal zurückgibt, verbraucht viel Speicher auf einmal, sodass die Ausbeute in solchen Fällen zur Reduzierung des Speicherverbrauchs beiträgt. Werde dir geben.

Grafikvisualisierung

Es war in Ordnung, es normal anzuzeigen, aber ich habe auch versucht, ein Diagramm mit fft (Hochgeschwindigkeits-Fourier-Transformation) anzuzeigen, um die Zeit totzuschlagen.

Figure_1.png

Endlich der Code

Darüber hinaus sind auch die durchschnittlichen Markencodes von Panasonic, Sony und Japan aufgeführt. Verwenden Sie diese daher bitte.

get_stock.py



import pandas
import numpy as np
import matplotlib.pyplot as plt
import csv

from datetime import datetime
from datetime import timedelta





def get_stock_df(code, day_start, day_end):# (Stock Code, start y-m-d, end y-m-d)
	# -----colmn name------------------------------------
	#Datum, Eröffnungskurs, hoher Preis, niedriger Preis, Schlusskurs, Volumen, bereinigter Schlusskurs
	#Date, Open, High, Low, Close, Volume, Adjusted Close
	#----------------------------------------------------
	print("<<< Start stock data acquisition >>>")
	print("code:{0}, from {1} to {2}".format(code, day_start, day_end))

	def get_stock_df_under20(code, day_start, day_end):# (Stock Code, start y-m-d, end y-m-d)
		# -----source: Yahoo Finance----------------------------
		# Up to 20 data can be displayed on the site at one time
		#-------------------------------------------------------

		sy,sm,sd = str(day_start).split('-')
		ey,em,ed = str(day_end).split('-')

		url="https://info.finance.yahoo.co.jp/history/?code={0}&sy={1}&sm={2}&sd={3}&ey={4}&em={5}&ed={6}&tm=d".format(code,sy,sm,sd,ey,em,ed)

		list_df = pandas.read_html(url,header=0)
		
		for i in range(len(list_df)):
			if list_df[i].columns[0] == "Datum":
				df = list_df[i]
		
		return df.iloc[::-1]
		#-------------------------------------------------------


	def daterange(start, end):
		# -----make list of "date"---------------------------
		for n in range((end - start).days):
			yield start + timedelta(n)
		#----------------------------------------------------

	
	start = datetime.strptime(str(day_start), '%Y-%m-%d').date()
	end   = datetime.strptime(str(day_end), '%Y-%m-%d').date()
	
	list_days = [i for i in daterange(start, end)]
	
	pages = len(list_days) // 20
	mod = len(list_days) % 20

	if mod == 0:
		pages = pages -1
		mod = 20
	
	start = datetime.strptime(str(day_start), '%Y-%m-%d').date()
	end   = datetime.strptime(str(day_end), '%Y-%m-%d').date()

	df_main = get_stock_df_under20(code, list_days[0], list_days[mod-1])

	for p in range(pages):
		df = get_stock_df_under20(code, list_days[20*p + mod], list_days[20*(p+1) + mod-1])
		df_main = pandas.concat([df_main, df])

	print("<<< Completed >>> ({0}days)".format(len(df_main)))
	return df_main





def graphing(f, dt):

	#Datenparameter
	N = len(f)           #Anzahl von Beispielen
	dt = 1        #Abtastintervall
	t = np.arange(0, N*dt, dt) #Zeitachse
	freq = np.linspace(0, 1.0/dt, N) #Frequenzachse

	#Schnelle Fourier-Transformation
	F = np.fft.fft(f)

	#Berechnen Sie das Amplitudenspektrum
	Amp = np.abs(F)

	#Grafikanzeige
	plt.figure(figsize=(14,6))
	plt.rcParams['font.family'] = 'Times New Roman'
	plt.rcParams['font.size'] = 17
	plt.subplot(121)
	plt.plot(t, f, label='f(n)')
	plt.xlabel("Time", fontsize=20)
	plt.ylabel("Signal", fontsize=20)
	plt.grid()
	leg = plt.legend(loc=1, fontsize=25)
	leg.get_frame().set_alpha(1)
	plt.subplot(122)
	plt.plot(freq, Amp, label='|F(k)|')
	plt.xlabel('Frequency', fontsize=20)
	plt.ylabel('Amplitude', fontsize=20)
	plt.ylim(0,1000)
	plt.grid()
	leg = plt.legend(loc=1, fontsize=25)
	leg.get_frame().set_alpha(1)
	plt.show()





nikkei = "998407.O"
panasonic = "6752.T"
sony = "6758.T"

# code info "https://info.finance.yahoo.co.jp/history/?code="





df = get_stock_df(panasonic,"2016-5-23","2019-5-23")
#graphing(df["Schlusskurs"],1)
csv = df.to_csv('./panasonic.csv', encoding='utf_8_sig')




Recommended Posts

Erfassung von Zeitreihendaten (täglich) von Aktienkursen
Differenzierung von Zeitreihendaten (diskret)
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Glättung von Zeitreihen und Wellenformdaten 3 Methoden (Glättung)
Zeigen Sie Details zu Zeitreihendaten mit Remotte an
Automatische Erfassung von Aktienkursdaten mit Docker-Compose
Abnormalitätserkennung von Zeitreihendaten durch LSTM (Keras)
[Python] Zeichnen Sie Zeitreihendaten
Tipps zur Erfassung von Aktienkursdaten
Eine Geschichte über das Clustering von Zeitreihendaten des Austauschs
Berechnung der Zeitreihen-Kundenbindung
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Über Zeitreihendaten und Übertraining
So extrahieren Sie Funktionen von Zeitreihendaten mit PySpark Basics
Vergleich der Vorhersage von Zeitreihendaten zwischen dem SARIMA-Modell und dem Prophet-Modell
Automatische Erfassung von Aktienkursen mit Python
[Für Anfänger] Skript innerhalb von 10 Zeilen (5. Resample von Zeitreihendaten mit Pandas)
Vorhersage von Zeitreihendaten mit einem neuronalen Netzwerk
Leistungsfähigkeit von Vorhersagemethoden in der Zeitreihendatenanalyse Halboptimierung (SARIMA) [Memo]
Erfassung von Pflanzenwachstumsdaten Erfassung von Daten von Sensoren
[Python] Beschleunigt das Laden von Zeitreihen-CSV
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
Erkennung von Zeitreihendatenanomalien für Anfänger
Zeichnen Sie die CSV von Zeitreihendaten mit einem Unixtime-Wert in Python (matplotlib).
Konvertierung von Zeitdaten in 25-Uhr-Notation
[Kaggle] Ich habe versucht, mithilfe von tsfresh das Feature-Quantity-Engineering mehrdimensionaler Zeitreihendaten durchzuführen
Umgang mit Zeitreihendaten (Implementierung)
OpenFOAM-Zeitreihendaten lesen und Daten einstellen
Holen Sie sich mit Python Zeitreihendaten von k-db.com
Memorandum (Erfassung / Konvertierung der "benutzerdefinierten" Zeit, Kreuztabelle)
Zusammenfassung der Kaggle-Kernel-Methode [Tabelle Zeitreihendaten]
Lesen von Zeitreihendaten in PyTorch
Aktienkursprognose mit Deep Learning [Datenerfassung]
Zeitmessung
Zeitreihenzerlegung
[Neueste Methode] Visualisierung von Zeitreihendaten und Extraktion häufiger Muster mithilfe des Pan-Matrix-Profils
Implementierung der Clustering-K-Form-Methode für Zeitreihendaten [Unüberwachtes Lernen mit Python Kapitel 13]
"Abrufen von Zeitreihendaten von k-db.com mit Python" Memo zur Erstellung der Programmumgebung
Merkmalsmenge, die aus Zeitreihendaten extrahiert werden kann
Prognostizieren Sie die Aktienkurse durch Big-Data-Analyse aus früheren Daten
Vorhersage von Zeitreihendaten durch AutoML (automatisches maschinelles Lernen)
[Zeitreihen mit Handlung] Dynamische Visualisierung mit Handlung [Python, Aktienkurs]
"Zeitreihenanalyse von Wirtschafts- und Finanzdaten messen" Das Problem am Ende des Kapitels mit Python lösen
So berechnen Sie die Summe oder den Durchschnitt von Zeitreihen-CSV-Daten in einem Augenblick
Was Sie bei der Zeitreihendatenanalyse (einschließlich Reflexion) nicht tun sollten