KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

KABU+で過去の株価データを全て取得する

株のシステムトレードを行うために株価データを取得する方法を探していたところ「KABU+」というサイトが良さげでした。

kabu.plus

こちらのサイトは有料サービスですがStandardプランで月額1080円で安定して株価や投資指標のデータを取得できるのが良いです。

但しアクセス回数が1時間あたり4回までが上限となっており、過去データを全て取得するのに膨大な時間が掛かります。

この記事ではファイルのダウンロード後、15分待機してから次のファイルをダウンロードするスクリプトを紹介します。

スクリプトの構成

スクリプトはPythonで作成しました。

ディレクトリ構成は下記のようにしています。

  • スクリプトファイル
    • /[適当なrootディレクトリ]/script/crawl_japan_all_stock_prices.py
  • 対象ファイルリスト
    • /[適当なrootディレクトリ]/script/japan_all_stock_files.py
  • ダウンロードファイル格納場所
    • /[適当なrootディレクトリ]/data/

「crawl_japan_all_stock_prices.py」が起動スクリプトで、「japan_all_stock_files.py」で定義したダウンロード対象ファイルをリストで取得し、ダウンロードファイル格納ディレクトリに15分間隔でダウンロードする仕組みです。

ダウンロード対象リストの取得方法

ダウンロードファイルの対象はKABU+のサイトからページのソースを取得すれば簡単に取得できます。

f:id:masayuki_kato:20181031221303p:plain

この画面で右クリック -> 「ページのソースを表示」で次のような画面が表示されます。

※Choromeの場合

f:id:masayuki_kato:20181031221513p:plain

ファイル名は「japan-all-stock-prices_20181031.csv」のような形式になっているので、一旦ソースを全部コピーして適当なテキストエディタで整形すればいいです。

スクリプト

japan_all_stock_files.py

target_file_list = [
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181029.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181026.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181025.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181024.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181019.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181018.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181016.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181015.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181012.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181011.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181010.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181009.csv',
'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices_20181005.csv'
]

※サンプルのため全ファイルはリストにしていないです

crawl_japan_all_stock_prices.py

import os
import requests
import csv
import time
import japan_all_stock_files

kabu_plus_id = "ここにKABU+のIDを入れる"
kabu_plus_pw = "ここにKABU+のパスワードを入れる"
BASE_DIR = os.getcwd()
DOWNLOAD_SAVE_DIR = BASE_DIR + "/../data/"

def retrieve_csv_file(url):
    res = requests.get(url, auth=(kabu_plus_id, kabu_plus_pw))
    print(res)
    data = res.content.decode('shift-jis')
    return data

def to_csv(data, file=None):
    if file:
        with open(file, 'w', encoding='utf-8') as f:
            writer = csv.writer(f)
            reader = csv.reader(data.splitlines())
            for row in reader:
                writer.writerow(row)


if __name__ == '__main__':
    # crawl対象リストファイル読み込み
    READ_TARGET_FILE = japan_all_stock_files.target_file_list

    for url in READ_TARGET_FILE:
        print(url)
        data = retrieve_csv_file(url)
        file_name = url[url.rindex("/") + 1:]
        to_csv(data, DOWNLOAD_SAVE_DIR + file_name)
        time.sleep(900)

成功するとコンソール画面に次のような表示がされてダウンロードが実行されていきます。

f:id:masayuki_kato:20181031222141p:plain

このスクリプトは15分間隔で1ファイルのダウンロードを行うので2年分のファイルを取得するのに丸2日かかります。

実行しているパソコンがスリープ状態になるとスクリプトが止まってしまうので、放置していてもスリープしないようにパソコンの設定をしておく必要があります。