PHPでの取引システムのテスト

エントリー





おそらく、株式、通貨、または他の為替商品の取引に出くわしたすべての人が、取引システムの構築とテストの必要性に関するアドバイスをよく受けました。



このシステムによる取引は、取引所で働く唯一の真の方法であるように思えたため、アドバイスを取り、取引戦略をテストすることにしました。











同時に、ビジネスと喜びを組み合わせ、PHPで取引戦略のテストを実装することにしました。 TSLabWealthLabなどの既製のソフトウェア製品を使用しなかったのはなぜですか? まず、取引ロボットを実装するまさにそのタスクは、自己開発として非常に興味深いものです。 第二に、取引戦略をテストするためのほとんどの製品は支払われており、無料のアナログが近い将来に流通ポリシーを変更しないことを保証することはできません。 また、サードパーティ製品の機能が私の将来の取引戦略に十分であるかどうかはわかりません。 第三に、PHPはWeb指向の言語であり、その開発はWebサービスのメインモジュールとして使用できます。 すでにこれらの3つの理由で、tradeSystemの作業を開始できました。



私は主に自分自身のためにプロジェクトを開発したことをすぐに言わなければなりません、そしてこの段階では多くの人は実装されたインディケータの小さなセット、様々なユースケースの不十分なテスト、テストやその他のニュアンスの存在のために学術的な観点からよりも実用的な観点からあまり興味がありません。 このプロジェクトはオープンソースですので、この開発を適用することが実用的であると思う場合は、機能を拡張してテストしてみてください。



戦略の形式化





私たちの戦略は、本質的に「ハローワールド」戦略になります。 MACDヒストグラムに基づきます。







この指標のチャートが値「0」を上または下から横切ると、トレンドの変化を示すと考えられています。 交差が上から下に発生する場合、売りシグナルが到着し、下から上に場合、買いシグナルが到着します。



私たちの戦略は時間ごとのチャートで機能し、毎時間の終わりに売りまたは買いのシグナルが現れたかどうかをチェックします。 シグナルは、インジケーターの現在の値と前の値の間の符号の差、またはインジケーターの前の値がゼロに等しい場合になります。 シグナルがあり、ポートフォリオに書類がない場合、利用可能なすべての現金のポジションをオープンします。 ポジションをオープンするとき、ポジションのオープン価格の1%のレベルでストップロス注文を出し、オープン価格の2%のレベルで利益注文を取り、最大0.4ポイントからシフトします。



また、ブローカーが毎日の初めに取る手数料を考慮したいと思います。



最終的には、テスト結果に基づいて、貸借対照表の合計額、連続する最大勝敗に関する情報、およびテスト中に実行された操作のログを取得します。



取引システムとテストスクリプトの実装





戦略の開発を始める前に、tradeSystemをインストールしましょう。 インストールプロセスは特に難しくなく、プロジェクトwikiで説明されています



直接テストするには、見積データ、取引システムの実装、およびテスト環境を整理してシステムに関する情報を表示するスクリプトの3つのコンポーネントが必要です。



これらの引用については、FinamブローカーWebサイトからの引用のエクスポートを使用しました。 2011年のSberbankの見積もりでシステムをテストすることにしました。 取引戦略は時間ごとのチャートで決定を下しますが、分チャートのデータを入力に送信する必要があります。 ブローカーのウェブサイトを保存するために、プロジェクトのrobots / testing / inputディレクトリにSBER_110101_111231_1min.txt.gzという名前で見積もりファイルを配置します。 このファイルを、できればそれが置かれているのと同じディレクトリで解凍してください。



次に、取引戦略を直接実装する必要があります。 MACDHistogrammReverseStrategy.class.phpファイルを開くと、最終コードのリストを見つけることができます。 クラスコードはかなり明確である必要があり、一般的な用語でのみコメントします。



私たちの戦略には、それ自体が機能するインディケーター自体、テスト中のペーパー、一連の勝敗のカウンターが必要です。 次に、ストラテジーには、引数がローソク足であるhandleBarメソッドが必要です。 便宜上、さらに2つのメソッドを特定しました。canOpenPositionとopenPositionは、ポジションをオープンする可能性をチェックし、ポジションをオープンすることについて直接責任があります。

simpleHandle関数では、決定する時であるかどうかを確認し、そうである場合は、買いまたは売りのシグナルが現れたかどうかを確認します。 表示された場合、ポジションを開きます。 openPosition関数では、ポジションを直接オープンし、ストップロスを入れ、利益を注文します。 これらの注文は本質的に位置追跡戦略でもあるため、insertUpメソッドを使用して呼び出す一連の戦略に没頭します。 それだけです。残っているのは、見積データを読み取り、それを戦略の入力に送信するスクリプトを書くことです。



テストスクリプト





スクリプトのリストは、 MACDHistogrammReverse.phpファイルで確認できます。 コードは再び合理的に明確であるはずです、私は主なポイントに焦点を当てます。



入力データを含むファイル名が転送されたかどうかを確認した後、作業環境の初期化を担当するinitファイルを接続し、クラスオートローダーを初期化するclassesAutoloaderInit関数を呼び出す必要があります。



次に、インジケーターを準備する必要があります。これを戦略に渡します。 MACDヒストグラムは他のインジケーターに基づいて構築されることが知られているため、最初に基本的なインジケーターを作成し、徐々に必要なインジケーターに到達します。



新しいインディケーター値の計算をChartクラスに任せます。 これを行うには、作成してすべてのインジケーターを追加します。 これで、handleBar Chartが呼び出されると、すべてのインジケーターが新しいインジケーター値を計算します。 EndStrategyおよびBeginStrategyの必要性に関して、いくつかの質問が発生する可能性があります。EndStrategyおよびBeginStrategyは、これらの戦略に含まれています。 これらの戦略の主な目的は、新しく生成された戦略がチェーン自体にある戦略によって正しく処理されることを保証することです。 たとえば、この戦略を使用するinsertUpメソッドを使用すると、TakeProfitおよびStopLoss戦略がBeginStrategyの後にチェーンに挿入されます。 BeginStrategyが存在しない場合、戦略のhandleBarを呼び出すときに状況が発生する可能性があり、通常、チェーン内の上位の戦略はテストから除外されます。



さらに、すべてが非常に簡単です。戦略を作成し、手数料を差し引くオブジェクトを作成し、FinamBarReaderで入力データの読み取りを開始して、手数料、スケジュール、および戦略入力に送信します。 また、DateTimeManagerで現在の時刻を更新することを忘れないでください。これにより、戦略が決定を行う必要がある時点を正しく処理できるようになります。

最後に、オープンポジションがある場合は、最後のトランザクションの価格で強制的にクローズし、最後のコードで、興味のある情報を表示します。



テスト中





入力に分のデータを提供します。 戦略は1時間ごとのチャートで決定を下すという事実にもかかわらず、TakeProfit戦略のために、1分ごとのチャートでテストを行う必要があります。 このストラテジーは入力にローソク足データのみを持ち、それに対する最悪のクォートの動き、つまりキャンドルの最大値から最小値への動き、およびその逆の動きに期待する必要があります。 1時間ごとのろうそくの場合、これはあまりにも頻繁に誤検知を意味しますが、実際にはそうではない場合があります。 したがって、戦略を正確にテストするために可能な限り最小の期間をとろうとする必要があります。この場合、1時間以内の見積もりの​​動きはより正確になり、戦略の作業はより現実に近くなります。



だから、我々はテストします:



php robots/testing/MACDHistogrammReverse.php robots/testing/input/SBER_110101_111231_1min.txt > /tmp/result.txt







result.txtファイルを見ると、テスト結果によると、戦略は4連勝、6敗を示し、最終的にはアカウントに残された9143ルーブルで、初期残高は10,000ルーブルでした。 合計で、取引システムは200万ルーブルの量で操作を行いました。

明確にするために、時間の経過に伴うバランスの分布のグラフを作成しました。







それから、システムの動作を明確に見ることができます。 基本的に、システムは収益性の高い取引によって中断される一連の負け取引を完了します。 しかし同時に、取引からの利益は、以前の一連の不採算取引からの損失をカバーできないことは明らかです。



まあ、少なくとも私たちは少し失いました。これも良いことです。 しかし、実際の取引では、取引戦略の結果はテストよりもわずかに悪いと考えられているため、戦略が失われると想定できます。 テスト中に考慮しなかったブローカーの毎月のコミッションと、限界取引の転送コミッションを考慮する場合、戦略を明らかに置き換えるか、改良する必要があります。



おそらくそれだけです。 興味がある人は、 githubでプロジェクトに参加し、質問をし、開発を共有し、実際のアカウントで作業する前に取引戦略をテストしてください。これにより、節約と神経を節約できます。










All Articles