バイナリーオプションで勝てない。そうだ人工知能さんに教わろう。
どうも、色々ありますバイナリーオプションですが、完全迷走中です。もうここまで迷走しているんだから、この際、人工知能(仮)さんにバイナリーオプションのエントリー箇所を教えてもらおうと思います。しかし簡単には教えてくれる人工知能さんは手にはいりません。
というわけで、自分で作ってしまおう。人工知能さんに勉強してもらいましょうというのが今回です。と言っても、手法の目処が立っているわけではなく、こちらも迷走しながら進めていこうと思います。ここで、一応断っておきますが、「人工知能」と銘打ちましたが、実際には単純な判別器に落ち着くと思うので、知能(笑)という結果に収まります。それでも本サイトでは便宜上「人工知能」と呼びます。
Contents
1. 学習用のデータを入手する
さて、人工知能さんに学習に学習してもらうには、教師データが必要になります。今回では、過去の各外貨レートが教師データになりますね。外貨レートを入手する方法は、けっこうたくさんあると思います。今回はお手軽を優先し、前になんとなくインストールしたMT4からエクスポートします。しかしながら、実際に本当に人工知能さんを運用することを考えるとリアルタイムで取得する方法を考えなくてはいけませんね。
MT4がインストールされているなら過去データを持ってくるのは簡単です。が、取得する期間を増やすためにちょっとだけ工夫が必要です。それでは、いつも使用しているMT4を起動してください。MT4からのエクスポートでは、ローカルに保存されているヒストリからエクスポートするので、初めに、ローカルに保存される期間を増やす設定を行います。
メニューバーの「ツール」から「オプション」-「チャート」と選択していきます。そして、「チャートの最大バー数」というところにめちゃくちゃ大きい数値を入れます(9999999999999とか)終わったら「OK」を押して終わります。これで、期間が最大になったらしいので、次にチャートデータをダウンロードします。ここで言う「ダウンロード」は、サーバー上からMT4にデータを持ってくる作業のことで、MT4からデータを抜くことでは無いのでご注意です。
ダウンロードには、「ツール」-「ヒストリーセンター」を選択します。出てきたウィンドウでダウンロードしたい通貨を選択して「ダウンロード」を押します。ダウンロードする量にもよりますが、自分の場合10分ほどかかりました。ダウンロードが完了したらいよいよエクスポートです。これまた、エクスポートしたい通貨を選択して、「エクスポート」ボタンを押すことでcsv形式で出力することができます。今回は実験として、GBP-JPYの1分足のデータを出力しました。
2. 超テキトーに学習
では実験と称して、入手したデータ群を用いて簡単に学習させてみましょう。今回の実験では、再帰的ニューラルネットワーク(以降 RNN)を用いていきます。が、正直RNNについて全く理解できていないのでネットワーク構造が正しいのかもわかりませんし、チューニング等も行っていませんので結果は散々なものです。本実験では、Pythonでやっていきます。というのもPybrainというライブラリがなかなかお手軽にRNNを試すことができるからです。Pybrainのインストールは、pipが使える環境ならそのままインストールすることができます。また、依存している(?)、structureとconnectionsもインストールしちゃってください。
1 2 3 |
$ sudo pip install pybrain $ sudo pip install structure $ sudo pip install connections |
そして実際に試したプログラムを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#coding:utf-8 from pybrain.structure import RecurrentNetwork, FullConnection, LinearLayer, SigmoidLayer from pybrain.datasets import SupervisedDataSet from pybrain.supervised.trainers import BackpropTrainer NUM_OF_TRAIN = 30000 #Define network structure network = RecurrentNetwork(name="GBPJPY_180sec") inputLayer = LinearLayer(4, name="Input") hiddenLayer = SigmoidLayer(3, name="Hidden") outputLayer = LinearLayer(1, name="Output") network.addInputModule(inputLayer) network.addModule(hiddenLayer) network.addOutputModule(outputLayer) c1 = FullConnection(inputLayer, hiddenLayer, name="Input_to_Hidden") c2 = FullConnection(hiddenLayer, outputLayer, name="Hidden_to_Output") c3 = FullConnection(hiddenLayer, hiddenLayer, name="Recurrent_Connection") network.addConnection(c1) network.addRecurrentConnection(c3) network.addConnection(c2) network.sortModules() #Add a data set ds = SupervisedDataSet(4,1) file = open('GBPJPY1.csv', 'r') gbpjpy_datas = file.readlines() for i in range(0, NUM_OF_TRAIN): nums = gbpjpy_datas[i][:-1].split(',') result = gbpjpy_datas[i+3][:-1].split(',')[5] > nums[5] ds.addSample((nums[2:6]), (result)) # Train the network print('Train Start.....') trainer = BackpropTrainer(network, ds, momentum=0.99) # print(network) # print("\nInitial weights: ", network.params) max_error = 1e-7 error, count = 1, 1000 #Train while abs(error) >= max_error and count > 0: print (count) error = trainer.train() count = count - 1 print("Final weights: ", network.params) print("Error: ", error) # Test data network.sortModules() for i in range(NUM_OF_TRAIN, NUM_OF_TRAIN + 10): d = gbpjpy_datas[i][:-1].split(',') r = gbpjpy_datas[i+3][:-1].split(',')[5] > d[5] if(r): r = 'HIGH' else: r = 'LOW' print(i, network.activate(d[2:6]), r) |
結果ですが、全く学習できていないようで、かなり微妙です。おそらくライブラリの使い方からして何かしら間違えているものと思います。分かり次第修正したいと思います。
おわりに
さて、ツラツラと書いてきました、今回の記事ですが、本サイト初のシリーズ物として書いていきます。現状では、まともな結果もなく進捗としては最悪ですが、今後ちゃんとしたものができた時、「ああ。こんなこともあったな」と思い返せるようにきちんと残しておきます。それでは、これから頑張っていくので応援おねがいします。