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

 
Dr.トレーダー

Yスケールも試してみましたが、(Yスケールありとなしの)両方のケースでR^2が同じになりました(違うパッケージを使っているにもかかわらず!)。

Yスケールなら、もっと少ない主成分数で、同じような結果が得られるのではないでしょうか。しかし、すべてのコンポーネントを使用しても、満足のいく結果が得られない場合(私の場合)、違いはないのです。それに、今の私にとってより重要なのは、動作が速いことです。しかし、この方法が予測変数の選択に適しているかどうか、理論的にも実践的にも証明されていません。当初は、すべての予測変数に対して主成分をモデル化し、成分の係数を見て予測変数を選択するというアイデアを持っていました。しかし、ゴミを追加すると、モデルのR^2が低下することに気づきました。予測変数のセットをいろいろ試してみて、R^2が高いものを探すのは理にかなっていますが、あくまで理論上の話です。

私はここで定期的に次のような提案をしています。もしあなたが自分のセットを蒸留して私に送ってくれたら、私の結果とあなたの結果を比較しますよ。

私にとっては、.RDataが理想です。ターゲットが2値で、予測変数が実数であることが望ましいフレーム。

 
Dr.トレーダー

以前はフォレストを学習させ、検証用サンプルでエラーを返していました。原理的にはうまくいきました。森が少しでもオーバートレーニングになると、誤差が50%になる傾向があるのです。

今はGetPCrsquared()、その上のコードを使っています。feature_selector_modeller.txt にあるあなたの例も持っていますが、それを理解して必要なコードフラグメントを取得しなければならないので、まだ自分のデータを確認していません。

そこで必要なものをご紹介します。

library(infotheo) # measured in nats, converted to bits

library(scales)

library(GenSA)


#get data

sampleA <- read.table('C:/Users/aburnakov/Documents/Private/dummy_set_features.csv'

, sep= ','

, header = T)




#calculate parameters

predictor_number <- dim(sampleA)[2] - 1

sample_size <- dim(sampleA)[1]

par_v <- runif(predictor_number, min = 0, max = 1)

par_low <- rep(0, times = predictor_number)

par_upp <- rep(1, times = predictor_number)



#load functions to memory

shuffle_f_inp <- function(x = data.frame(), iterations_inp, quantile_val_inp){

mutins <- c(1:iterations_inp)

for (count in 1:iterations_inp){

xx <- data.frame(1:dim(x)[1])

for (count1 in 1:(dim(x)[2] - 1)){

y <- as.data.frame(x[, count1])

y$count <- sample(1 : dim(x)[1], dim(x)[1], replace = F)

y <- y[order(y$count), ]

xx <- cbind(xx, y[, 1])

}

mutins[count] <- multiinformation(xx[, 2:dim(xx)[2]])

}

quantile(mutins, probs = quantile_val_inp)

}



shuffle_f <- function(x = data.frame(), iterations, quantile_val){

height <- dim(x)[1]

mutins <- c(1:iterations)

for (count in 1:iterations){

x$count <- sample(1 : height, height, replace = F)

y <- as.data.frame(c(x[dim(x)[2] - 1], x[dim(x)[2]]))

y <- y[order(y$count), ]

x[dim(x)[2]] <- NULL

x[dim(x)[2]] <- NULL

x$dep <- y[, 1]

rm(y)

receiver_entropy <- entropy(x[, dim(x)[2]])

received_inf <- mutinformation(x[, 1 : dim(x)[2] - 1], x[, dim(x)[2]])

corr_ff <- received_inf / receiver_entropy

mutins[count] <- corr_ff

}

quantile(mutins, probs = quantile_val)

}


############### the fitness function

fitness_f <- function(par){

indexes <- c(1:predictor_number)

for (i in 1:predictor_number){

if (par[i] >= threshold) {

indexes[i] <- i

} else {

indexes[i] <- 0

}

}

local_predictor_number <- 0

for (i in 1:predictor_number){

if (indexes[i] > 0) {

local_predictor_number <- local_predictor_number + 1

}

}

if (local_predictor_number > 1) {

sampleAf <- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])])

pred_entrs <- c(1:local_predictor_number)

for (count in 1:local_predictor_number){

pred_entrs[count] <- entropy(sampleAf[count])

}

max_pred_ent <- sum(pred_entrs) - max(pred_entrs)

pred_multiinf <- multiinformation(sampleAf[, 1:dim(sampleAf)[2] - 1])

pred_multiinf <- pred_multiinf - shuffle_f_inp(sampleAf, iterations_inp, quantile_val_inp)

if (pred_multiinf < 0){

pred_multiinf <- 0

}

pred_mult_perc <- pred_multiinf / max_pred_ent

inf_corr_val <- shuffle_f(sampleAf, iterations, quantile_val)

receiver_entropy <- entropy(sampleAf[, dim(sampleAf)[2]])

received_inf <- mutinformation(sampleAf[, 1:local_predictor_number], sampleAf[, dim(sampleAf)[2]])

if (inf_corr_val - (received_inf / receiver_entropy) < 0){

fact_ff <- (inf_corr_val - (received_inf / receiver_entropy)) * (1 - pred_mult_perc)

} else {

fact_ff <- inf_corr_val - (received_inf / receiver_entropy)

}

} else if (local_predictor_number == 1) {

sampleAf<- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])])

inf_corr_val <- shuffle_f(sampleAf, iterations, quantile_val)

receiver_entropy <- entropy(sampleAf[, dim(sampleAf)[2]])

received_inf <- mutinformation(sampleAf[, 1:local_predictor_number], sampleAf[, dim(sampleAf)[2]])

fact_ff <- inf_corr_val - (received_inf / receiver_entropy)

} else  {

fact_ff <- 0

}

return(fact_ff)

}



########## estimating threshold for variable inclusion


iterations = 5

quantile_val = 1


iterations_inp = 1

quantile_val_inp = 1


levels_arr <- numeric()

for (i in 1:predictor_number){

levels_arr[i] <- length(unique(sampleA[, i]))

}


mean_levels <- mean(levels_arr)

optim_var_num <- log(x = sample_size / 100, base = round(mean_levels, 0))


if (optim_var_num / predictor_number < 1){

threshold <- 1 - optim_var_num / predictor_number

} else {

threshold <- 0.5

}



#run feature selection


start <- Sys.time()


sao <- GenSA(par = par_v, fn = fitness_f, lower = par_low, upper = par_upp

     , control = list(

      #maxit = 10

        max.time = 1200

        , smooth = F

        , simple.function = F))


trace_ff <- data.frame(sao$trace)$function.value

plot(trace_ff, type = "l")

percent(- sao$value)

final_vector <- c((sao$par >= threshold), T)

names(sampleA)[final_vector]

final_sample <- as.data.frame(sampleA[, final_vector])


Sys.time() - start

データフレームでは、一番右の列が対象列となる。

すべての列はカテゴリ(ineteger、character、factor)でなければなりません。

そして、すべてのビブリングをロードする必要があります。

数値をカテゴリー変数に変換する方法を示すコードの一部。

disc_levels <- 3 # сколько равночастотных уровней переменной создается


for (i in 1:56){

naming <- paste(names(dat[i]), 'var', sep = "_")

dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1]

}

 

インターネット上でこんな面白い機能を見つけました。

data_driven_time_warp <- function (y) {
  cbind(
    x = cumsum(c(0, abs(diff(y)))),
    y = y
  )
}


y <- cumsum(rnorm(200))+1000
i <- seq(1,length(y),by=10)
op <- par(mfrow=c(2,1), mar=c(.1,.1,.1,.1))
plot(y, type="l", axes = FALSE)
abline(v=i, col="grey")
lines(y, lwd=3)
box()
d <- data_driven_time_warp(y)
plot(d, type="l", axes=FALSE)
abline(v=d[i,1], col="grey")
lines(d, lwd=3)
box()
par(op)

このような形であれば、アルゴリズムがデータをよりよく認識できるかもしれませんね?しかし、1つの問題があります。関数の出力は変数 "d" であり、それは2列 "x" と "y" の行列を持っています、1つは価格と2番目のアルゴリズムによって湾曲した時間を表し、問題はそれがそのプロパティを失うことはありませんようにベクトルにこの行列を有効にする方法です。

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

私はここで定期的に次のような提案をしています。もし、あなたのセットを私に配布していただければ、私の結果とあなたの結果を比較します。

私にとっては、.RDataが理想です。2値のターゲットと予測変数が実数であることが望ましいフレーム。

アタッチメントは、私の最も得意とする予測因子である。TrainDataは2015年のeurusdのD1、fronttestDataは2016年1月1日から6月までのD1。実際の取引では、同じ設定で1ヶ月以上取引することはまずないので、このモデルの収益性が実際にどの程度続くのかを確かめたかったのです。fronttestData1、fronttestData2、fronttestData3はfronttestDataから、1月分のみ、2月分のみ、3月分のみを切り出したものである。本当に興味があるのはfronttestData1の誤差を小さくすることだけで、あとは研究用です。予測器セットは、主に指標とその間の異なる計算を含んでいる。fronttestのnnetエラーはfronttestData1で30%、反復制御で学習し、内部ニューロン数を適合させました。この30%はたまたまだと思うのですが、2015年3月から2016年2月にかけて、このモデルは市場のあるトレンドを捉えました。でも、残りの期間がマージされないというのは、もう良いですね。

mt5 tester 2014.01-2016.06の画像ですが、トレーニング期間に枠で印をつけました。すでに、より良いものになっています :) 。今のところ、これが私の限界です。私は、指標の多くの問題を解決しなければならない、すなわち、彼らのデフォルトの設定は厳密に時間枠に縛られている、例えば、H1で私の経験は完全に役に立たない、H1で指標の選択のための同じアルゴリズムがすべてをゴミと見なします。そのバリエーションをパラメータを変えて初期セットに加えるか、自分でohlcからランダムな指標を生成する必要がありますね。

ファイル:
 
アレクセイ・ブルナコフ

を取るには、これがある。

その方が納得できますね、ありがとうございます。1つの指標に3つのカテゴリーだけではダメなようです。論理的には100レベル以上作ることになるのですが、その方がいいのか、アルゴリズムのセンスが緩んでしまうのか。

 
Dr.トレーダー

その方が納得できますね、ありがとうございます。1つの指標に3つのカテゴリーだけではダメなようです。論理的には100レベル以上作ることになりますが、そのほうがいいのか、それともアルゴリズムの意味がなくなってしまうのか。

アルゴリズムが意味をなさなくなる。アルゴリズムは、入力変数のレベルの 総数をカウントし、これらのレベルの応答レベルによって分配される。したがって、各入力レベルの応答値の数が非常に少ない場合、確率の歪みの統計的な有意性を評価することができなくなる。

100のレベルを作れば、たしかに多くの変数が存在することになります。その場合、アルゴリズムはどの部分集合に対しても有意差ゼロを返しますが、これは限られたサンプルサイズを考えれば妥当なことです。

例えが良いですね。

入力レベル|観測回数

1 150

2 120

...

9 90

ここで、応答内の有意性を推定することができます

の例 - 悪い。

入力レベル

112 5

...

357 2

...

1045 1

回答内の有意性はここでは推定できない

 
Dr.トレーダー

アタッチメントは、私の最も得意とする予測因子である。TrainDataは2015年のeurusdのD1、fronttestDataは2016年1月1日から6月までのD1。実際の取引では、同じ設定で1ヶ月以上取引することはまずないので、このモデルの収益性が実際にどれくらい続くのかを確かめたかったのです。fronttestData1、fronttestData2、fronttestData3はfronttestDataから、1月分のみ、2月分のみ、3月分のみを切り出したものである。本当に興味があるのはfronttestData1の誤差を小さくすることだけで、あとは研究用です。予測器セットは、主に指標とその間の異なる計算を含んでいる。fronttestのnnet errorはfronttestData1で30%、反復制御で学習し、内部ニューロン数を適合させました。この30%はたまたまだと思うのですが、2015年3月から2016年2月にかけて、このモデルは市場のあるトレンドを捉えました。でも、残りの期間がマージされないというのは、もう良いですね。

mt5 tester 2014.01-2016.06の画像ですが、トレーニング期間に枠で印をつけました。もう、それ以上です :) 。今のところ、これが私の限界です。私は、指標の多くの問題を解決しなければならない、すなわち、彼らのデフォルトの設定は厳密に時間枠に縛られている、例えば、H1で私の経験は完全に役に立たない、H1で指標の選択のための同じアルゴリズムがすべてをゴミと見なします。私は、オリジナルの指標セットに、異なるパラメータを持つ多くのバリエーションを追加するか、どうにかしてohlcからランダムな指標を生成する必要があります。

悪くはないが、サンプル外の期間そのものが小さい。

また、サンプル外のトレードがどれくらいあるのかも不明です。何十人、何百人といますが、順番は?

 
Dr.トレーダー

アタッチメントは、私の最も得意とする予測因子である。TrainDataは2015年のeurusdのD1、fronttestDataは2016年1月1日から6月までのD1。実際の取引では、同じ設定で1ヶ月以上取引することはまずないので、このモデルの収益性が実際にどれくらい続くのかを確かめたかったのです。fronttestData1、fronttestData2、fronttestData3はfronttestDataから、1月分のみ、2月分のみ、3月分のみを切り出したものである。本当に興味があるのはfronttestData1の誤差を小さくすることだけで、あとは研究用です。予測器セットは、主に指標とその間の異なる計算を含んでいる。fronttestのnnet errorはfronttestData1で30%、反復制御で学習し、内部ニューロン数を適合させました。この30%はたまたまだと思うのですが、2015年3月から2016年2月にかけて、このモデルは市場のあるトレンドを捉えました。でも、残りの期間がマージされないというのは、もう良いですね。

mt5 tester 2014.01-2016.06の画像ですが、トレーニング期間に枠で印をつけました。もう、それ以上です :) 。今のところ、これが私の限界です。私は、指標の多くの問題を解決しなければならない、すなわち、彼らのデフォルトの設定は厳密に時間枠に縛られている、例えば、H1で私の経験は完全に役に立たない、H1で指標の選択のための同じアルゴリズムがすべてをゴミと見なします。私は、オリジナルの指標セットに、異なるパラメータを持つ多くのバリエーションを追加するか、どうにかしてohlcからランダムな指標を生成する必要があります。

見てきました。

全データセットで107行(107個の観測値)というのは、正しく理解できましたか?

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

見てみた。

データセットの合計が107行(107個の観測値)であることは正しく理解されましたか?

いいえ、トレーニングセットには250数行(2015年の取引日数)があります。trainDataのテーブルでモデルを学習させました。fronttestData1でテストしてみました。それ以外は追加チェック用なので、無視しても大丈夫です

trainData - 2015年の1年間。
fronttestData1 - 2016年1月
fronttestData2 - 2016年2月
fronttestData3 - 2016年3月
fronttestData - 2016年1月 - 2016年6月

 
Dr.トレーダー

いいえ、トレーニングセットには250数行(2015年の取引日数)があります。trainDataテーブルでモデルを学習させました。fronttestData1でテストしてみました。それ以外は余計なチェックのためなので、無視していただいて結構です。

trainData - 2015年の1年間。
fronttestData1 - 2016年1月
fronttestData2 - 2016年2月
fronttestData3 - 2016年3月
fronttestData - 2016年1月 - 2016年6月

私の場合、これはほとんどありません。統計を使っています。現在のウィンドウでも107列は私にはとても小さいです。現在のウィンドウは400枚以上使っています。

一般に、あなたのセットでは、オブザベーションの数は予測変数の数に匹敵します。これらは非常に特殊なセットです。なんとなくですが、このようなセットには特別な方法が必要なのではと見ています。そのような問題がないため、参考文献はありません。

残念ながら、私の方法はあなたのデータには適していません。

理由: