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.
Ich habe versucht, die Daten durch die folgenden drei Schritte zu erhalten.
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.
Als Lösung habe ich mit einer if-Anweisung gemäß der Tabelle gesiebt, die ich erhalten wollte.
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.
Es war in Ordnung, es normal anzuzeigen, aber ich habe auch versucht, ein Diagramm mit fft (Hochgeschwindigkeits-Fourier-Transformation) anzuzeigen, um die Zeit totzuschlagen.
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