#DeepLearningを用いた株価予測(データ加工編)
前回の回で株価のデータを取得したので,そのデータを分析用に加工していく.
どのように分析していくかによって加工の仕方が変わっていくため,ここらで分析方法について考えていく.
私自身株をやっているが,基本的に日中仕事をしているため,株は中期・長期目線でやっている.
その為,翌日の予測をしたいとかそんなレベルの分析よりかは1か月後に上昇しているかなどの分析を行いたい.
とりあえず,過去2か月分のデータを元にその1月先の株価が上昇しているかの2値分類が出来たらいいかなと思い,それを軸にデータを加工していくことにする.
###データ確認
落としてきたCSVデータを早速確認
4004 東証1部 昭和電工(株)(化学),,,,,
日付,始値,高値,安値,終値,出来高,終値調整値
"2015-01-05","148","151","147","149","8516000","1490"
"2015-01-06","147","148","142","143","23008000","1430"
"2015-01-07","141","145","141","144","9663000","1440"
....(下に続く)
分かった情報は以下の要素
・ヘッダー行は2行目から
・文字コードがSJIS
・カラムは"日付","始値","高値","安値","終値","出来高","終値調整値"
・日付以外の項目はcsvによってばらつきが大きい(見るまでもなく分かることだが)
・1日1行のデータ
機械学習をするうえで,"始値","高値","安値","終値","出来高","終値調整値"の要素に関してはデータによって大幅な偏りがないよう加工する必要がありそうだ.
###データ加工
過去2か月分のデータを元にその1月先の株価が上昇しているかの2値分類をするのであれば,とりあえず教師データ(2か月分),正解データ(その先の1か月後)の3か月分のデータがあれば十分である.そこで1か月分のデータが20行(1か月の平日日数)あると仮定し,csvデータを60行ごとに分割してデータの嵩増しを行う。
またcsvごとのデータのばらつきに関してはcsvごとにカラムの最大値を取得し,その値で割る[0-1]の正規化を行うことにする.(上手くいかなかったら,正規化の方法を再度検討する余地あり)
import os
import pandas as pd
import shutil
PATH = "chart_data/"
BK_PATH = "chart_data_bk/"
CUT_DATA = 60
OUTPUT_PATH = "shapeInfo/totalData/"
def shape_data_set():
csv_list = os.listdir(PATH)
for csv in csv_list:
#カラム行は2行目から
csv_src = pd.read_csv(PATH + csv, skiprows=1, encoding="shift-jis")
#CSVのデータを約3か月ごとに分割
i = 0
while True:
csv_src_tmp = csv_src[CUT_DATA * i: CUT_DATA * (i + 1)]
if len(csv_src_tmp) < CUT_DATA:
break
#日付以外のカラムは0-1区間で正規化
csv_src_tmp["始値"] = csv_src_tmp["始値"] / csv_src_tmp["始値"].max()
csv_src_tmp["高値"] = csv_src_tmp["高値"] / csv_src_tmp["高値"].max()
csv_src_tmp["安値"] = csv_src_tmp["安値"] / csv_src_tmp["安値"].max()
csv_src_tmp["終値"] = csv_src_tmp["終値"] / csv_src_tmp["終値"].max()
csv_src_tmp["出来高"] = csv_src_tmp["出来高"] / csv_src_tmp["出来高"].max()
csv_src_tmp["終値調整値"] = csv_src_tmp["終値調整値"] / csv_src_tmp["終値調整値"].max()
csv_name = csv.split('.')[0] + "_" +str(i) + ".csv"
csv_src_tmp.to_csv(OUTPUT_PATH + csv_name, encoding='shift-jis')
i += 1
#加工した加工前のデータは別フォルダに
shutil.move(PATH + csv, BK_PATH)
def main():
shape_data_set()
if __name__ == '__main__':
main()
加工前のデータは再度使用することがあるかもしれないので,置いておきたい.
ただ,追加でデータを取得することもあると思うので,データ加工をすでに行っているかの区別はしたい.
ということで,加工したデータは別フォルダに移動することにした.
次回はこの加工したデータをどのように使用していくか検討しようと思う.