LoginSignup
5
8

More than 3 years have passed since last update.

PythonでYahoo!ファイナンスの時系列データをDBに登録する

Last updated at Posted at 2019-09-30

目次

株のデータ収集についての記事一覧をこちらに記載しております。

目的

  • Yahoo!ファイナンスから取得した時系列データをDBに登録する

使用する言語、ライブラリ等

  • Python3.7
  • Django(DBの登録に使用)
  • mysql

事前準備

※言語、ライブラリ等のインストール手順は省略しております。

  • Djangoをインストールする
  • Djangoにてプロジェクトとアプリケーションを作成する
  • DB(mysql)を準備する。

実装

DBスキーマの定義

models.pyを作成する。Djangoのmodels.pyの説明はこちらをご参照ください。

models.py
from django.db import models

class RawPrices(models.Model):
    code = models.IntegerField("銘柄コード")
    date = models.DateField("日付")
    open_price = models.IntegerField("始値")
    close_price = models.IntegerField("終値")
    high_price = models.IntegerField("高値")
    low_price = models.IntegerField("安値")
    volume = models.IntegerField("出来高")
    adjustment_close_price = models.FloatField("調整後終値")

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['code', 'date'], name='unique_code_dete'),

DBに適用する為に以下のコマンドを実行する。

python manage.py makemigrations
python manage.py migrate

adminサイトの設定

Djangoのadminサイトの使用方法についてはこちらをご参照ください。
admin.pyを作成する。

admin.py
from django.contrib import admin
from .models import RawPrices

class RawPricesAdmin(admin.ModelAdmin):
    list_display = ('code', 'date', 'open_price', 'close_price', 'high_price', 'low_price', 'volume', 'adjustment_close_price')

admin.site.register(RawPrices, RawPricesAdmin)

csvファイルからDBに取り込む

Djangoのカスタムコマンドを使用してDBに取り込む処理を実装します。Djangoのカスタムコマンドの使用方法についてはこちらをご参照ください。

csv_to_db.py
from django.core.management.base import BaseCommand
from django.conf import settings
from app.models import RawPrices
import csv
import glob
import os
import datetime
from django.db import IntegrityError
import logging
logger = logging.getLogger(__name__)

class Command(BaseCommand):
    help = ''

    def handle(self, *args, **options):
        self.generate_from_csv_dir()

    def generate_from_csv_dir(self):
        csv_dir = settings.CSV_DIR
        for path in glob.glob(os.path.join(csv_dir, "*.T.csv")):
            file_name = os.path.basename(path)
            code = file_name.split('.')[0]
            self.generate_price_from_csv_file(code, path)

    def generate_price_from_csv_file(self, code: str, csv_file_path):
        with open(csv_file_path, encoding="shift_jis") as f:
            reader = csv.reader(f)
            next(reader)  # 先頭行を飛ばす
            for row in reader:
                raw_prices = RawPrices(
                    code=code,
                    date=datetime.datetime.strptime(row[0], '%Y/%m/%d').date(),
                    open_price=int(row[1]),
                    close_price=int(row[4]),
                    high_price=int(row[2]),
                    low_price=int(row[3]),
                    volume=int(row[5]),
                    adjustment_close_price=float(row[6])
                )
                try:
                    raw_prices.save()
                except IntegrityError:
                    logger.info("(code={code}:{date})既に登録されております".format(code=code, date=raw_prices.date))
                    # 重複エラーが出た場合はfor文から抜ける
                    break
                except Exception as e:
                    logger.exception(e)
                    logger.error("(code={code}:{date})登録に失敗しました".format(code=code, date=raw_prices.date))

コマンドを実行してDBに登録する。

python manage.py csv_to_db

開発用サーバを起動してadminサイトを確認する

python manage.py runserver

http://127.0.0.1:8000/admin/にアクセスする。
以下のようにDBに登録されております。
Django_adminサイト.png

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8