ROSの超絶便利な点を紹介します! たっきん(Twitter)です!
僕が自動売買システム(システムトレード)を自作して、実運用できるレベルまで作りこむことに成功しましたが、その理由の1つにROS(Robot Operating System)の利便性が高かったことが挙げられます。
ROSには旧バージョンのROS1と新バージョンのROS2に分かれていますが、僕のサイトでは基本的に新バージョンのROS2について解説していきます。
なので僕のサイトで「ROS」という単語が出てきたときは原則「ROS2」を指しているものと考えてください。
ROSの主なメリットを挙げるとするならば以下となります。
- ROS独自の通信プロトコル(「Topic」、「Service」、「Action」)による複数プロセス(ノード)間の通信が容易に実装できる。
(同期通信、非同期通信の実装も容易!) - 複数プロセス(ノード)の組み合わせで1つの大きなシステムとして動作する分散システムとして設計できるため、ソフトウェアの再利用性が高い。
(平たく言うと仕様変更が容易で、機能追加などの拡張性にも優れる。) - イベント駆動型プログラミングにより、リアルタイムアクションが可能。
(しかもイベント毎にシングルスレッド、マルチスレッド処理の選択も可能) - 実行中ノードとノード間の通信メッセージの送受信関係の可視化が可能。
(デバッグ作業も効率的!)
上記メリットを見ても分かるように、ROSはリアルタイム性を重要視して開発されてきた経緯があり、産業用ロボットや自動運転などのミッションクリティカルなシーンにおいて重要な機能となってきます。
このROSの「リアルタイム性」が自動売買システムにおいても重要になってくるのはなんとなく想像できますよね?
リアルタイム性が低いとスリップページ(注文から約定までの価格のズレ)が大きくなってしまうため、プログラム上で注文発注条件を満たしたら可能な限り最速で注文APIを叩く必要があるからです。
さらに、分散システムとして設計できる点も魅力的で、後々「あんな機能も追加したい!」と思ったときも基本的に「プロセス(ノード)」と「ノード間通信」を追加することで対応が出来てしまいます。
そして何より僕が得意なPython言語に対応していることですね!
以上がPython×ROSの組み合わせが超絶便利すぎる理由になります。
ROSの良さを図解でわかりやすく説明
文章だけだとメリットがあまり伝わらないと思いますので、図を用いて説明しますね!
今回は同期通信、非同期通信やシングル・マルチスレッドなどの話は端折って、ざっくり概念的な内容で説明していきます。
そこまで含めてしまうと説明が複雑になりすぎてしまい、逆に混乱を招いてしまいそうだからです。
(同期通信、非同期通信やシングル・マルチスレッドは別の機会で記事を起こそうと思っています。)
ROSを用いた自動売買システムの簡易設計として以下の構図を例として説明していきます。
各パーツの説明ですが、
- 黄色の楕円 → ノード(プロセス)
- 青色の四角 → ノード間の通信
となります。
この構図だとノード×3、通信×2の自動売買システムとして動作します。
各ノードの処理は下表となります。
ノード名 | 処理内容 |
---|---|
現在レート取得API<A社> | A社APIより取得した現在レートをROS通信で送信 |
シストレAPL① | 受信した現在レートからトレード実施判定を行う。 注文条件を満たしたらROS通信で発注指示を送信 |
注文API<A社> | A社APIへ注文を出す。 |
シーケンスは下図のようになります。
各ノードはマルチプロセスとして動作するため、並列に処理することが可能でリアルタイム性を損ないません。
ここで以下の機能追加と仕様変更をする場合を考えます。
- 機能追加:「シストレAPL②」を追加
- 仕様変更:A社→B社のAPIへ変更
機能追加
「シストレAPL②」の機能追加は簡単です。
ノード「シストレAPL②」を追加して、通信を繋ぐだけです。
しかもノード「シストレAPL②」もマルチプロセスで動作するので、既存の3つノードへの影響はありません。
また、仮に「シストレAPL②」にバグがあって動作停止したとしても「シストレAPL②」のノードが停止するだけで、他のノードは問題なく動作し続けます。
これが分散システムの良いところで、1つバグでシステム全体が停止することを避けることができるため、堅牢なシステムを構築することができることもROSを使うメリットの1つになります。
仕様変更
A社→B社のAPIへ変更する場合も簡単です。
B社用のノードを新規に作成して、既存のA社用ノードを停止させるだけです。
このとき、A社用ノードを修正してB社用ノードとして作り変えないことがポイントです。
A社用ノードを残すことによって、またA社用ノードを使いたいと思ったときにいつでも復活させることができるからです。
このように再利用性の高いシステムを構築できることもROSならではのメリットになります。
ROSはデバッグ機能も便利
ROSのメリットの1つに、実行中ノードとノード間の通信メッセージの送受信関係の可視化が可能であることを挙げました。
実際にどのように可視化されるのかを見ていきましょう。
下図は僕が自作した自防売買システムの実行中ノードとノード間の通信メッセージの送受信関係の可視化したグラフになります。
通信メッセージの内容もモニターすることも可能ですが、ROSのデバック機能について説明していくとそれだけで1つの記事が書けてしまいそうなので、今回は紹介程度に留めておきます。
ROSのデバッグ機能の解説は別の記事で詳しく紹介しますね!
自作した自防売買システムのROSノード・アーキテクチャ
上記で説明してきたROSを使って自作した自動売買システムのROSノード・アーキテクチャは下図のようになってます。
特徴として、最下段パッケージはOANDA API専用で作成したノード群になりますが、他社APIを使用したいときはこのパッケージを他社向けノードとして作成し、差し替えるだけでAPI移行が完了します。
また、自防売買アルゴリズムを追加したいと思ったときは最上位のパッケージにアプリケーション・ノードを追加するだけで既存機能に影響を与えることなく、追加することができます。
僕が自作したシステムトレード「NaMaKe Trader(ナマケ・トレーダー)」のソースコードはGitHubで公開しています。
アプリケーション部分のコードを作成するだけで、誰でも無償でシステムトレードを行うことができるように構築しました。
これであなたも「何もしないで稼げるトレーダー」になれるかもしれませんよ?
APIはOANDAを使用しています。
プログラムを実行するにはOANDAの口座開設とAPIの設定が必要になります。
さいごに
今回はROS(Robot Operating System)の利便性について、ざっくり概念的なイメージで紹介しました。
ROSの良さを全て紹介しようとすると記事のボリュームが膨大となってしまいそうなので、ある程度のカテゴリーに分けて少しずつ紹介していく記事を今後は書いていこうと思っています。
兎にも角にも、実際にROSを使うとその利便性の高さに気づいていただけると思っています。
Pythonプログラムを学習されている方は、一緒にROSの勉強もされてみてはいかがでしょうか?
では、今日はこの辺で!
コメント