本記事について
深層学習(CNN)でFXの予測をするために、
CSVデータ(日時、始値、高値、安値、終値が記載されたもの)から
大量のチャート画像を生成してみようと思います。
成果物
CSVファイルについて
CSVファイルは、USDJPYの1時間足です。(2007年1月~2020年9月まで)
1時間足のCSVデータなんて無いよという方は、こちらの記事を参照してください。
CSVの中身は下記のような感じです。8万行以上あります。
コード
コードは以下の通りです。
import matplotlib.pylab as plt
import pandas as pd
import numpy as np
def make_sma(parab, arr=None):
"""
関数の説明:引数で受け取ったarrayに平均移動線を追加します。
parab:期間
arr:日時、始値、高値、安値、終値で構成されたarray
"""
row = arr.shape[1] #配列の列数を取得
arr = np.c_[arr, np.zeros((len(arr),1))] # 列の追加
for i in range(parab, len(arr)):
tmp = arr[i-parab+1:i+1,4].astype(np.float) #期間内の数値を入れる
arr[i,row] = np.mean(tmp) #移動平均の値を記入
return arr
def dataframe_to_img(chart_range, img_name, df=None):
"""
関数の説明:DataFrameを画像に変換して保存する。
chart_range:DataFrameの範囲
img_name:画像の保存先
df:描画するDataFrame
"""
df = df[0:chart_range]
plt.figure()
df.plot(legend=None) #凡例を削除
plt.axis('off') #枠線の削除
plt.tick_params(labelbottom=False,
labelleft=False,
bottom=False,
left=False) #枠線の削除
plt.box(False) #枠線の削除
plt.savefig(img_name,bbox_inches="tight") #余白を削除して保存
plt.close('all')
#csvをarrayに読み込む
arr = np.loadtxt(r'CSVファイル', delimiter=",", skiprows=1, dtype='object')
#テクニカル指標を追加
arr = make_sma(parab=25, arr=arr)
#DataFrameに変換
col_name = ['Date',"Open","High","Low","Close","SMA"]
df = pd.DataFrame(arr,columns=col_name)
#DataFrameに変換して、画像を保存
df = df[df!=0].dropna() #0の行を削除
df.to_csv(r'tarintest_labels.csv',encoding='utf_8_sig') #あとで正解ラベルとして利用するので、DataFrameも保存
df = df[['Close','SMA']] #グラフに描画する列だけにする
df = df.astype('float') #floatに変換
chart_range = 360
for i in range(20):
try:
img_name = str(i) + '.png' #画像の保存先
dataframe_to_img(chart_range, img_name, df=df[i:chart_range+i])
except IndexError:
pass
コードの解説です。
最初に、CSVをnumpyで読み込んでます。
その後、arr = make_sma(parab=25, arr=arr)
で、
arrに移動平均線を追加します。移動平均線の期間はparabで指定します。
25だけじゃなく、75や200などの長期線を追加したい場合は、
parabの数値を変更して追加すればドンドン追加できます。
テクニカル指標の追加が終わったら、
df = pd.DataFrame(arr,columns=col_name)
で
arrをDataFrameに変換します。
chart_range = 360
は表示するチャートの範囲です。
今回は1時間足のCSVなので、360だと360時間分表示です。
最後はfor文でdataframe_to_img関数
にDataFrameを渡して1枚1枚保存していきます。
dataframe_to_imgでは、matplotlibを使っています。
枠線などは、深層学習での学習に邪魔なので削除しています。
画像の出力が終わったら、DataFrameはCSVで保存しておきましょう。
深層学習の正解ラベルとして流用するためです。
確認
今回はシンプルな移動平均線だけですが、
ボリンジャーバンドや一目均衡表などを表示することも可能です。