[PYTHON] Acquisition de données chronologiques (quotidiennes) des cours des actions

Je souhaite obtenir des données boursières quotidiennes avec python

Du coup, j'ai voulu analyser les données de cours de bourse, alors j'ai réfléchi à la façon de le faire. Comme je n'ai pas de connaissances préalables sur les stocks, je n'ai peut-être pas vraiment à le faire. Mais j'ai pu l'obtenir, je vais donc le publier pour l'instant.

Méthode

J'ai essayé d'obtenir les données à travers les trois étapes suivantes.

1. 1. Obtenez des données quotidiennes avec pandas.read_html

Je ne voulais pas utiliser un site étrange, j'ai donc décidé de lire les données de Yahoo Fainance.

pandas.read_html extrait "c'est comme une table" de html. La valeur de retour est donc une liste avec un dataframe.

Yahoo Fainance est une page comme celle de l'image ci-dessous, et il n'y a évidemment qu'un seul tableau, mais comme il extrait uniquement les tableaux, il extrait également des endroits comme "Panasonic Co., Ltd. 978.5 par rapport à la veille ..." Faire.

image.png

En guise de solution, j'ai passé au crible une instruction if en fonction du tableau que je voulais obtenir.

2. Obtenez des dates consécutives avec la fonction datetime

Pour obtenir les données pour la période souhaitée, vous devez spécifier la période avec l'url. Yahoo Fainance est limité à l'affichage de 20 données à la fois. Si vous voulez 20 données ou moins, vous pouvez obtenir toutes les données simplement en incorporant la date donnée dans l'URL, mais si vous voulez plus de données, vous ne pouvez pas les obtenir correctement.

Par conséquent, j'ai pensé à créer une fonction qui crée une liste de données de date pour une période spécifiée afin qu'elle puisse être spécifiée même pendant une période intermédiaire.

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)]


Ici, le début et la fin sont appelés fonctions tatetime, qui sont des fonctions de date uniquement. Il ne peut pas être ajouté ou soustrait.

datetime.html(n)

datetime.delta est utilisé pour ajouter et soustraire des dates pour la fonction datetime. Comme le premier argument est jours, ici, le nombre de jours du début à la fin est ajouté un jour à la fois et produit.

Certaines personnes peuvent ne pas être familières avec la fonction appelée yield, donc pour expliquer, yield est une fonction qui peut renvoyer la valeur de retour en petits morceaux. Il n'y a pas beaucoup de mérite ici, mais une fonction qui renvoie une grande liste à la fois consomme beaucoup de mémoire à la fois, donc le rendement contribue à réduire la consommation de mémoire dans de tels cas. Te donnera.

Visualisation graphique

C'était correct de l'afficher normalement, mais j'ai également essayé d'afficher un graphique avec fft (transformée de Fourier à grande vitesse) pour tuer le temps.

Figure_1.png

Enfin le code

En outre, les codes de marques moyennes Panasonic, Sony et japonais sont également répertoriés, veuillez donc les utiliser.

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------------------------------------
	#Date, prix d'ouverture, prix élevé, prix bas, prix de clôture, volume, prix de clôture ajusté
	#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] == "Date":
				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):

	#Paramètres de données
	N = len(f)           #Le nombre d'échantillons
	dt = 1        #Intervalle d'échantillonnage
	t = np.arange(0, N*dt, dt) #Axe du temps
	freq = np.linspace(0, 1.0/dt, N) #Axe de fréquence

	#Transformée de Fourier Rapide
	F = np.fft.fft(f)

	#Calculer le spectre d'amplitude
	Amp = np.abs(F)

	#affichage graphique
	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["le dernier prix"],1)
csv = df.to_csv('./panasonic.csv', encoding='utf_8_sig')




Recommended Posts

Acquisition de données chronologiques (quotidiennes) des cours des actions
Différenciation des données de séries chronologiques (discrètes)
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
Voir les détails des données de séries chronologiques dans Remotte
Acquisition automatique des données de cours des actions avec docker-compose
Détection d'anomalies des données de séries chronologiques par LSTM (Keras)
[Python] Tracer des données de séries chronologiques
Conseils d'acquisition de données de cours de bourse
Une histoire de regroupement de données de séries chronologiques d'échange
Calcul de la fidélité des clients dans les séries chronologiques
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
À propos des données de séries chronologiques et du surentraînement
Comment extraire des fonctionnalités de données de séries chronologiques avec les bases de PySpark
Comparaison de la prédiction des données de séries chronologiques entre le modèle SARIMA et le modèle Prophet
Collecte automatique des cours boursiers à l'aide de python
[Pour les débutants] Script dans les 10 lignes (5. Rééchantillonnage des données de séries chronologiques à l'aide de pandas)
Prédire les données de séries chronologiques avec un réseau neuronal
Puissance des méthodes de prédiction dans l'analyse de données chronologiques Semi-optimisation (SARIMA) [Memo]
Acquisition des données de croissance des plantes Acquisition des données des capteurs
[Python] Accélère le chargement du fichier CSV de séries chronologiques
Analyse des séries chronologiques 4 Construction du modèle SARIMA
Détection d'anomalies de données chronologiques pour les débutants
Tracer CSV de données de séries temporelles avec une valeur unixtime en Python (matplotlib)
Conversion des données de temps en notation 25 heures
[Kaggle] J'ai essayé l'ingénierie de quantité de caractéristiques de données de séries chronologiques multidimensionnelles à l'aide de tsfresh
Comment gérer les données de séries chronologiques (mise en œuvre)
Lecture des données de séries chronologiques OpenFOAM et des ensembles de données
Obtenez des données de séries chronologiques de k-db.com avec Python
Mémorandum (acquisition / conversion du temps "défini par l'utilisateur", tabulation croisée)
Résumé de la méthode Kaggle's Kernel [Table time series data]
Comment lire les données de séries chronologiques dans PyTorch
Prévision du cours de l'action à l'aide du Deep Learning [acquisition de données]
mesure du temps
Décomposition des séries temporelles
[Dernière méthode] Visualisation des données de séries chronologiques et extraction de modèles fréquents à l'aide du profil Pan-Matrix
Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
"Obtenir des données de séries chronologiques de stock à partir de k-db.com avec Python" Mémo de création d'environnement de programme
Quantité d'entités pouvant être extraite des données de séries chronologiques
Prédire les cours des actions par une analyse Big Data à partir des données passées
Prédiction de données chronologiques par AutoML (apprentissage automatique automatique)
[Série chronologique avec plotly] Visualisation dynamique avec plotly [python, cours boursier]
"Analyse des séries chronologiques de mesure des données économiques et financières" Résolution du problème de fin de chapitre avec Python
Comment calculer la somme ou la moyenne des données csv de séries chronologiques en un instant
Ce que vous ne devriez pas faire dans le processus d'analyse des données de séries chronologiques (y compris la réflexion)