このプログラムの目的
make_original_dataset.pyの目的はoriginal_data_2018-01-01_2023-01-01に格納されているデータを一つのデータにまとめることです.また,データ数が少ない銘柄データを除くことも目的とします.
work_share
├02_get_stock_price
├Dockerfile
├docker-compose.yml
└src
├dataset_2018-2023(自動生成)
| └original_dataset.dfpkl (自動生成)
├original_data_2018-01-01_2023-01-01
| ├1301.csv
| ├1305.csv
| └...
├get_stock_price.py
├make_original_data.py (これを作成)
└stocks_code.xls
使用ライブラリ
import pandas as pd
import numpy as np
import tqdm
import glob
import os
import datetime
株価データのロード
格納済みのデータをロードします.株価データはDate,Open,High,Low,Close,Adj Close,Volume
の7種のデータを保持しています.
ここでは,Dateをindexとして,Closeを保持するデータのみを扱います.学習の特徴量に必要だと感じた場合にはOpen
やHigh
,Low
などのデータも抽出してください.
def load_stock_price(path):
code = path.split('/')[-1][:-4]
df = pd.read_csv(path, index_col=0)
value = df['Close']
return code, value
全ての銘柄データをまとめる
すべての銘柄データをまとめて一つのDataFrameにします.ここではカラム名を銘柄コードとしています.
また,株価データをロードしてきたときにその系列長が1000以上の銘柄のみを扱います.
前述の節で,2018-01-01~2023-01-01までの5年間のデータを取得しているので,通常の銘柄は5年×365日=1825日
となり少なくとも1800以上のサンプル数が存在します.1000以下のサンプル数しかないということは,データに欠損があると考えられるので,ここで弾きます.
def make_all_stock_price_df(dir_path):
csv_path_list = glob.glob(f'{dir_path}/*')
csv_path_list.sort()
value_dict = {}
for path in tqdm.tqdm(csv_path_list):
code, value = load_stock_price(path)
if len(value) >= 1000:
value_dict[code] = value
df = pd.DataFrame(value_dict)
df = df.astype('float64')
return df
生成したデータの保存
全銘柄を一つのファイルに保存します.保存形式は何でもよいですが,ここではpandasに組み込まれているpickleを利用します.
pickleはメモリ上のデータをバイナリのまま保存するため,csvなどのデータ形式と比べて軽量かつ高速に読み込めます.ただし,csvと違って,ファイルの中身を閲覧しても人間には読めません.
新たに保存するディレクトリしてdataset_2018_2023が生成され,その中にoriginal_dataset.dfpklが生成されます.拡張子は必要ありませんが,DataFrameのpickleファイルであることが分かるように.dfpkl
としました.
def make_dataset_original(out_path):
original_data_dir = './original_data_2018-01-01_2023-01-01_1d/stock_price'
df = make_all_stock_price_df(original_data_dir)
df.index = pd.to_datetime(df.index)
print(df)
df.to_pickle(out_path)
if __name__ == '__main__':
dataset_dir = 'dataset_2018_2023'
os.makedirs(dataset_dir, exist_ok=True)
make_dataset_original(f'{dataset_dir}/original_dataset.dfpkl')