turtlechanのブログ

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

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

株価を自分で分析したいけど株価データを無料で取得できるサイトって少ないですよね。
今回は汲めども尽きない 無尽蔵さんから日足データをダウンロードするスクリプトを書いたので記事にします。

汲めども尽きない 無尽蔵 のURLは以下。ありがとうございます。
http://www.mujinzou.jp/

※python2で書いてます。

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

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)
        url = 'http://souba-data.com/d_data/{0}d/{1}_{2}d/{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():
    pass


if __name__ == '__main__':
    main()

無駄にクラス化してあるけど気にしない。
dl() メソッドで日足データ(ZIP)のダウンロード。savePath は保存先のディレクトリ、date_str は yyyy-mm-dd の形の文字列。
load() メソッドはダウンロードしたZIPファイルを一時解凍して辞書型 {銘柄コード: [始値, 高値, 安値, 終値, 出来高]} で返すようにした(自分用)。

試しに2019年1月7日の日経225を表示してみる。main 関数の定義内の pass を以下に変更して実行する。

Mujinzou.dl('./data', '2019-01-07')
data = Mujinzou.load('./data', '2019-01-07')
code = 1001
nikkei225 = data[str(code)]
print('銘柄コード: {0}\n始値: {1[0]}\t高値: {1[1]}\t安値: {1[2]}\t終値: {1[3]}\t出来高: {1[4]}'.format(code, nikkei225))
実行結果
銘柄コード: 1001
始値: 19944	高値: 20266	安値: 19920	終値: 20039	出来高: 1424270000

こんな感じに表示される。保存先のディレクトリが存在しなかった場合でもディレクトリを作成して保存されていたので問題なさそう。

おわりに

日足データ一つじゃ分析もなにもないので、日足データを複数ダウンロードして銘柄ごとに一つのファイルに結合するのが妥当なのかな。

 

当日株価データ と 過去株価データがあるけど...

あまり気にしていなかったけど、「当日株価データ」と「過去株価データ」があるんですね。過去株価データは更新が18時頃で当日株価データを修正したものらしい。
当日株価データの方をダウンロードするように書いちゃった。。。

url = 'http://souba-data.com/d_data/{0}d/{1}_{2}d/{3}'.format(year, year[-2:], month, fileName)

url = 'http://souba-data.com/k_data/{0}/{1}_{2}/{3}'.format(year, year[-2:], month, fileName)

にすれば良さそう。

低レベルな記事だけど、何かの参考になれば幸いです。

 

株価データ倉庫からも記事にしたので良かったら見てください。

turtlechan.hatenablog.com