Начало по ссылкам: https://www.mql5.com/ru/blogs/post/659572 https://www.mql5.com/ru/blogs/post/659929 https://www.mql5.com/ru/blogs/post/660386 https://www.mql5.com/ru/blogs/post/661062
В статье описано использование пакета Rattle для автоматического поиска паттернов, способных предсказывать "лонги" и "шорты" для валютных пар рынка Форекс. Статья будет полезна как новичкам, так и опытным трейдерам.
賞金の条件をはっきりさせる。
最初に 問題を解いた人に5クレジットプレゼント
ソリューションの締切2016年6月30日(木
情報量の多い特徴を選択するアルゴリズムを適用して、取引戦略を実行する例もある。
皆さんは、私のブログで「大きな実験」(https://www.mql5.com/ru/blogs/post/661895)をご覧になったことがあると思います。
そして、こんな写真もあります。
5つのペアで1つのパターンを見つけ、25年程度の検証サンプルで正しく推測された取引の割合を検出することを試みました。すぐにはうまくいかなかった。どの予測地平においても、望ましい精度に達しなかった。
次に、1ペアだけ、eurusdを取り上げます。3時間先の値動きが、私の予測変数の部分集合に依存していることを発見しました。
予測因子をカテゴリー形式に落とし、有意な予測因子を探索する機能を開始しました。今、仕事中に、20分でやりました。
[1] "1.51%"
> final_vector <- c((sao$par >= threshold), T)
> names(sampleA)[final_vector]
[1] "lag_diff_45_var" "lag_diff_128_var" "lag_max_diff_8_var" "lag_max_diff_11_var" "lag_max_diff_724_var" "lag_sd_362_var"
[7] "output"
それほど早くは収束しませんでしたが、説明力1.5パーセントのレベルである程度の結果を得ることができました。
収束グラフ(最小化)。
次に、モデルの構築です。
我々はいくつかのカテゴリ予測因子を持っています。予測因子と出力の間にどのような関係があるのか、つまり3時間の時間軸でロングかショートかという「ルールブック」を構築するのです。
その結果、どのような姿になるのか。
各行の買い数と売り数の歪度と、50/50の分布に合致するためのカイ二乗基準のp値の対応値を見ることができます。確率が0.01より低い行だけを選択する。
そして、すでに入力が選択された時点から始まる、実験全体のコード。
dat_test <- sampleA[, c("lag_diff_45_var"
, "lag_diff_128_var"
, "lag_max_diff_8_var"
, "lag_max_diff_11_var"
, "lag_max_diff_724_var"
, "lag_sd_362_var"
, "output")]
dat_test$concat <- do.call(paste0, dat_test[1:(ncol(dat_test) - 1)])
x <- as.data.frame.matrix(table(dat_test$concat
, dat_test$output))
x$pval <- NA
for (i in 1:nrow(x)){
x$pval[i] <- chisq.test(x = c(x$`0`[i], x$`1`[i])
, p = c(0.5, 0.5))$p.value
}
trained_model <- subset(x
, x$pval < 0.01)
trained_model$concat <- rownames(trained_model)
trained_model$direction <- NA
trained_model$direction [trained_model$`1` > trained_model$`0`] <- 1
trained_model$direction [trained_model$`0` > trained_model$`1`] <- 0
### test model
load('C:/Users/aburnakov/Documents/Private/big_experiment/many_test_samples.R')
many_test_samples_eurusd_categorical <- list()
for (j in 1:49){
dat <- many_test_samples[[j]][, c(1:108, 122)]
disc_levels <- 3
for (i in 1:108){
naming <- paste(names(dat[i]), 'var', sep = "_")
dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1]
}
dat$output <- NA
dat$output [dat$future_lag_181 > 0] <- 1
dat$output [dat$future_lag_181 < 0] <- 0
many_test_samples_eurusd_categorical[[j]] <- subset(dat
, is.na(dat$output) == F)[, 110:218]
many_test_samples_eurusd_categorical[[j]] <- many_test_samples_eurusd_categorical[[j]][(nrow(dat) / 5):(2 * nrow(dat) / 5), ]
}
correct_validation_results <- data.frame()
for (i in 1:49){
dat_valid <- many_test_samples_eurusd_categorical[[i]][, c("lag_diff_45_var"
, "lag_diff_128_var"
, "lag_max_diff_8_var"
, "lag_max_diff_11_var"
, "lag_max_diff_724_var"
, "lag_sd_362_var"
, "output")]
dat_valid$concat <- do.call(paste0, dat_valid[1:(ncol(dat_valid) - 1)])
y <- as.data.frame.matrix(table(dat_valid$concat
, dat_valid$output))
y$concat <- rownames(y)
valid_result <- merge(x = y, y = trained_model[, 4:5], by.x = 'concat', by.y = 'concat')
correct_sell <- sum(subset(valid_result
, valid_result$direction == 0)[, 2])
correct_buys <- sum(subset(valid_result
, valid_result$direction == 1)[, 3])
correct_validation_results[i, 1] <- correct_sell
correct_validation_results[i, 2] <- correct_buys
correct_validation_results[i, 3] <- sum(correct_sell
, correct_buys)
correct_validation_results[i, 4] <- sum(valid_result[, 2:3])
correct_validation_results[i, 5] <- correct_validation_results[i, 3] / correct_validation_results[i, 4]
}
hist(correct_validation_results$V5, breaks = 10)
plot(correct_validation_results$V5, type = 's')
sum(correct_validation_results$V3) / sum(correct_validation_results$V4)
次に、検証用サンプルは49個あり、それぞれおよそ5年分である。その上でモデルを検証し、トレードの方向を正しく推測した割合を数えてみましょう。
サンプル別の正しく推測された取引の割合と、この値のヒストグラムを見てみましょう。
そして、すべてのサンプルについて、合計でどれだけ取引の方向を推測したかをカウントします。
> sum(correct_validation_results$`total correct deals`) / sum(correct_validation_results$`total deals`)
[1] 0.5361318
約54%です。しかし、AskとBidの間の距離を克服する必要があることを考慮に入れずに。つまり、スプレッド=1pipと仮定した場合、上記チャートによる閾値は約53%です。
つまり、例えば端末でチャージしやすいシンプルなモデルを30分で練り上げたのです。しかも、委員会でもない。そして、20時間どころか20分も依存関係を探しているのです。全てに於いて、何かがある。
そして、そのすべては、情報量の多い属性を適切に選択したおかげです。
そして、有効なサンプルごとの詳細な統計情報。
すべての生データは、ブログのリンク先でご覧いただけます。
そしてこのモデルは、ほとんど利益を生まない。MOは半減期レベル。でも、それが私の方向性なんです。
常に過去から学ぶ
私たちは何世紀も前からグラフを見ています。両オンで「三兵」、次に「頭肩」を見る。これらの数字のうち、いくつを私たちはすでに見ており、これらの数字を信じ、取引しているのか...。
そして、このようにタスクが設定されている場合。
1.すべてのチャートではなく、特定の通貨ペア、日本の米の取引で3世紀前ではなく、最近発生したものに、自動的にそのような数字を見つけることです。
2)そのような図形-パターンを自動的に探索するための初期データ。
最初の質問に対しては、「ランダムフォレスト」と呼ばれるアルゴリズムを考えてみよう。 このアルゴリズムは、1つまたは複数の通貨の相場、指標、価格の増分など、人間が発明したあらゆるものを入力データとして動作させるものである。10-5-100-200 ...の入力変数です。そして、1本のバーに対応するある時点の値を参照する変数の全セットを取り、これらの入力変数の組み合わせが、履歴データ上でかなり特定の結果、例えばBUYオーダーに対応するようなものを探します。そして、別の注文のための別の組み合わせである「SELL」。このような集合には、それぞれ別の木が対応する。経験上、18000本のバー(約3年分)の入力セットに対して、200~300本の木を見つけることができる。これは、「頭と肩」、「口全体」のほぼ相似形のパターンのセットです。
このアルゴリズムの問題点は、このようなツリーでは、将来遭遇しないような仕様も拾ってしまうことである。これをこのフォーラムでは「スーパーフィッティング」、機械学習では「オーバーフィッティング」と呼んでいます。大きな入力変数の集合全体は、出力変数に関係するものとノイズに関係しないものに分けられることが分かっている。そこでブルナコフは、アウトプットに無関係なものを排除しようとする。
PS.
トレンドTS(BUY、SELL)を構築する場合、どのような種類のワゴンもノイズに関係します
あなたが見ているものは、市場のごく一部であり、最も重要なものではありません。誰も逆さまにピラミッドを作っているわけではありません。
あなたが見ているものは、市場のごく一部であり、最も重要なものではありません。誰も逆さまにピラミッドを作っているわけではありません。
入力データでニューロンを学習させてみて、重みを見る。入力データの重みが小さい場合は、不要と思われます。R(ラトル)でやりました。SanSanychさんの記事https://www.mql5.com/ru/articles/1165 に感謝します。
この方法は実際にテストしたわけではないのですが、うまくいったのでしょうか、そうでもないのでしょうか。私なら、input_1 input_3 input_5 input_7 input_9 input_11 を取る。
入力データでニューロンを学習させてみて、重みを見る。入力データの重みが小さい場合は、不要と思われます。R(ラトル)でやりました。SanSanychさんの記事https://www.mql5.com/ru/articles/1165 に感謝します。
この方法は実際にテストしたわけではないのですが、うまくいったのでしょうか、そうでもないのでしょうか。私なら、input_1 input_3 input_5 input_7 input_9 input_11 を取る。
)うーん、とても興味深いです。
質問を明確にすること。その上で、13、14、16のように、ウェイトが小さい入力をもう少し入れてはどうでしょうか。インプットとウェイトを重量順に並べた図を示してもらえますか?
すみません、最初分かりませんでした。はい、指定された入力は、当然のように大きなモジュロ・ウエイトを持っています。
目視では、すべてのウェイトが2つのグループに分かれています。意義があるかないかで分けるなら、5、11、7、1、3、9が明らかに目立つので、このセットで十分だと思います。