このプログラムの目的
get_stock_price.pyの目的はyfinanceからデータを取得しディレクトリへ格納することです.
学習期間・検証期間を変更したい場合は,プログラム中のstart
およびend
を変更してください.
work_share
├02_get_stock_price
├Dockerfile
├docker-compose.yml
└src
├original_data_2018-01-01_2023-01-01(自動生成)
| ├1301.csv (自動生成)
| ├1305.csv (自動生成)
| └...
├get_stock_price.py (これを作成)
└stocks_code.xls(自動生成)
使用ライブラリ
import requests
import pandas as pd
import yfinance as yf
import os
import time
銘柄の証券コードの取得
証券コードはJPXのその他統計資料から確認できます.これはExcelデータになっているので,ダウンロードするコードを書きます.
def save_excel_data(url, save_name):
ret = requests.get(url)
with open(save_name, 'wb') as f:
f.write(ret.content)
銘柄の価格の取得
銘柄の価格の推移はyfinanceから取得できます.アクセス頻度が高いとBANされる可能性があるので,time.sleepによって数秒間の遅延を入れます.
def save_stock_info(code, start, end, interval, save_dir):
stock_price_data = yf.download(tickers=f'{code}.T', start=start, end=end, interval=interval)
stock_price_data.to_csv(f'{save_dir}/stock_price/{code}.csv')
time.sleep(3)
すべての銘柄のデータを取得
あとは,Excelをダウンロードして,すべての証券コードに対して価格を取得し,保存するだけです.
def save_all_stock(code_df):
start = '2010-01-01'
end = '2023-01-01'
interval = '1d'
save_dir = f'original_data_{start}_{end}_{interval}'
os.makedirs(f'{save_dir}', exist_ok=True)
os.makedirs(f'{save_dir}/stock_price', exist_ok=True)
for code in code_df['コード']:
print(f'get and save :: {code}')
save_stock_info(code, start, end, interval, save_dir)
if __name__ == '__main__':
url = 'https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls'
save_name = 'stocks_code.xls'
save_excel_data(url, save_name)
df = pd.read_excel(save_name)
save_all_stock(df)
データ取得には数時間~1日かかるので,それまで待ちます.