Cet article est l'article du 22ème jour du Calendrier de l'Avent SFC 2019. Je me demandais sur quoi écrire, mais cette fois j'ai décidé de réécrire le code que j'ai écrit récemment et d'en faire un article.
Ces dernières années, avec le développement de divers logiciels et bibliothèques, les données sur le cours des actions sont devenues utilisées par les particuliers. Cependant, les données de cours des actions japonaises sont difficiles à gérer en raison de problèmes de droit d'auteur (voir ici pour plus de détails), de sorte qu'une grande quantité de données sur les cours des actions est actuellement disponible. Il n'y a aucun service qui vous permet de tout télécharger gratuitement en même temps.
Cependant, certains services vous permettent de télécharger des données quotidiennes pour chaque marque pendant un an. Par exemple, Stock Investment Memo et Buffett Code.
Ces services sont très utiles lorsque vous souhaitez analyser les cours boursiers pendant un an, mais ils sont un peu gênants car vous devez traiter un grand nombre de fichiers lorsque vous souhaitez analyser les cours boursiers sur plusieurs années.
Par conséquent, cette fois, rendons possible l'utilisation des données de cours de bourse pendant plusieurs années en créant un code qui combine plusieurs CSV téléchargés à partir de Stock Investment Memo. Faisons le. De plus, en utilisant le DataFrame of Pandas, qui est une bibliothèque Python, il est conçu pour être facile à utiliser lors de l'analyse avec Python tel quel.
Si vous lisez ce qui précède, vous vous demandez peut-être: "Y a-t-il un code pour la partie téléchargement?" À cet égard, bien sûr, il est possible d'automatiser, mais comme on ne sait pas si le grattage et l'automatisation sont autorisés sur le site de la note d'investissement en actions, je ne présenterai pas le code dans cet article.
Au lieu de cela, Désir de freelance est introduit ce code Vous pouvez entièrement automatiser le téléchargement en utilisant.
De plus, deux points doivent être modifiés à ce moment-là, ils sont donc décrits ci-dessous.
Il est recommandé de remplacer download_dir = 'C: \\ Python \\'
par download_dir = '. / Csv'
. En faisant cela, vous pouvez placer le fichier téléchargé dans le dossier directement sous le répertoire actuel.
Si vous souhaitez obtenir les données jusqu'en 2019 où elles se trouvent pour i dans la plage (année, 2019):
, obtenez les données jusqu'à pour i dans la plage (année, 2020):
, 2020 Si vous le souhaitez, vous devez l'augmenter d'un an comme «for i in range (year, 2021):».
Tout d'abord, téléchargez et enregistrez les données de cours d'une action spécifique pendant plusieurs années à partir de Stock Investment Memo en utilisant la méthode décrite ci-dessus.
-Assurez-vous de prendre le temps de télécharger __data et de ne pas mettre de charge sur le serveur. __ ・ S'il y a une fuite dans __ données, une erreur se produit, alors assurez-vous de télécharger toutes les données pour le nombre d'années requis. __ -Ne modifiez pas le nom file. __ - Rassemblez tous les fichiers dans un dossier et ne mettez pas les données de plusieurs marques dans le même dossier. __
Créez du code pour charger le csv téléchargé.
import pandas as pd
import codecs
def read_csv(file_name: str) -> pd.core.frame.DataFrame:
'''
kabuoji3.Nom de fichier du csv téléchargé depuis com[file_name]Spécifier et lire, formater et DataFrame[df]Renvoie comme.
'''
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 = "Date"
return df
Le code de caractère CSV qui peut être téléchargé dans le mémo d'investissement boursier est Shift_JIS
, donc si vous lisez le CSV de la manière habituelle, des caractères déformés peuvent apparaître. Pour éviter cela, ici, codecs
est utilisé pour spécifier le code de caractère pour ouvrir le fichier, et la fonctionread_csv ()
de pandas
est utilisée pour lire le CSV comme DataFrame
.
De plus, le fichier CSV téléchargé dans la note d'investissement en stock contient des informations sur la marque dans la partie d'en-tête, et les «colonnes» et «index» ne sont pas reconnus correctement, il inclut donc le processus de suppression de l'en-tête après les avoir directement spécifiés. Je vais. De plus, en effectuant le traitement to_datetime
sur la colonne date
de ʻindex, la date de ʻindex
peut être traitée telle quelle en tant que type datetime
.
Le résultat final est le «DataFrame» de «pandas», qui contient les données sur le cours de l'action pour un an.
Créez une liste de noms de fichiers CSV dans un dossier, puis reconnaissez et récupérez le nombre d'années de données de stock que chaque fichier contient.
from glob import glob
def get_price_data_by_year(year: int) -> pd.core.frame.DataFrame:
'''
Liste des fichiers dans le dossier[FILES_DICT]Année désignée à partir de[year]Se référer au nom de fichier du cours de l'action csv de, read et DataFrame[df]Renvoie comme.
'''
file_name = FILES_DICT[str(year)]
df = read_csv(file_name)
return df
if __name__ == "__main__":
#Spécifiez le répertoire du dossier contenant le CSV téléchargé (le chemin relatif ou le chemin absolu est acceptable, après le nom du dossier/*N'oubliez pas)
CSV_FOLDER_DIRECTORY = './csv/*'
#CSV ci-dessus_FOLDER_Dictionnaire de fichier CSV FICHIERS basés sur RÉPERTOIRE_Pièce qui crée automatiquement DICT (aucune modification requise)
FILES_DICT = {}
files = glob(CSV_FOLDER_DIRECTORY)
files.sort()
for file_name in files:
FILES_DICT[file_name[-8:-4]] = file_name
La partie CSV_FOLDER_DIRECTORY = '. / Csv / *'
spécifie le dossier dans lequel CSV est organisé. Vous pouvez spécifier un chemin relatif ou un chemin absolu, mais veillez à ajouter / * après le nom du dossier.
Dans le reste du processus, vous allez créer un dictionnaire de fichiers CSV FILES_DICT
. Il doit être défini comme une variable globale afin de pouvoir être référencé dans la fonction.
Le CSV qui peut être téléchargé dans le mémo d'investissement en stock est enregistré sous un nom tel que «7203_2012.csv». En extrayant la partie "2012" (années) de celle-ci, en créant un "Dictionnaire" avec la "clé" et la valeur du nom de fichier ", un fichier CSV contenant des données de cours boursier pour une année spécifique Vous pourrez facilement vous référer au nom.
Les données de cours boursier pour plusieurs années de l'année spécifiée à l'année spécifiée sont lues dans l'ordre, combinées et sorties comme une seule donnée.
def create_historical_data(open: int,last: int) -> pd.core.frame.DataFrame:
'''
Année désignée[open]Année désignée à partir de[last]Lire les données boursières, les combiner et les combiner en un seul DataFrame[df]Renvoie comme.
'''
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
Les données sur le cours de l'action de l'année spécifiée «ouverte» à l'année spécifiée «dernière» sont lues dans l'ordre, et le «DataFrame» obtenu est combiné en utilisant «pd.concat ()». Enfin, un DataFrame
avec toutes les données combinées est sorti. Si le fichier de l'année spécifiée n'existe pas, une erreur se produit. Veuillez vous assurer que vous avez téléchargé les données pendant le nombre d'années spécifié à l'avance avant de les exécuter.
Crée des données sur le cours de l'action pour le nombre d'années spécifié rétroactivement à partir de la date d'exécution et les génère sous forme de données uniques. Il s'agit d'une sortie en unités de dates, mais si la date qui correspond exactement au nombre d'années spécifié rétroactivement n'est pas le jour ouvrable de l'échange, le DataFrame
contenant les données sur le cours de l'action du jour ouvrable immédiatement après cela au présent est sorti. Sera fait. De même, si la date d'exécution n'est pas le jour ouvrable de l'échange, un DataFrame
contenant les données jusqu'au jour ouvrable précédent sera sorti.
import datetime as dt
from dateutil import relativedelta
def create_historical_data_by_date(years: int) -> pd.core.frame.DataFrame:
'''
Juste le nombre d'années spécifié à compter de la date d'exécution[years]Créez des données sur le cours de l'action et un DataFrame[df]Renvoie comme.
'''
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
D'abord, utilisez datetime
pour obtenir l'année en cours, puis utilisez create_historical_data () ʻ above pour obtenir les données de stock pour le nombre d'années spécifié
ans. Ensuite, en utilisant
relativedelta, nous obtenons la date qui est exactement le nombre d'années spécifié à partir du type présent dans
datetime. Puisque l '«index» du «DataFrame» obtenu à l'étape précédente a déjà été converti en type «datetime», vous pouvez facilement filtrer le «DataFrame» en utilisant l'opérateur de comparaison «> =». Vous pouvez récupérer des données pour le nombre d'années spécifié. Le résultat final est un
DataFrame` qui contient des données de stock pour le nombre d'années spécifié.
J'ai pu sortir les données que je voulais utiliser dans la section ci-dessus, mais pour gérer ces données en externe, je dois les enregistrer dans un fichier. Ici, à titre d'exemple, nous allons présenter comment enregistrer au format CSV.
if __name__ == "__main__":
#Lorsque vous souhaitez enregistrer les données de cours des actions de l'année spécifiée vers l'année spécifiée
df = create_historical_data(2015,2019)
df.to_csv("2015-2019.csv")
#Lorsque vous souhaitez enregistrer les données de stock pour le nombre d'années spécifié rétroactivement à partir de la date d'exécution
df = create_historical_data_by_date(5)
df.to_csv("5years_price.csv")
Tout d'abord, utilisez les fonctions telles que create_historical_data ()
et create_historical_data_by_date ()
créées dans la section ci-dessus, et enregistrez le résultat obtenu dans la variable df
. Ce df
peut être facilement exporté au format CSV en utilisant to_csv ()
, qui est une fonction de pandas
. De plus, il est nécessaire de spécifier le nom du fichier à sauvegarder à ce moment, et de passer la chaîne de caractères entre «» »« comme argument de «to_csv ()». Assurez-vous d'inclure «.csv» à la fin de ceci.
Le code de caractère du fichier sauvegardé à ce moment est ʻUTF-8, et le délimiteur est
,. Lors de l'importation avec Excel, sélectionnez
Données> Fichier texte` et spécifiez le code de caractère et le délimiteur.
Le code utilisé cette fois est publié sur GitHub. Si vous êtes intéressé, veuillez vérifier depuis ici.
Jusqu'à la fin Merci d'avoir lu. Nous espérons que votre analyse des stocks et Noël seront enrichis.