【Python】日本市場の株価スクレイピング
最近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
他のナレッジはこちらを参照。
yohichidate.hatenablog.com