turtlechanのブログ

無知の私がLinuxをいじりながら書いていくブログ

Pythonで無尽蔵から株価データをダウンロード(修正)

いつも私がお世話になっている 汲めども尽きない 無尽蔵 さん。
どうやら今年から株価データのダウンロードURLが変更になったようです。

以前私が書いた記事のスクリプトでは駄目になってしまったので、サクッと書き直してみようかなと。
最低限しか書きませんが、参考になれば幸いです。

ちなみに、新しくなったダウンロードURLは 無尽蔵さんのおしらせ帳のページ で確認できます。

※python2で書いてます。

変更されたところ

お知らせには

■新年よりデーター取得アドレスが変更になりました。
当日データー(2020年1月6日の例)
http://mujinzou.com/d_data/2020d/20_01d/T200106.zip

過去株価データー(2020年1月6日の例)
http://mujinzou.com/k_data/2020/20_01/T200106.zip

日経先物(分足)(2020年1月6日の例)
http://mujinzou.com/k_data/2020/NS2001/NSL_200106.zip

ミニ先物(分足)(2020年1月6日の例)
http://mujinzou.com/k_data/2020/NS2001/NSM_200106.zip


■掲載の継続は保証出来ませんので、ご承知おき下さい。
 データー保管の意味合いから、掲載時刻は当日でない
 場合もあり、当日更新の約束はできません。

と書かれていました。

過去株価データで言うと、以前は「http://souba-data.com/k_data/2015/15_01/T150105.zip」でした。

ドメイン名が「souba-data」から「mujinzou」に変更になっただけで、ファイル名など大きな変更はなさそうです。

 

で、■新年よりデータ取得アドレスが変更になりました。の一文。
「今年からのデータの取得アドレス」なのか、
「今年から過去データすべての取得アドレス」なのか、
いまいち分からなかったので少し調べてみました。

  • 2020年 と 2019年 のファイルは、新しいドメイン名(mujinzou.com)
  • 2018年以前のファイルは、旧ドメイン名(souba-data.com)

でした。データの移行の問題かもしれませんので、今後変更になるかも?
それと、2014年以前は圧縮形式が lzh ですが無視します(面倒くさいので)。

日足データのダウンロード

以上を踏まえてpythonで書いてみました。

mujinzou.py
#! /usr/bin/env python
# coding: utf-8

import os
import codecs
import zipfile
import requests


class Mujinzou(object):
    ''' 無尽蔵のクラス '''

    def __init__(self):
        ''' 初期化メソッド '''
        pass

    @classmethod
    def dl(cls, savePath='./', date_str='2015-01-05'):
        ''' 日足データの保存 '''
        if not os.path.isdir(savePath):
            os.makedirs(savePath)
        year, month, day = date_str.split('-')
        fileName = 'T{0}{1}{2}.zip'.format(year[-2:], month, day)
        filePath = os.path.join(savePath, fileName)
        # ここから修正部分
        if int(year) < 2019:
            url = 'http://souba-data.com/k_data/{0}/{1}_{2}/{3}'.format(year, year[-2:], month, fileName)
        else:
            url = 'http://mujinzou.com/k_data/{0}/{1}_{2}/{3}'.format(year, year[-2:], month, fileName)
        # ここまで修正部分
        response = requests.get(url)
        if response.status_code != 200:
            raise
        with codecs.open(filePath, 'w', encoding=None) as f:
            f.write(response.content)
        return filePath

    @classmethod
    def load(cls,  path='./', date_str='2015-01-05'):
        ''' 戻り値 {code: [open, high, low, close, volume]} '''
        dic = {}
        year, month, day = date_str.split('-')
        fileName = 'T{0}{1}{2}.zip'.format(year[-2:], month, day)
        with zipfile.ZipFile(os.path.join(path, fileName), 'r') as zf:
            for row in zf.open(zf.namelist()[0]):
                row = row.split(',')
                dic[row[1]] = row[4:9]
        return dic


def main():
    import time
    Mujinzou().dl()
    time.sleep(5)
    Mujinzou().dl(date_str='2018-01-04')
    time.sleep(5)
    Mujinzou().dl(date_str='2019-01-04')
    time.sleep(5)
    Mujinzou().dl(date_str='2020-01-06')


if __name__ == '__main__':
    main()

直接スクリプトを実行すれば 2015-01-05 と 2018-01-04, 2019-01-04, 2020-01-06 の株価データがダウンロードできるので問題なさそうです。

以前の記事のスクリプトを修正しただけなので、動作は過去記事を読んで下さい。

turtlechan.hatenablog.com

また何かあっても私は保証できませんので、サーバーの負荷など十分考慮してください。

おわりに

何かの参考になれば幸いです。

また、汲めども尽きない 無尽蔵 さまには日々感謝しております。
益々のご活躍をお祈り申し上げます。 これからもよろしくお願いいたします。