【第2回】無尽蔵から株価データの一括取得

December 11, 2020

株価サーバーpython

無一物中Project記事一覧


はじめに

毎日の日本株の株価データを公開している無尽蔵というサイトがあります。ここには、1996年以降の株価データが置かれています。

本記事では、無尽蔵サイトから毎日株の価データを一括ダウンロードするpython3スクリプトを紹介します。

無尽蔵サイトの株価データ

無尽蔵サイトの株価データは、以下のような形式のcsvファイルです。

T201201.csv
2020/12/1,1001,11,1001 日経225,26624,26852,26618,26788,1331220000,東証1部
2020/12/1,1002,11,1002 TOPIX,1765,1772,1760,1768,1331220000,東証1部
2020/12/1,1301,11,1301 極洋,2824,2824,2780,2787,17900,東証1部
2020/12/1,1305,11,1305 ダイワTPX,1851,1862,1850,1857,575180,東証1部
2020/12/1,1306,11,1306 TOPIX投,1831,1840,1828,1835,2675730,東証1部
  ...
2020/12/1,1712,31,1712 ダイセキ環境,0,0,0,0,0,名古1部
2020/12/1,1712,11,1712 ダイセキ環境,686,689,682,688,35700,東証1部
  ...
2020/12/1,9996,91,9996 サトー商会,1440,1470,1424,1454,1700,JAQ
2020/12/1,9997,11,9997 ベルーナ,959,962,938,954,154000,東証1部

特徴を挙げると、次のようなかんじです。

  • 4本値+出来高
  • 「日経225」と「TOPIX」には独自の証券コードが割り振られている。
  • 名証と東証に重複上場している銘柄は、両方の行がある。
  • 出来なかった銘柄の株価は0
  • 株式分割した際の調整株価のデータがない
  • ときどきファイルに文字化けが発生している。
  • 1996年以降のデータが置かれている。

株価データのurlの例

当日データー(2020年1月6日の例)
https://mujinzou.com/d_data/2020d/20_01d/T200106.zip

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

2018年以前のデータはNot Foundになり取得できないようです。

株価データの一括取得

とりあえず、以下のスクリプトで数年分取得してみます。

get_all_csv_zip_from_muzinzo.py
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 29 11:48:05 2020

[無尽蔵]から過去のTyymmdd.zipを取得する
"""

import urllib.request
import zipfile
import datetime
import os
import logging
import sys

def download_csv_zip(output_dir, year, month, day):
    base_url = 'http://mujinzou.com/k_data/'+str(year)+'/'
    subdir = '{0:02d}_{1:02d}/'.format(year-2000, month)
    filename = 'T{0:02d}{1:02d}{2:02d}.zip'.format(year-2000, month, day)
    url = base_url + subdir + filename
    now = datetime.datetime.now()
    try:
        urllib.request.urlretrieve(url, filename)
        with zipfile.ZipFile(filename, 'r')as zf:
            zf.extractall(output_dir)
        os.remove(filename)
        logging.info(str(now)+' success to get file: '+filename)
    except urllib.error.HTTPError:
        logging.error(str(now)+' error')
                

def main():
    args = sys.argv
    if len(args)==2:
        output_dir = args[1]
        if output_dir[-1]!='/':
            output_dir = output_dir + '/'
    else:
        output_dir = './'
    logging.basicConfig(level=logging.INFO)
    for yy in range(2019, 2021):
        for mm in range(1, 13):
            for dd in range(1, 32):
                download_csv_zip(output_dir, yy, mm, dd)

if __name__ == '__main__':
    main()

雑なコードなんで、必要に応じmain()の取得期間を書き換えてください。

以下のように実行すると、カレントディレクトリに取得したcsvファイルが生成されます。

$ python get_all_csv_zip_from_muzinzo.py

特定のディレクトリに取得したcsvファイルを置きたい場合は、以下のように第1引数にパスを指定します。

$ python get_all_csv_zip_from_muzinzo.py ./tmp

以上で無尽蔵サイトから一括で株価データを取得できました。 取得したファイルは日ごとのcsvファイルなので、これを銘柄ごとの時系列csvファイルに変換すれば、チャート表示等に使用することができるようになります。本サイトで、無尽蔵から取得した株価データから銘柄毎の時系列データを生成する方法を紹介しています。

まとめ

無一物中Project第2回では、無尽蔵サイトから一括で株価データを取得するpythonスクリプトを紹介しました。


Written by questions6768 who lives in Uji, Kyoto.