#Scikit-learnのsklearn.neural_network.MLPClassifierを使用して、五日後の価格の上昇、下降を分類してみた。
##目的
1.機械学習やっているんだって言ってみたかった。
2.どうせやるなら7割程度の予測結果を出したかった。
3.利益は欲しくないから、簡単な売買ルールで成功率を見たい。
##注意
1.パラメータも雰囲気です。
2.このモデルに妥当性があるのかどうかは分かりません。
3.投資は自己責任ですのでこのモデルを使用した場合の一切の責任を負いません。
4.再現性はありません。
5.この手法は実際のトレードには向きません。
##思考過程
1.とりあえず値段が五日後に上昇するかしないかをTrue,Falseで判断
2.データは多いほどいいらしいから、2007年から2018年までのUSD/JPYデータを使う。
3.終値だけで判断するのも面白味がないからta-libでテクニカル値計算して、それも特徴量にしよう。
4.deep learningはtensorflowかkerasが良いらしいけど面倒だからsklearnで。
5.sklearnにはデータ整形のモジュールあるらしいけど、そこは自分で作ってみよう。
6.True,Falseで作るラベルよりもfloatで表現した方が結果が良くなるらしいから、floatで表現しよう。
##環境
ちょっと把握してないので、調べたら後で書きます。
python==3.6.6
anaconda
jupyter lab(notebook)
pandas
ta-lib
sklearn
##code 前処理
def to_train_test(dataframe, percent = 0.3): #dataの30%をtest_dataに、70%をtrain_dataに変化している
#percentに入れた小数点以下の数字分、test_dataを入れる。
data = dataframe.dropna()
data_len = int(len(dataframe)*percent)
#学習用データと測定用データ
train_data = dataframe[:-data_len].dropna()
test_data = dataframe[-data_len:].dropna()
return train_data,test_data
def to_machine_data_trade(data):
train_data,test_data = to_train_test(data)
train_data["close"] = np.log(train_data["close"])
#教師データ5日前のデータから値上がりしているかどうかを調べ,結果をboolで返す。
super_data = (data["close"].pct_change(periods = 5) > 0).shift(-5).dropna().astype(float)
#教師ラベルは五日前のデータによるものなので、五日分前にずらす
#教師データと学習データを同じ長さにする。
train_data["label"] = super_data
valid_data = super_data[-len(test_data):]
super_data = train_data["label"]
#学習用データからラベルを消す。
del train_data["label"]
#test_dataと同じだけの検証用データを入手している。
return train_data,test_data,super_data,valid_data
import talib
def get_anaryzed_data_from_dataframe(dataframe,dataframe_high,dataframe_low,dataframe_close):
pl_dm = talib.MINUS_DM(dataframe_high,dataframe_low,timeperiod=14)
mi_dm = talib.PLUS_DM(dataframe_high,dataframe_low,timeperiod=14)
dataframe["dmi_sig"] = (pl_dm / mi_dm)
sma5 = talib.SMA(dataframe_close,timeperiod=5)
sma25 = talib.SMA(dataframe_close,timeperiod=25)
dataframe["sma_sig"] = (sma5 / sma25)
macd, macdsignal, macdhist = talib.MACD(dataframe_close, fastperiod=14, slowperiod=26, signalperiod=9)
dataframe["macd"] = (macd / macdsignal)
dataframe["RSI"] = talib.RSI(dataframe_close, timeperiod=14)
dataframe["Willer"] = talib.WILLR(dataframe_high, dataframe_low, dataframe_close, timeperiod=14)
##説明
talibはインストールで躓く場合もありますが、こちらの記事を参考にインストールすると楽です。
今回はtalibで色々なテクニカル指標計算して、とりあえずsma_sigとmacdとRSIと終値を使っています。
pandasは言わずと知れたパワフルデータ分析ライブラリです。
これで訓練データ等を作成しています。
##code 機械学習
data = pd.read_csv("USDJPY.csv")
data["日付"] = pd.to_datetime(data["日付"])
data = data.rename(columns={"日付":"time","終値":"close","始値":"start","安値":"low","高値":"high"})
del data["time"]
get_anaryzed_data_from_dataframe(data,data.high,data.low,data.close)
data = data[["close","sma_sig","macd","RSI"]].dropna()
train_data,test_data,super_data,valid_data = to_machin_data_trade(to_train_test,data)
model = MLPClassifier(activation="tanh", hidden_layer_sizes=200,
batch_size=1000, learning_rate="adaptive",)
model.fit(train_data,super_data)
pre = model.predict(test_data)
accuracy_score(valid_data,pre)
##実行結果
0.7381776239907728
##最後に
長々と書きましたが、単純なバックテストをしたところ29円ほどの損失が出ました。
投資の世界においては正解率は重要ではないとよく分かりました。
ここまでお付き合いしていただき、有難うございました。