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.
J'ai essayé d'obtenir les données à travers les trois étapes suivantes.
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.
En guise de solution, j'ai passé au crible une instruction if en fonction du tableau que je voulais obtenir.
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.
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.
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