伊達要一の書棚と雑記

伊達要一の読んだ本の紹介と書評、それと雑記

【Python】日本市場の株価スクレイピング

f:id:yohichidate:20170608155451p:plain
最近Pythonのお勉強をやっておりまして、習作として世間に晒してみようと思います。

基本的なロジックについてはアルゴリズム雑記さん【Python/jsm】日本企業の株価データを銘柄ごとに取得そのままになっております。はっきりいってしまえば丸パクリに近いシロモノです。お勉強ということで何卒お目こぼし頂ければと……
algorithm.joho.info

なお、このスクリプトを実行する際には以下の注意点があります。

  • jsmモジュールが必須です
  • 「START_DATE.txt」に株価を取得したい最初の日を「yyyy-m-d」で記述する必要があります
  • 「END_DATE.txt」に株価を取得したい最後の日を「yyyy-m-d」で記述する必要があります
  • 「STOCK_CODE.txt」に株価を取得したい証券コードを1行ずつ記述する必要があります

jsmモジュールの導入についてはこちらを参照のこと。
algorithm.joho.info

なお、pyenv & pyenv-vertualenvを導入しているならば、導入したい環境が置かれているディレクトリで、

$ pip install jsm

とコマンドを打てば、他の環境を汚すことなく導入出来るはずです。


「STOCK_CODE.txt」の例

9468
6594

「START_DATE.txt」の例

2017-6-1

「END_DATE.txt」の例

2017-6-7

ソースコード

#-*- coding:utf-8 -*-

# JapanStockScraping.py
# Reference:
# https://algorithm.joho.info/programming/python/jsm-get-japan-stock/

import jsm
import datetime

# get_stock(STOCK_CODE, START_DATE(yyyy-m-d), END_DATE(yyyy-m-d))
# Return: Stockprice data from START_DATE to END_DATE
#         with STOCK_CODE
#         "date, open, high, low, close, volume"
def get_stock(GET_STOCK_CODE, GET_START_DATE, GET_END_DATE):
    # Time Span
    S_YEAR, S_MONTH, S_DAY = GET_START_DATE.split("-")
    TARGET_START = datetime.date(int(S_YEAR), \
                                int(S_MONTH), \
                                int(S_DAY))
    E_YEAR, E_MONTH, E_DAY = GET_END_DATE.split("-")
    TARGET_END = datetime.date(int(E_YEAR), \
                                int(E_MONTH), \
                                int(E_DAY))

    # Get Stock Price
    Q = jsm.Quotes()
    TARGET = Q.get_historical_prices(GET_STOCK_CODE, \
                                     jsm.DAILY, \
                                     TARGET_START, \
                                     TARGET_END)

    # Return to list each quotes
    Q_DATE   = [DATA.date   for DATA in TARGET]
    Q_OPEN   = [DATA.open   for DATA in TARGET]
    Q_HIGH   = [DATA.high   for DATA in TARGET]
    Q_LOW    = [DATA.low    for DATA in TARGET]
    Q_CLOSE  = [DATA.close  for DATA in TARGET]
    Q_VOLUME = [DATA.volume for DATA in TARGET]
    return [Q_DATE, Q_OPEN, Q_HIGH, Q_LOW, Q_CLOSE, Q_VOLUME]

# print_data(STOCK_CODE, START_DATE(yyyy-m-d), END_DATE(yyyy-m-d))
# Output stockprices to CSV file.
# CSV file names "STOCK_CODE.csv".
# (ex:1111.csv)
def print_data(DATA_STOCK_CODE, DATA_START_DATE, DATA_END_DATE):
    DATA = get_stock(DATA_STOCK_CODE, \
                    DATA_START_DATE, \
                    DATA_END_DATE)

    FILENAME = str(DATA_STOCK_CODE) + ".csv"
    FILE_OUT = open(FILENAME, 'xt')

    # Print Data
    PRINT_HEADER = \
            "CODE,Date,Open,High,Low,Close,Volume"
    print(PRINT_HEADER, file=FILE_OUT)

    for Q_DATE, Q_OPEN, Q_HIGH, Q_LOW, Q_CLOSE, Q_VOLUME \
            in list(zip(*DATA)):
        STOCK_PRICES = str(DATA_STOCK_CODE) + "," +\
                    str(Q_DATE.strftime("%y/%m/%d")) + "," +\
                    str(Q_OPEN)  + "," +\
                    str(Q_HIGH)  + "," +\
                    str(Q_LOW)   + "," +\
                    str(Q_CLOSE) + "," +\
                    str(Q_VOLUME)
        print(STOCK_PRICES, file=FILE_OUT)

    FILE_OUT.close()

def main():
    # Open START_DATE.txt
    FILE_START = open('START_DATE.txt')
    TXT_START_DATE = FILE_START.read()
    FILE_START.close()

    # Open END_DATE.txt
    FILE_END = open('END_DATE.txt')
    TXT_END_DATE = FILE_END.read()
    FILE_END.close()

    # Open STOCK_CODE.txt
    FILE_CODE = open('STOCK_CODE.txt')
    TXT_ALL_STOCK_CODE = FILE_CODE.readlines()
    FILE_CODE.close()

    for line in TXT_ALL_STOCK_CODE:
        TXT_STOCK_CODE = line.replace('\n', '')
        print_data(TXT_STOCK_CODE, \
                    TXT_START_DATE, \
                    TXT_END_DATE)

if __name__ == "__main__":
    main()

出力例
「6594.csv

CODE,Date,Open,High,Low,Close,Volume
6594,17/06/07,11720,11745,11625,11725,1103500
6594,17/06/06,11785,11860,11660,11770,1151500
6594,17/06/05,11650,11860,11650,11785,1355200
6594,17/06/02,11420,11550,11400,11550,1836800
6594,17/06/01,11050,11265,11050,11255,1503000

「9468.csv

CODE,Date,Open,High,Low,Close,Volume
9468,17/06/07,1401,1421,1399,1415,276300
9468,17/06/06,1410,1414,1398,1399,288000
9468,17/06/05,1397,1408,1394,1401,224300
9468,17/06/02,1397,1401,1387,1397,308100
9468,17/06/01,1375,1393,1374,1389,279800