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

 
サンサニッチ・フォメンコ

NSが何かに対処したという証拠は何もない。

過学習は、科学、特にモデル構築において世界的な悪である。

そのため、3セット分の誤差が必要です。

  • ラーニングセットガラケーの理解する方法(OOB、テスト、検証)で十分です。
  • は、日付の点で、トレーニングセットの外にあるセットです。
  • もうひとつは、日付という意味で外側にあるセット、トレーニングセットです。

最後の2セットは、ターミナルに到着すると混じりっけなしで、バーの後ろにあるベースが登場する。

3セットとも同じ程度の誤差があるはずです。その際、モデルを学習する際に取る予測変数のセットを固定する必要があります。

最初はこの作業での再トレーニングは考えていませんでした、必要性がなかったのです。neuroncは最初、内層に1つのニューロンしかない状態でした。今確認したところ、連続学習中の誤差は45%程度で、それ以下にはならない。ネットワークは、学習時にこれらの入力1,3,5,7,9,11に高い重みを与えるが、ニューロンが不足しているため、実際に学習することはできない。これは、非常に限られた条件の中で、最大限の正しい結果を絞り出し、どの入力をより重視するかを確認するためのアイデアでした。

バリデーションファイルができたことで、より本格的に仕事ができるようになりました。現在、ソースファイルを2つのパート(85%と15%)に分け、最初のパートで学習を行い、時々学習を停止して両方のパートの誤差を測定しています。15%のファイルはトレーニングに入りませんでしたが、その分誤差がトレーニング部分と同じぐらいに減りました。両方のファイルで0%になったところでトレーニングを中止し、2番目のファイルでニューロニクスをテストしたところ、そこでの誤差は〜0%でした。この課題については、オーバートレーニングも達成できていないことが判明し、面白いことになりました。


しかし、FXのニューロニクスは、この問題よりひどい。最初は、トレーニングサンプルと検証サンプルの両方で誤差が減少します。すると、トレーニングサンプルでは誤差が減り続けるが、テストサンプルでは増え始める。この時点で、トレーニングを中止することになる。そして、その結果をサンプル前の履歴でテストし、サンプル後の履歴で再度テストするのが普通です。私にとっては、あなたのような3組のデータです。しかし、3つのセットでここまで誤差が違う(しかもトレーニング期間外では大きい)。

例えば、結果を滑らかにしたり、フィルター(<0.1 - 売り、>0.9 - 買い、その中間は取引のない期間)を追加するなど、結果を改善するためのさまざまなアイデアがあったのです。ニューラル出力にフィルタをかけて最適化することで結果を改善することもできますが、fronttestでは全く役に立ちませんでした。もう一つの良いアイデアは、もしニューロンがある期間の履歴で訓練されていれば、その期間より前の履歴でフィルタを最適化することができる、というものでした。最適化期間前のエラーは、おそらく最適化期間後のエラーと関連しているからです。しかし、うまくいきませんでした。もし、「ニューロン以前」、「学習ニューロン」、「ニューロン以後」という3つの期間の歴史があるとすれば、3つとも最適なフィルターがあり、それらはどのような形でもつながってはいないのです。

これまでのところ、モデルはトレーニングサンプルとテストサンプルで小さな誤差(10%未満)を持つはずだと結論づけています。モデルの結果にフィルターをかけてはいけないし、「4週目ごとに結果を反転させる」ような推測もしてはいけない。M15より小さい周期に陥らないこと。いろいろな新しいアイデアを試してみて、10個のうち1個でも結果が良くなればいいんです。そして、なぜかこれが収益性の高いモデルになっているはずです。

 
Dr.トレーダー

最初はこの作業で再トレーニングをすることは考えていませんでした、必要性がなかったのです。1回目は内層に1つのニューロンしかない状態でした。今確認したところ、長時間トレーニング時の誤差は約45%で、これより下がることはありません。ネットワークは、学習時にこれらの入力1,3,5,7,9,11に高い重みを与えるが、ニューロンが不足しているため、実際に学習することはできない。これは、非常に限られた条件の中で、最大限の正しい結果を絞り出し、どの入力をより重視するかを確認するためのアイデアでした。

バリデーションファイルができたことで、より本格的に仕事ができるようになりました。現在、ソースファイルを2つのパート(85%と15%)に分け、最初のパートで学習を行い、時々学習を停止して両方のパートの誤差を測定しています。15%ファイルの例はトレーニングには入りませんでしたが、その分誤差がトレーニング部分と同じぐらいに減りました。両方のファイルで0%になったところでトレーニングを中止し、2番目のファイルでニューロニクスをテストしたところ、そこでの誤差は〜0%でした。この課題については、オーバートレーニングも達成できていないことが判明し、面白いことになりました。


しかし、FXのニューロニクスは、この問題よりひどい。最初は、トレーニングサンプルと検証サンプルの両方で誤差が減少します。すると、トレーニングサンプルでは誤差が減り続けるが、テストサンプルでは増え始める。この時点で、トレーニングを中止することになる。そして、その結果をサンプル前の履歴でテストし、サンプル後の履歴で再度テストするのが普通です。私にとっては、あなたのような3組のデータです。しかし、3つのセットでここまで誤差が違う(しかもトレーニング期間外では大きい)。

例えば、結果を滑らかにしたり、フィルター(<0.1 - 売り、>0.9 - 買い、その中間は取引のない期間)を追加するなど、結果を改善するためのさまざまなアイデアがあったのです。ニューラル出力にフィルタをかけて最適化することで結果を改善することもできますが、fronttestでは全く役に立ちませんでした。もう一つの良いアイデアは、もしニューロンがある期間の履歴で訓練されていれば、その期間より前の履歴でフィルタを最適化することができる、というものでした。最適化期間前のエラーは、おそらく最適化期間後のエラーと関連しているからです。しかし、うまくいきませんでした。もし、「ニューロン以前」、「学習ニューロン」、「ニューロン以後」という3つの期間の歴史があるとすれば、3つとも最適なフィルターがあり、それらはどのような形でもつながってはいないのです。

これまでのところ、モデルはトレーニングサンプルとテストサンプルで小さな誤差(10%未満)を持つはずだと結論づけています。モデルの結果にフィルターをかけてはいけないし、「4週目ごとに結果を反転させる」ような推測もしてはいけない。M15より小さい周期に陥らないこと。いろいろな新しいアイデアを試してみて、10個のうち1個でも結果が良くなればいいんです。そして、なぜかこれが収益性の高いモデルになっているはずです。

すべてはデータの中にある )

すべてのセットのデータは、相互に独立した観測値を含むべきである。しかし、この場合でも、検証は最悪の結果をもたらします。
 

ラトルのいろいろなモデルを試しましたが、森も良い結果を出してくれました。

ステップ1 - フォレストは何かを学習し、統計では入力1,3,5,7,9,11が何らかの形で分離されているように見えます。学習用ファイルでの誤差0%、検証用ファイルでの誤差46

Step 2 - 入力1,3,5,7,9,11のみをファイルに残し、その結果を表示します。新しいファイルで再度forestを学習させると、学習ファイルと検証ファイルの両方で誤差が0%になり、すべてがうまくいきました。ただ、第2ステップのRattleでは、ファイルサイズが小さくなったためか、「Number of variables」パラメータが2に設定されているのがニュアンスとしてわかりました。というように4に変更しました。

 

Dr.トレーダー

ガラケーをベースにした心の兄弟は嬉しいですね。少なくとも、結果を比較することはできます。

だから、そして私自身の経験も。

そこからガラケーや模型を取り込んでいます。

modelタブでは、AOBの値を取得しながら学習し、Evaluateタブでは、ValidationとTestingのセットで評価します。3桁の数字が出るんですよ。

私は、予測器セットが事前にノイズ予測器を除去していない場合に得られる結果は、何もない、単なる数字の集合である可能性が高いと主張 します。

Evaluateタブでは、結果を一覧表示させるだけでなく、セットをR Datasetウィンドウに入れる必要があります。このセットは、元のファイル、すなわち3桁すべての最初のファイル、例えば2014年1月1日から2015年1月1日まで、を機械的に分割して得られることが非常に重要であるが、その中のファイル

Rデータセット必ずしも2015年1月1日以降にランダムサンプリングやその他のトリックをRで使用することなく。ただ、ぶっきらぼうで機械的なんです。

私が提案する方法は実際の取引を模倣しているので、有意な予測因子とノイズの多い予測因子を分離する成功を評価する他の方法を私は認めません。

4つの数字をすべて掲載していただけませんか?R Datasetウィンドウからファイル上の結果を含む?

 
Dr.トレーダー

ラトルのいろいろなモデルを試しましたが、森も良い結果を出してくれました。

ステップ1 - フォレストは何かを学習し、統計では入力1,3,5,7,9,11が何らかの形で分離されているように見えます。トレーニングファイルでの誤差は0%、検証ファイルでの誤差は46%であった。

Step 2 - 入力1,3,5,7,9,11のみをファイルに残し、その結果を表示します。新しいファイルで再度forestを学習させると、学習ファイルと検証ファイルの両方で誤差が0%になり、すべてがうまくいきました。ただ、第2ステップのRattleでは、ファイルサイズが小さくなったためか、「Number of variables」パラメータが2に設定されているのがニュアンスとしてわかりました。というように4に変更しました。

面白い...関連するものをすべてピックアップするためには、深さを6変数に設定する必要があります。
 
Dr.トレーダー

ラトルのいろいろなモデルを試しましたが、森も良い結果を出してくれました。

ステップ1 - フォレストは何かを学習し、統計では入力1,3,5,7,9,11が何らかの形で分離されているように見えます。トレーニングファイルでの誤差は0%、検証ファイルでの誤差は46%であった。

Step 2 - 入力1,3,5,7,9,11のみをファイルに残し、その結果を表示します。新しいファイルで再度forestを学習させると、学習ファイルと検証ファイルの両方で誤差が0%になり、すべてがうまくいきました。ただ、第2ステップのRattleでは、ファイルサイズが小さくなったためか、「Number of variables」パラメータが2に設定されているのがニュアンスとしてわかりました。というように4に変更しました。

1つ目は、森がノイズを使って学習していたのが良くなかった。
 
サンサニッチ・フォメンコ

4つの数字をすべて掲載していただけませんか?R Datasetウィンドウからファイルに結果を含める?

dummy_set_features.csvを70%/15%/15%の3つに分割し、dummy_set_validation.csvはevaluateタブで「csvファイル」として使用(R Datasetとファイル形式が異なるだけで本質的には同じ)。

Rattleからログを取り出し、先ほど書いたneuronicsの呼び出しからこの2つの制限を取り除き、Rで実行しましたが、モデルはまだアンダートレーニングです(トレーニングサンプルで35%の誤差)。だから、学習サンプルを減らすと、学習結果が悪くなるということが起こるんです。でも、内層のニューロンの数を増やせば、学習効果は上がるはずです。

ニューロン数を10個から20個に変更して学習をやり直したところ、学習時の誤差が0%になりました。検証用サンプルの誤差は0.6%、テスト用サンプルの誤差は0.1%です。dummy_set_validation.csvファイルのエラーは0.3%です。すべて良好、アプリケーションのR。

面白いことに、ニューロンカの学習問題は、木の問題とは全く異なることがわかりました。私にとってのnnの問題は、適切な数の内部ニューロンを取り、ネットワークが再学習を始める前に学習を中断することです。原理的にはニューロンの数が多ければ多いほど良いのですが、これは必要なRAMと学習時間に大きく影響します。余計な予測変数は学習の大きな妨げにはならず、ニューロニックは通常それがあっても同じように学習しますが、学習時間が増えるので、より速くするためには取り除いた方が良いのです。

自作のmt4ネットワークを使ったら、EAがすぐに学習して取引できるようになった。学習速度、重みの初期化、学習アルゴリズムに問題があった。細かい問題が多すぎて、学習用サンプルでもなかなか良い結果が出ず、結局諦めて、今はRで作業しています。nnetパッケージはbfgsアルゴリズムで学習させることができるので、そういった小さな問題はすべて取り除くことができます。しかし、パッケージにはインナー1枚だけという制限があります。少なくとも3つの内部レイヤーを持ちたいのですが、bfgsアルゴリズムでないと、再学習の際に多くの問題が発生します。

ファイル:
r_nnet2.txt  10 kb
 
Dr.トレーダー

neuronでやってみた - dummy_set_features.csvは標準で70%/15%/15%の3分割、dummy_set_validation.csvは評価タブで「csvファイル」として使用(これはR Datasetとファイル形式が違うだけで本質的には 同じ)。

いいえ、同じではありません。

驚いたことに、私はこの問題を多くの人と議論していますが、私の書き方のようにする人はいません。それに、あなたのような演習に半年かけて外ガラ()してるので、何を書いてるのかわかりますよ。テスターに入れないものは、全く違うエラーが出ます。その後、上記のようにしたところ、テスターでのエラーとR Datasetファイルでのエラーが実質的に一致しました。

アレクセイには、1つの大きなファイルを機械的に3つに分割したファイルを3つ渡した。第一部では、運動、学習、評価...を行います。そして、残りの2つは、1つ目で得た数値を確認するのです。3つのファイルすべての誤差が20%以上(!)、より正確には40%に近い場合、モデルは再トレーニングされないので、それを使って作業することができます。

上記の3つのファイルは、27の予測変数と6つのターゲット変数を持っています。この27の予測変数は、170の予測変数から私自身のアルゴリズムによって選ばれたものです。現在のところ、この27個の予測変数は過剰学習されたモデルにはなっていない。しかし、私のセットから残りの143の予測変数はノイズであり、このノイズで簡単にあなたと同等の誤差が得られますが、モデルは過剰に訓練され、それ以上の使用には適していません。

なぜ、有意予測因子よりもノイズ予測因子の方が誤差が少ないのでしょうか?

私の考えでは、モデルフィッティングのアルゴリズムはフィッティングの誤差を小さくしようとするので、ノイズの多いランダムな値の中から、意味のある予測因子よりも優れたものを常に見つけることができるのだと思います。その結果、誤差が小さくなればなるほど、モデル構築に関わる有意義な予測変数が少なくなるのです

追記

誤差から判断すると、NSは100%オーバートレーニングか、先を見据えているかのどちらかです。

 

evaluateタブの「CSVファイル」と「Rデータセット」は、単にデータソースの指定方法が違うだけです。同じデータを送り込めば、モデルをテストするときに同じ結果が得られます。

ガタが来る前に実行した場合

dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

とすると、このdataset_validateはRデータセットとしてevaluateタブで利用できるようになります。しかし、モデル検査の結果は、csvファイルオプションを選択してC:/dummy_set_validation.csvというファイルを指定するだけで、どちらも同じテスト用データになるため、結局は同じになります。

学習自体はdummy_set_features.csvという別ファイルで行っているので、両ファイルのデータは異なっており、時間依存性は全くない(ただし数式依存性はある)ため、ここで先を見ることは不可能である。ニューロニクスは素晴らしい仕事をし、結果を決定する6つの入力を見つけ、他の入力の影響を減らし、いくつかのニューラル・ロジックで目的の数式を記述したと思います。

念のため、両方のファイルをチェックして、重複している文字列があれば、それを見つけるようにしました。以下はRでのコードです。

#читаем  данные из файлов для обучения и валидации
dataset_train <- read.csv("file:///C:/dummy_set_features.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

anyDuplicated(dataset_train) #количество  повторных строк в первом файле - 567
anyDuplicated(dataset_validate) #количество  повторных строк во втором файле - 202
#  это покачто просто повторные строки в обоих файла по отдельности. Это не вредит, но и ничего не улучшает, лучше их убрать.
dataset_train <- unique(dataset_train)
dataset_validate <- unique(dataset_validate)

#Теперь  можно узнать сколько строк из dataset_train повторяются в dataset_validate
dataset_combined <- rbind(dataset_train, dataset_validate) #Объединяем  оба файла в один
nrow(dataset_combined) - nrow(dataset_combined[!duplicated(dataset_combined), ]) #количество  повторенных строк - 23. Таких повторов быть не должно, их надо удалить.
#Удаление  повторенных строк из dataset_validate
dataset_validate <- dataset_validate[!(tail(duplicated(dataset_combined), nrow(dataset_validate))), ]
#Удаление  из памяти объединённого файла, он больше не нужен
rm(dataset_combined)

この処理をrattleの前に行うと、dataset_trainとdataset_validateの 両方のテーブルが学習とモデルのチェックに利用でき、重複がなくなります。グローリーR

モデル検証用ファイルには、学習用サンプルからの繰り返しが23個含まれていますが、その上にさらに3000のユニークな行があるので、モデル評価に大きな影響を与えることはありませんでした。

 
これが、あるべき姿です。ファイルは乱数で生成されます。

一般的に、私は課題の複雑さを過大評価していました。それは、実はすでに森が解決していることなのです。森の仕組みに照らし合わせると、どうしてそんなことが可能なのかと思われるかもしれません。
理由: