cTraderを試す

MetaTrader + Python + TensorFlowで自動売買ができないか調べていたが、MetaTrader + Pythonでは売買できないことがわかった。(MetaTraderで自動売買するにはMQLを使わないと不可能。Pythonでは、データを取得できるだけ。)
TensorFlowのC++版を利用して、MQLから使えるようにする方法もあるが面倒なのでやめ。
そこで、cTraderを試してみることにする。cTraderはC#で自動売買のbotを作ることができる。TensorFlowやKerasをC#から呼べるようにしたTensorFlow.NETやKeras.NETがあるのでcTrader + C# + TensorFlow.NETの組み合わせを試してみることにする。

まず、いきなり自動売買のbotを組むのではなく、時系列データを収集するプログラムを書いてみる。Automateを選択すると、自動売買用のcBotとインディケータ作成用のインディケータの2つが選択できる。今回は自動売買用のcBotを選択する。
追加ボタンをクリックすると、新しいbotの雛形が作成される。

雛形が作成されたところで、・・・の部分を右クリックする。メニューが出てきて「Visual Studioを使用しないでください」と書かれているが、これをクリックするとVisual Studio 2019で編集できるようになる。(日本語訳が間違っている)

データを収集するプログラムを書く。コンパイルしてバックテストで実行すればデータが収集できる。
注意事項が1つある。AccessRights = AccessRights.FileSystemを設定しておかないとStreamWriterを開いた時点で失敗してプログラムが終了してしまうので注意すること。

TensorFlow実験 その2

  1. はじめに
  2. 活性化関数
  3. 中間層の次数
  4. 最適化関数
  5. 損失関数

はじめに

前回のXORを学習させるコードをもとに色々パラメータを変えて実験してみた。数式レベルで理解しているのは極一部のため、数式は載せていない。また、学習させる内容によって関数を選択する必要があるようなのでXORで良い成績を出せれたからといって他の問題に適用するのは良くない模様。

活性化関数

活性化関数を色々試してみたが、sigmoid関数以外は全く学習しなかった。

中間層の次数

中間層(隠れ層)の次数を変えて学習成功率と成功した場合の学習回数の平均を調べてみた。2次では学習の失敗率が高いが、3・4次で成功率が上がった。3次と4次では成功率は同じ、学習回数は4次が若干少ない。このXORを学習させるためには次数が3~4次、つまり入力層の次数の1.5~2倍にすれば良いというのがわかった。しかし、実際の問題を解くときに入力層の次数の1.5~2倍で良いのかは不明。中間層の次数について、本とWebページをあたったが、実装者の経験則で決められていることが多いよう。

次数学習成功率学習回数
259%9930
387%9574
487%8810

最適化関数

中間層の次数は3次にして、最適化関数を変えて学習成功率と成功した場合の学習回数の平均を調べてみた。学習率はすべて0.2で行っている。RMSpropが学習回数が少ない(収束が早い)が学習の成功率が若干悪い。Adam, Adamax, Nadam等の

最適化関数学習成功率学習回数
SDG87%9574
Adadelta91%4430
Adagrad84%4431
Adam71%709
Adamax77%1560
Nadam89%790
RMSprop79%224

損失関数

中間層の次数は3次、最適化関数はNadamにして、損失関数を変えて学習成功率と成功した場合の学習回数の平均を調べてみた。 損失関数は変えると全然学習しないものがかなりあるので、学習回数があまりに少ないものについては、学習回数を調べなかった。LogCoshと MeanSquaredLogarithmicError が良い成績をだしている。

損失関数成功率学習回数
BinaryCrossentropy89%790
CategoricalHinge32%
Hinge33%
Huber85%308
KLDivergence0%
LogCosh87%243
MeanAbsoluteError24%
MeanAbsolutePercentageError0%
MeanSquaredError89%332
MeanSquaredLogarithmicError91%299
Poisson78%470
SquaredHinge17%

TensorFlow実験 その1

  1. はじめに
  2. ソースコード
  3. ソースコード解説
  4. 学習したモデルを読み込む

はじめに

TensorFlowの動作実験をする。Pythonを使うのは初めてなので書き方が変なところがあるかもしれない。TensorFlow(Keras)の実験が主なので、ニューラルネットワークが何なのかわからない人はほかのページや文献を当たって欲しい。

実験内容は以下の通り。

  • 3層ニューラルネットワーク(ディープラーニングではない)
  • 学習対象はXOR

ソースコード

できあがったソースコードは以下の通り。

ソースコード解説

5-7行目
3層ニューラルネットワークモデルの定義。
入力層の定義が無く、中間層と出力層の2つだけ定義してある。なぜ入力層の定義が存在しないかはまだわかっていない。
層(レイヤー)の定義がDenseだと全結合になる。Denseの第1引数は次数、引数activationには活性化関数を指定する。中間層は入力層の次数と同じ、出力層の次数はXORの場合は1次となる。活性化関数はシグモイド関数を利用。

9-11行目
optimizerで最適化関数を定義する。SGDというのは確率的勾配降下法(Stochastic Gradient Descent)を意味する。大学生のときは最急降下法というのを使っていた。この確率的勾配降下法は最急降下法の改良版らしい。SDGの第1引数は学習率を設定する。引数なしだと学習率0.01になるため学習が遅くなる。
lossで損失関数をする。BinaryCrossentropyというのは、交差エントロピー誤差関数を意味する。
compileで定義した最適化関数と損失関数を設定する。compileとなっているので内部で本当にコンパイルしているかもしれない。

13-14行目
学習データの定義。
xが入力データで、yが出力データ。
[0,0] -> [0], [0,1] -> [1], [1,0] -> [1], [1,1] ->[0]
となるように設定している。

15行目
学習を早期終了するためのコールバック関数。
引数monitorで監視する変数、引数min_deltaで最小変化量、引数patienceで連続回数、引数modeで上回ったか・下回ったかを設定する。
ドキュメントでは引数monitorにval_lossを指定するようになっていたが、val_lossを指定すると文句言われたためlossにしてある。
この設定だと、lossの値が、0.0001以下の変化量で、5回連続した場合、早期終了するようになっている。
lossの値が0.001を下回った場合終了という設定にしたかったができなかった。

16行目
学習。
引数epochsに繰り返し学習させる回数、verboseにログ出力の状態を指定する。 verboseは、0でログ出力なし、1で epochごとに プログレスバー出力、2でepochごとに出力になる。 epochsは十分な回数ということで30000を指定してあるが、実際には早期終了になるパターンがほとんどである。

18行目
学習したニューラルネットワークモデルの保存。zドライブ直下にtensorflowtestというファイル名で保存している。

20-23行目
学習した結果の実行。
実行すると以下のように出力される。
[[0.00947068]]
[[0.9870682]]
[[0.99154484]]
[[0.00799964]]
大体あっている数値が出力されている。
学習回数だが、 7043回目で終了している。何回か実行してみたところ 5000-10000くらいで早期終了している。

学習したモデルを読み込む

毎回学習するわけではないので、保存した学習済みニューラルネットワークモデルを読み込むで利用するプログラムも作成した。ソースコードは下記の通り。簡単なので解説なし。

MetaTrader5でTensorflowを使う インストール編

  1. はじめに
  2. Visual Studioのインストール
  3. PATHにPythonのディレクトリを追加する
  4. PythonにMetaTraderをインストール
  5. PythonにKerasをインストール
  6. PythonにTensorflowをインストールする
  7. インストール確認

はじめに

MetaTrader5でAIによるEAを作りたい。勉強のために1から作ってもよいが世に良いライブラリがいくつもあるのでそれを利用する。今回利用したいのはGoogleのTensorflow。TensorflowはPythonから呼び出すのが標準になっているためPythonを利用する。MetaTrader5にもPythonから呼び出せるモジュールがあるため都合がよい。この記事では、MetaTrader5はインストールされている前提でその他のもの(Python, Keras, Tensorflow)をインストールする。

Visual Studioのインストール

PythonにMetaTraderモジュールをインストールするのにコンパイラが必要なためVisual Studioをインストールする。Visual Studioをインストールするときにオプションを設定すると、Python3もインストールできるので一緒にインストールする。この記事を書いているときの最新版であるVisual Studio 2019 Community版をインストールする。
下記の2点は必ずチェックし、あとはお好みでチェックを入れる。
・Python開発
・C++によるデスクトップ開発

PATHにPythonのディレクトリを追加する

Visual StudioにPython開発をチェックしておくと、通常以下のディレクトリにPythonがインストールされる。
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64
このディレクトリにはPATHが通っていないのでシステム環境変数のPATHに以下の2つを設定する。
・C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64
・C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\Scripts

PythonにMetaTraderをインストール

pipコマンドを利用して、PythonにMetaTraderのモジュールをインストールする。管理者モードでコマンドプロンプトを立ち上げて、以下のコマンドを実行する。必ず管理者モードでコマンドプロンプトを立ち上げること。管理者モードでないと赤色でエラーメッセージが表示される。
> pip install MetaTrader5

PythonにKerasをインストール

PythonにTensorflowのラッパーライブラリであるKerasをインストールする。
MetaTraderをインストールしたときと同様に、管理者モードでコマンドプロンプトを立ち上げ、以下のコマンドを実行する。
> pip install keras

PythonにTensorflowをインストール

PythonにTensorflowの本体をインストールする。今のPCにはNVIDIAのGPUがついていないので、GPU版ではなくCPU版をインストールする。
MetaTraderやKeras同様に管理者モードでコマンドプロンプトを立ち上げ、以下のコマンドを実行する。
>pip install tensorflow

インストール確認

インストールされているか確認するために以下のコマンドを実行する。MetaTrader5, Keras, Tensorflowの行があればOK。
> pip list

Beagle Bone BlackにWiFiを設定

Beagle Bone Black(BBB)やBeagle Bone Green(BBG)にUSB WiFiモジュールを挿して使う方法。

BuffloのUSB無線子機を挿したのだが、これはデフォルトでドライバが入っていたのでドライバは入れる必要なし。なのでそのまま設定に移ることができる。ドライバが入っていない場合は、ドライバからインストールする必要あり。
設定は通常の設定ファイルによる方法ではなく、コマンドラインからの設定を行う。以下その方法。

wifi_XXXXXXXXXXXX_XXXXXXXXXXXXXX-_managed_pskの部分はそれぞれ表示されている値を設定する。

Beagle Bone Black(BBB)にMachinekitをインストール

Beagle Bone Black(BBB)やBeagle Bone Green(BBG)にMachinekitをインストールする。

  1. Machinekitのダウンロード
  2. MachinekitをMicroSDに書き込む
  3. 母艦PCにUSBドライバをインストールする
  4. BBBをUSB経由で接続する
  5. SSH経由でBBBにアクセスする

Machinekitのダウンロード

ここのサイトからダウンロードしてくる。bone-debian-~.img.xzとdebian-*.tar.xzの2種類があるがbone-debian-~.img.xzの方をダウンロードする。新しいstretch版とかあるけど、Window Managerがopenboxなので色気がないのでlxdeが入っているバージョンを選んだほうがいい。今回は、2017年2月12日版をダウンロードする。

MachinekitをMicroSDに書き込む

ダウンロードしてきたファイルはxzという形式で圧縮されている。7zipで解凍する。
解凍するとimgファイルが1つできるのでこれをMicroSDに書き込む。
MicroSDに書き込むにはWin32 Disk Imagerというソフトを使う。ちなみにこのWin32 Disk Imagerは書き込むのに管理者権限を要求してくるので、管理者権限があるPCで書き込みを行う。

imgファイルと書き込み先のドライブを指定し、Writeボタンをクリックすると書き込まれる。

母艦PCにUSBドライバをインストールする

beagleboardのページに母艦PCからUSB接続したBBBをネットワーク接続した可能ように見せかけるドライバが置いてあるのでダウンロードしてきてインストールする。

BBBをUSB経由で接続する

BBBにイメージを書き込んだMicroSDを挿してから、USBで母艦PCに接続するのだが、このときにS2ボタン (下図、赤丸のボタン) を押しながらUSBに挿し込む。USBとつなぐと起動するのだがS2ボタンを押さずに起動すると、内蔵のeMMCから起動されてしまう。S2ボタンを押しながら起動すると、MicroSDから起動できる。

SSH経由でBBBにアクセスする

SSH(MobaXtermがおすすめ、TeraTermより高機能)で192.168.7.2(Windowsの場合)に接続する。ユーザー名machinekit、パスワードmachinekitで接続する。
接続できたら成功。