turtlechanのブログ

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

Pythonで株価データ倉庫から株価データをダウンロード

前回は「汲めども尽きない 無尽蔵」から株価データを入手するスクリプトを記事にしましたが、今回は「株価データ倉庫」から取得したいと思います。 

turtlechan.hatenablog.com

株価データ倉庫 のURLは以下。ありがとうございます。
http://stock-databox.net/data.html

※python2で書いてます。

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

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

import os
import codecs
import zipfile
import requests


def dl(savePath='./', dateStr='2015-01-05'):
    '''日足データの保存'''
    if not os.path.isdir(savePath):
        os.makedirs(savePath)
    year, month, day = dateStr.split('-')
    fileName = 'y{0}{1}{2}.zip'.format(year[-2:], month, day)
    filePath = os.path.join(savePath, fileName)
    url = 'http://stock-databox.net/{0}'.format(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


def load(path='./', dateStr='2015-01-05'):
    '''ZIPファイルの読み込み。戻り値{code: [open, high, low, close, volume]}'''
    dic = {}
    year, month, day = dateStr.split('-')
    fileName = 'y{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('\t')
            row[-1] = float(row[-1]) * 1000
            dic[row[0]] = map(float, row[2:])
    return dic


def main():
    pass


if __name__ == '__main__':
    main()

操作方法は無尽蔵のときとほぼ変わらない。今回クラス化はやめました。
dl() 関数で日足データ(ZIP)のダウンロード。savePath は保存先のディレクトリ、dateStr は yyyy-mm-dd の形の文字列。
load() 関数はダウンロードしたZIPファイルを一時解凍して辞書型 {銘柄コード: [始値, 高値, 安値, 終値, 出来高]} で返すようにした(自分用)。

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

dl('./data', '2019-01-07')
data = 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.0	高値: 20266.0	安値: 19920.0	終値: 20038.0	出来高: 147049.0

こんな感じに表示される。終値出来高の値が、無尽蔵のデータと若干違う。。。
とりあえず動作は問題なさそうです。

おわりに

無尽蔵の方ではダウンロードしたデータを読み込むときに値(価格)を str型 にしてたけど、float型 にしておいた方が今後楽そうなので変更した。
株価データ倉庫のファイルは拡張子が txt だけど中身は tsv になっているので split() メソッドの引数で \t を指定すればほぼ無尽蔵の日足データと同様の処理でいけた。
出来高は 1/1,000 で記入されてるっぽいので、1,000倍してる。

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