トレーディングにおける機械学習:理論、モデル、実践、アルゴトレーディング - ページ 78

 
ミハイル・マルキュカイツ
いや、みんな、システムが無くなったんだから、見せる意味もないだろ。

もしかして、三分類器のロジックが変わったことを警告するのを忘れていたせいでしょうか?

バイナリも同じ理屈で、出力値が0より小さいとサンプルに0が入るようなものです。それ以上の場合は、サンプルで1です。

また,出力が,1がサンプルの1,0がサンプルの0,-1がjPredictionの"-"であれば3値です。

 


8つのモデルからなる委員会を作り、4000回の取引(5年半の取引)を検証するためにシミュレーションを行った。これは、預金の増加の可能性の範囲を知るためのモンテカルロ・シミュレーションで、最初の取引ポイント(ストラテジー・テスターでの実行を与える)を調整しないものである。ここでは、検証時のMOは0.00026pipsです。低分位は明らかにゼロを超えており、これは私が得たかったものです。

次に、これらのシリーズのリカバリーファクターの分布について分析する。

これがリカバリーファクターの分布です。中央値の3.7は、目標値(計画値)のようなものです。下位の分位値も悪くないのですが...。

まだ、あと80個のトレーニングサンプルでのトレーニングランを待って、より大きな委員会を作る必要があります。

 
ユーリー・レシェトフ

三分類器のロジックが変更されたことを警告するのを忘れていたのが原因でしょうか?

バイナリも同じ理屈で、出力値が0より小さいとサンプルに0が入るようなものです。それ以上の場合は、サンプルで1です。

また,出力が,1がサンプルの1,0がサンプルの0,-1がjPredictionの"-"であれば3値です。

Ү わかったわ、それでいいのね...。ここにはもう一つあります。要は、オプティマイザーは出力情報を含むデータを見つけるのが得意なんです。80%以上の汎化率を持つデータが見つかれば。このデータは、他のネットワークトポロジーでもうまく利用することができ、再トレーニングなどを行うことなく、完璧な学習結果を得ることができます。取引でオプティマイザーを直接使いたくない方向けです。私の場合は、出力分類に使用したデータが全くうまくいかず、金曜日のトレード結果が思うようなものではありませんでした。しかし、めげずに繰り返し構築すると、エントリーとエグジットでゴミのような状態にならない別の述語セットを見つけました......とにかく、分類器をTSの賢いシグナルフィルターとして使用するための推奨事項は以下の通りです(予報ではありません)。

1.買いシグナルと売りシグナルを別々に分ける。もし、前の値のデータを使っていて、その分離がデータの順序を混乱させるのであれば、必然的に述語の1つは信号の符号になるはずである。Buy=1、Sell=-1、つまり述語の1つがシグナルの方向となる。

2.述語は予測システムと何らかの関係があることが必要です。シグナルのZscore、シグナルのKelli、シグナルのorder(システムは可逆ではないので、一方向に連続したシグナルが複数存在することもある)として持っています。基本的には、何らかの形でシステムに関連する情報。モメンタムも取れるし、別にオプティマイザーMT4で、システムシグナルで取引したときにテスト期間で利益が出るようなパラメータを選択 したんです。I.e.モメンタムはトレーニングエリアでのシステムシグナルに最適化されている、など。

3.退出する。ここが一番重要で、100pipsの利益で50%の一般化を出力していたのを、10pipsに変更したら一般化が65%になりました。DemarkのTSではかなり難しいです。 この場合のアプローチの形式化が通らないので、手動で見ることが多いのですが......。 訓練領域では、信号を間違えても、汎化度の高いモデルが得られる方が良いのですが、どうでしょう?例えば、トレーニングでシグナルが100pips稼いだとしても、相場がシグナルの逆張りになりやすいため、0と表記したとします。つまり、一般化のレベルを上げるために、わざとTSを負けさせ、将来的にTSをうまく使えるようにするのです。結局のところ、私たちの出力は理想的なものであり、少し理想的でない、しかし正しいものであるように......。

4) 予測にはCMEの取引量を使用する。これは本当に効果的で、モデルの一般化レベルを大幅に向上させるものです......。デルタクラスタから取っているので、こんな感じかな......。

 
アレクセイ・ブルナコフ

これは、預金の増加の可能な範囲を知るためのモンテカルロ・シミュレーションで、最初の取引ポイント(ストラテジー・テスターでの実行を与える)を調整しない。

トレードの起点をどう動かしても、すべてトレーニング期間後であってほしい。例えば、2015年1月と3月のデータでモデルを学習させた場合(2月のデータを削除)、このデータが学習サンプルになかったにもかかわらず、2月に最終検証を行うべきではありませんが、そのような結果は信頼性が低くなります。検証は、モデルパラメータを適合させるためにトレーニングやクロスバリデーションでモデルが使用することができたすべての日付の後、2015年4月に開始した場合にのみ、実際の取引で期待される十分な結果を示します。

あなたのデータに対する私の2回目の試み(回帰は[0;0.5;1]に丸められます)は成功しませんでした。モデルと遺伝子が再び「取引しない」定数クラスの選択肢を選んだ。
どうやら、3つのクラスを予測するためには、ニューロンは必然的に3つの出力を持たなければならず、そうでなければ、3つのクラスを1つの出力にレベルを合わせて出力することはできないようです。あるいは、「取引しない」クラスを削除して、2つのクラスを残して作業する必要がありました。

fronttestで何かを確認するために、geneticsによって選択された予測変数のリストを取り、ニューロン(すべてが正しく、3つの出力と入力に因子を持つ)をcaretを通してクロスバリデーション(方法= "reportedcv")で訓練しました。その結果、学習データでも精度は40%程度と、まずまずの結果でした。
今気づいたのですが、検証ファイルの出力はクラスではなく実数になっていますね。すべてプラスなら+1、すべてマイナスなら-1に置き換えただけです。
さらに、フロントテストでは2つの精度を得ることができました。
1) 予測=0では、モデルは取引をすべきではないと考えると、取引は行われず、最終的な統計に影響を与えないので、正しい結果は無関係である。この場合、予測値-1と1は51%の確率で正しい(予測値=0の例はすべて無視)。
2) すべての予測を取り、すべての正しい結果と比較する。その場合の精度=14%で、ランダムよりさらに悪い。

御社のトレーディングエミュレータでモデルを取引した場合、どのような結果になるのか気になるのですが、上記のようなグラフを作成し、私が添付したモデルで取引していただけないでしょうか。
RDataファイルが大きすぎて、フォーラムがすぐに受け入れなかった。vinrarアーカイブを2つ作り、別々にzipアーカイブに入れました。両方のアーカイブを解凍し、1つ目のアーカイブを開いてデータを取り出すと、2つ目のアーカイブが勝手にフックアップされます。
また、添付のrスクリプトを実行すれば、選択された予測変数のリストが含まれており、それらを使ってモデルを生成することができます。投稿されたオリジナルのcsvファイルがあるはずです、それが使われています。
同じスクリプトをアタッチメントからRDataを開いた後に実行することもできます。このスクリプトは、新しいモデルを作成する代わりに、準備のできたモデルを使用します。コードには予測および精度評価の例があります。先ほど投稿していただいたRDataファイルは、fronttestに必要なものです。

過去の失敗を踏まえて、3回目の挑戦を始めます。

 
Dr.トレーダー

1) 予測=0では、モデルは取引をすべきではないと考えると、取引は開かれず、最終的な統計に影響を与えないので、正しい結果は重要ではありません。この場合、予測値-1と1は51%の確率で正しい(予測値=0の例はすべて無視)。

不正解の場合は-2点、無解答の場合は-1点、正解の場合は1点を与えることにしています。回答に対する加点の割合は一方的に変えてもいいが、ネットワークがむやみに空回りしないことが重要なので、棄権にはペナルティを課すべきだろう。

2つのネットワークの委員会は、それぞれ1シグナル、-1(または0)無シグナルを与え、シグナルが矛盾する場合は最終的にシグナルは0となった。

 

Dr.トレーダー

トレードの起点をどう動かしても、すべてトレーニング期間後であってほしい。例えば、2015年1月と3月のデータでモデルを学習させた場合(2月のデータを削除)、このデータが学習サンプルになかったにもかかわらず、2月に最終検証を行うべきではありませんが、そのような結果は信頼性が低くなります。検証は、モデルパラメータを適合させるためにトレーニングやクロスバリデーションでモデルが使用することができたすべての日付の後、2015年4月に開始した場合にのみ、実際の取引で期待される十分な結果を示します。


はい、もちろん鉄板です。まさにバリデーションですね。ただ、トランザクションのシーケンスは、大量の観測データからランダムにサンプリングされたものです。トレードカーブの位置を把握するためには、モンテカルロ法が必要です。数分単位でトレードの方向が変わると、それだけでカーブが発生します。MTテスターでは、1つのカーブ、つまり1つの実装を見ることができます。毎回のトレードで乱数発生 器を使った条件を組み込み、乱数でオープンすれば、ストラテジーテスターを500回実行しても同じ曲線が得られますね。しかし、MTでは時間がかかってしまう。そして、30秒以内に必要です。

そして、委員会でEAを作ったら、ストラテジーテスターで検証を実行します。その曲線は扇形に収まるはずで、私は回復係数と数学的期待値のユニークな値を得ることになる。しかし、1本だけでは結論は出せない。好ましくない。

 
Dr.Trader(ドクタートレーダー


貴社のトレーディングエミュレータで取引した場合、どのような結果になるのか気になるのですが、上記のようなチャートを作っていただき、私が添付したモデルで取引していただけないでしょうか。
RDataファイルが大きすぎて、フォーラムがすぐに受け入れなかった。vinrarアーカイブを2つ作り、別々にzipアーカイブに入れました。両方のアーカイブを解凍し、1つ目のアーカイブを開いてデータを取り出すと、2つ目のアーカイブが勝手にフックアップされます。
また、添付のrスクリプトを実行することもできます。このスクリプトには選択された予測変数のリストが含まれており、それらを使ってモデルを生成することができます。投稿されたオリジナルのcsvファイルがあるはずです、それが使われています。
同じスクリプトをアタッチメントからRDataを開いた後に実行することもできます。このスクリプトは、新しいモデルを作成する代わりに、準備のできたモデルを使用します。コードには予測および精度評価の例があります。先ほど投稿していただいたRDataファイルは、fronttestに必要なものです。

過去の失敗を考慮し、3度目の挑戦を始める。

また、学習しているモデルは、Neural Network ですか?

後で試してみます。私は、24時間すべてのコアで学習するモデルを持っています。

実は、それを判断するのはあなただと思ったんです。 リンク先で紹介した検証ファイルのモデル予測値を代入するだけです。これらは、+1 / -1 / 0のような方向でなければなりません。予測列と目標列を掛け合わせる。スプレッドの0.0001を減算する。モデル出力が0であるエントリーを削除し、cumsum関数を取る。

plot(cumsum(your_data$trades_simulated_after_spread), type = 'l')

 mean(your_data$trades_simulated_after_spread)

大雑把に言うと、これは全オブザベーションのトレードをグラフ化し、MOを計算します。単純なことです。

 
Alexey Burnakov:

また、学習しているのはニューラルネットワークというモデルなのでしょうか?

...

予測列と目標列を掛け合わせる。

はい、ニューラルネットワーク、nnetパッケージを学習しています。今回は、モデルのパラメータをいくつかピックアップするcaretでモデルをトレーニングしています。

RDataファイルの結果欄をもう一度見てみると、今度はすぐにプライスゲインであることがわかりました。前回は、ある種の確率だと思いました。
ターゲット変数に価格の増分を格納することで、必要に応じて簡単にトレーニング用のクラスに変換したり、利益を計算したりすることができるのがいいですね。私もそうするつもりです。

利益を計算し、スプレッドを考慮し、チャートを描きました。残念、MO=-2.052423e-05、ゆっくりだが確実な損失だ。

スプレッドについては、次の4つの場合のみ考慮する必要があります。
1、2)最後のバーの予測=0、新しいバーの予測=-1または1。 新しいポジションを建てる。
3) 最後のバーの予測値 = -1; 新しいバーの予測値 = 1。リバース、旧ポジションがクローズ、新ポジションがオープンになります。
4) 前のバーの予測=1、新しいバーの予測=-1。リバース、旧ポジションはクローズ、新ポジションはオープン。
それ以外の場合は、最後のバーからの古いポジションが残っているか、古いポジションが閉じているか、全くポジションがないかのいずれかです。これだけで、見開きを必要としない。

(具体的には、買い取引はビッド+スプレッドで開始し、ビッドで決済します。売りの取引は、ビッド+スプレッドで反対売買を開始し、ビッド+スプレッドで決済する。Bidは、通常端末に表示される価格です。しかし、便宜上、スプレッドが一定の場合は、新規ポジションを建てるときに一度だけ考慮すれば十分です。その方が簡単です)。

EAでは、新しいバーで同じ方向に再び建てたポジションを閉じない ために、このすべてを考慮する必要があります。私もかつて、証券会社からリベートをもらえると思い込んで、そんな失敗をしたことがあります。しかし、そのような場合、リベートのための取引頻度が報われず、すべてが悪化する。

 
Dr.Trader(ドクタートレーダー

はい、ニューラルネットワーク、nnetパッケージを学習しています。今回は、モデルのパラメータをいくつかピックアップするcaretを使ってモデルをトレーニングしています。

RDataファイルの結果欄をもう一度見てみると、今度はすぐにプライスゲインだとわかりました。前回は、ある種の確率だと思いました。
ターゲット変数に価格の増分を格納することで、必要に応じて簡単にトレーニング用のクラスに変換したり、利益を計算したりすることができるのがいいですね。私もそうするつもりです。

利益を計算し、スプレッドを考慮し、チャートを描きました。残念、MO=-2.052423e-05、ゆっくりだが確実な損失だ。

スプレッドについては、次の4つの場合のみ考慮する必要があります。
1、2)最後のバーの予測=0、新しいバーの予測=-1または1。 新しいポジションを建てる。
3) 最後のバーの予測値 = -1; 新しいバーの予測値 = 1。リバース、旧ポジションがクローズ、新ポジションがオープンになります。
4) 前のバーの予測=1、新しいバーの予測=-1。リバース、旧ポジションはクローズ、新ポジションはオープン。
それ以外の場合は、最後のバーからの古いポジションが残っているか、古いポジションが閉じているか、全くポジションがないかのいずれかです。これだけで、見開きを必要としない。

(具体的には、買い取引はビッド+スプレッドで開始し、ビッドで決済します。売りの取引は、ビッド+スプレッドで反対売買を開始し、ビッド+スプレッドで決済する。Bidは、通常端末に表示される価格です。しかし、便宜上、スプレッドが一定の場合は、新規ポジションを建てるときに一度だけ考慮すれば十分です。その方が簡単です)。

EAでは、新しいバーで同じ方向に再び建てたポジションを閉じない ために、このすべてを考慮する必要があります。私もかつて、証券会社からリベートをもらえると思い込んで、そんな失敗をしたことがあります。しかし、この場合のリベートの取引頻度は、ペイしないどころか、悪化する一方です。

順番に

MO IS 0.00002.これはもう、-spread以上ですね。つまり、モデルはノイズから何かを学習したが、予測の強さが不十分であるということである。

2番目。データのどの部分を特定の折り目に滑り込ませるか、何らかの形で指定したのでしょうか。CV (repeated CV)をデフォルトにしただけでは、モデルはテストのために無作為に選ばれたオブザベーションをとります。時系列の場合、最適なオプションではありません。

次に、トレードのシミュレーションです。一定時間経過後に開閉する簡単なシグナルがあるのですが。そして、より複雑にすることができるのです。そのため、各トレードのスプレッドを考慮すると、私の手口はプラスになっています。そして、これは現実的に手に入れることができます。

クロスバリデーションの作業をする。時系列のある部分をフォワードに含めるためのインデックスのセットを作成することが可能です。

それに、ニューロニック以外にも方法はいくらでもあります。今一番いいのは、GBMかXGBOOSTですね。私は今のところ1番を選んでいます。好きなんです。

 

trainControlの "repeatedcv "メソッドを使い、デフォルトの分割で行いました。最近、自分でクロスバリデーションのコードを書いて、ランダムに取ったバーと、隙間なく連続的に取ったチャンクの両方でクロスバリデーションを試しました。フロントテストでは、どちらもほぼ同じ結果になり、違いは見られませんでした。トレーニング/クロスバリデーションのデータを50%/50%に分けましたが、この比率ではもう問題ないのかもしれませんね。
カレットで実験してみるか...。

少し前に投稿された記事で、有力な比較対象がPlattの手法によるブースト・ツリー(のようなもの)だったのを覚えています。この方法についてグーグルで調べたところ、モデルの出力をシグモイドに渡して、その結果を取るということしかわかりませんでした。gbmやxgboostは それができるのか?この方法は、2位のforestやneuronka、一部の「袋小路の木」よりも優れているように思います。

理由: