シストレどうですか

  Algorithmic Trading for Dummies

FXボット とりあえず動かしてみた編 その1 ー テスト環境の作成

ボットの作成はとりあえず前回で一旦終了ですので、完成したとりあえずなボットをとりあえず動かしてみようという事でテストするための環境を構築しそこでボットを稼働しています。今回はやはりとりあえず構築してみた私のテスト環境の説明になります。


テスト環境


ハードウェア

家にある古いPCを探してみましたが、あまりにも古かったので場所をとらない小型のファンレスミニPCを購入しました。
プロセッサーCeleronでメモリーは8GBですが、単純なボット専用でもあり次のステップはAWSの無料枠(EC2)での運用をめざしていますので十分すぎるスペックです。
モニターは、普段別のPCからVNCでアクセスしており余分なモニターも家にありませんので、家のTVをモニター代わりに使っています。
キーボードとマウスもTVの側に置くのは邪魔なので、キーボードとマウスパッドとが一体化しているミニワイヤレスキーボードを購入し、PCの初期設定やリブート時に使用しています。 TVにつないでいるのでついでにYouTubeなどの動画を見る際にも使用しています。

実際に使ってみた感想は、触ってみると多少の熱はありますが小さくて静かですのでどこにでもおけます。 消費電力も上位プロセッサーにくらべ低いので24時間稼働を考えた場合に最適な1台と勝手に思っています。
しいて言えば、筐体が小さすぎるのでちょっと位置を動かそうとして本体を握って持ってしまうと間違えて電源スイッチに触ってしまい突然シャットダウンさせてしまう事があるくらいでしょうか。

f:id:jantzen:20211109052835p:plain:w400
ファンレスミニPC

ちなみに上のモデルの人も電源スイッチのところを持っています(笑)
これを以下テスト機と呼ぶことにします。

OS

購入時にはプレインストールでWindows 10 Proが入っていましたが、OSもハードウェア同様AWSの無料枠で動かすという事を想定してUbutuに入れ替えることに決定。
とは言えAWSではサーバー版になるのですがLinux系にそもそも慣れていない事もあり、デスクトップ環境から各種コマンドの使い方を学習したりボットの開発やテストもできるように Ubuntu Desktop 20.04.3 LTS をインストールしました。

せっかくWindowsも元々入っていましたのでデュアルブートできる形でUbuntuをインストールしてあります。

Pythonの実行環境

仮想環境

Pythonを使い初めた時はAnacondaを使っていましたのでAnacondaの仮想環境を使っていましたが、AWSで動かすには重そうという事で今回はpyenvとpipenvを使ってを構築。
ボットは特にPythonのバージョンに依存していませんので、とりあえず新しめのバージョン3.9を使用中。

仮想環境を作成したのは、Ubuntuに初めからインストールしてあるPythonはいじらない方がいい的な事がネットにでていたのでそうしてみただけです。

外部モジュール

外部モジュールも今のところ特別なものは使っていませんので、oandapyV20, requests, pandas等最低限必要なものをで仮想環境内に導入しています。

$ pipenv install モジュール名

開発環境

VS Code

初めはAnacondaを導入したので一緒に入っていたSpyderを使ってみようかと思いましたが、なぜか動かなかったので代わりのものを探した結果VS Codeにしました。
Githubのレポジトリーと同期する機能もありますし、ブログを書く際に使うフローチャートなどのお絵描き用にDraw.ioという作画ツールも拡張機能として含まれています。
これ一つでいろいろできるので非常に便利です。デバッグモードでテストする際にはSpyderのほうが速い感じでしたが、レイアウトや拡張機能の両方から個人的にはVS Codeの方が好きです。

Github

もともと使っていなかったというのもあり一人でプログラミングしていますのでクラウドストレージでもいいかなと思っていましたが、Publicでなくても無料で使えるようになったというのを恥ずかしながら最近知ったので、これも勉強の一環と思い使ってみる事にしました。
使い慣れるとSSHのようなコマンドラインを使う時にもソースコードを簡単にコピーできますしVS Codeに同期の機能もついていますので、やはり重宝しております。
ただ初心者の使い方なのでブランチとかはmasterしかありません。ボットを改造していく必要がありますので、この機能もおいおい使いこなせればとは思います。

リモートアクセス

RealVNC

ボットはいつも動いていますので仕事先など家から離れている場所からもアクセスできる環境が必要なのでリモートアクセスできる状態にしてあります。
当初は個人利用なら無償で使用出来るという事でAnyDeskを愛用しておりましたが、最近は一定時間以上使うと商用利用としてみなされてしまうような感じで使えなくなってしまったので現在はReal VNCを使っています。
(AnyDeskのサイトからWhite Listに登録すれば継続して使用できるようですが気が付いたのがVNCを入れた後だったので・・・。)

また当然ながらReal VNCも携帯アプリがあります。さすがに画面が小さすぎて開発は難しいですがボットの稼働状況の確認や止まっていた場合の再起動などの作業など十分にできますので、会社のPCにインストールしたら怒られてしまうような方でも仕事中に監視可能です。
将来的にはSSHからコマンドだけを使って運用できるようにしていく予定。


実行手順


プログラムの実行

ソースコードの同期

テスト環境で動かす前にGithubソースコードの同期を行います。 特にブランチの使い分けは今のところしていませんので、同期する対象のフォルダーに移動した後ターミナルを開けて

$ git pull

と入力するだけです。
テスト機でVS Codeを開けているときは、VS Codeの同期する機能でそのままコピーしています。

実行

仮想環境をpyenvとpipenvで構築していますのでプログラムを走らせる際には対象のフォルダーのターミナルから

$ pipenv run python モジュール名.py

で実行します。
Pyhtonのソースコードがパッケージ化してあれば、

$ pipenv run python パッケージ名

でも実行することができます。
ただしくパッケージ化のやり方もいろいろあるみたいで正しい方法でパッケージ化しないと動きません。

バックグラウンドで実行

Ubuntuのターミナルを開けて実行しているとたまに誤ってターミナルを閉じてしまう事があります。またブログ用にターミナルの内容をコピペしようとしてショートカットでコピーしようとしてついWindows用のCtrl+cなど押してしまいプログラムを停止させてしまったこともあります。
そのような場合はLinux系であれば、nohupコマンドに&をつけると簡単にバックグラウンドで実行できるので便利です。
ただし、print関数の内容を表示させたい場合はそのままですと出力データがバッファリングしてしまいますので、uフラグを加えてフラッシュさせる必要があります。
(出力データをフラッシュさせる方法はいくつかあるようです。)

nohup pipenv run python -u パッケージ名等 &

またバックグラウンドで実行してしまうと本当に動いているかどうかわからなくなりますが、psコマンドを使うと確認できます。
すべてのプロセスを表示させると多すぎてよくわかりませんのでgrepで対象になるプログラム名でフィルタリングするとわかりやすいです。

ps aw | grep モジュール名等検索させたい文字

$ ps aw | grep bot-001
  50218 pts/0    Sl+    0:07 /home/hiroshi/.local/share/virtualenvs/oanda_env-VPsonP6W/bin/python bot-001
  50661 pts/1    S+     0:00 grep --color=auto bot-001
$ 

ちなみに、上の例ですと仮想環境化のフォルダーでプログラムが動いているのがわかります。
またプロセスIDが50218になりますので強制終了させたい場合は,

kill -9 50218

で強制終了可能になります。

結果の確認

デスクトップ

実行結果の確認は、ソースコード内に記述したprint関数の内容がそのまま表示されるのでそれで確認する事ができます。
ただしターミナルを閉じてしまうと消えてしまうので気をつけてください。

nohupコマンドでバックグラウンドで実行した場合は、nohup.outというファイル名で同様にprint関数の内容が書き出されるので後でそれを確認する事ができます。 (nohupコマンドで出力するファイル名や出力先を指定する事も可能です。)
これがあれば間違ってターミナルを閉じたしまった場合でもこのファイルの中身を確認できるので安心です。

さらにインタラクティブ的に表示させたい場合は、tailコマンドにfフラグを使えば出力ファイルの最後のレコードが自動的に表示させることも可能です。

$ tail -f nohup.out

tailコマンドは行数指定などもできますのでSSHのようなコマンドラインでも便利に使えます。

携帯アプリ

現状のボットでは利確損切注文の約定結果がわかりませんので、Oandaの携帯アプリを使って取引内容を確認して検証しています。 ポートフォリオの注文履歴をみれば取引内容はすぐわかりますし、アプリの通知設定をオンにしておけば取引のオープン・クローズも通知してくれます。
テスト機が動いているかボットが稼働中か等の確認は前述のVNCアプリも役に立ちます。

まずはボットが正しく動くかどうかのテストですのでとりあえずはこれで十分です。


まとめ


テスト環境の概要のみをお伝えしましたが、詳細な導入方法などはよく理解せずに他のサイトを参考に見よう見まねで作ってあります。
とりあえずは大きな問題もなく動いているようなので大丈夫そうかなというのが今のところの状況です。

現在このような環境下でボットを動かし続けています。
先程も書きましたが、とりあえずは売買シグナルが発生したら注文を入れて無事約定していますし、変にポジションを膨らませたりはしていないようなのでボット第一号としては問題ないようですが、やはり予期せぬエラーで停止する場合があります。
このあたりの改造が早速必要なようですが、その様子は次回にお伝えします。

デモ口座であれば大きな間違いはおきないとは思いますが、VS Codeの開発ツールで十分にテストした上でソースコードをテスト機に同期して実行しています。