[機械学習・進化計算による株式取引最適化] No.02-02 株価データの選別

このプログラムの目的

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を保持するデータのみを扱います.学習の特徴量に必要だと感じた場合にはOpenHigh,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')
タイトルとURLをコピーしました