Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 21

 
Dr.Tüccar :

Y ölçeğini de denedim, her iki durumda da (Y ölçeği olan ve olmayan) R^2 aynı çıktı (bu durumlarda farklı paketler kullanılmasına rağmen!).

Y ölçeğinin daha az temel bileşenle aynı iyi sonucu verebileceğini anlıyorum. Ancak, tüm bileşenleri kullansanız bile sonuç hala tatmin edici değilse (şimdiki gibi), o zaman hiçbir fark olmayacaktır. Ayrıca daha hızlı çalışıyor, bu benim için artık daha önemli. Doğru, bu yöntemin genel olarak tahmin edicileri seçmek için uygun olup olmadığını teori veya pratikle henüz kendime kanıtlamadım ... İlk başta, tüm tahmin ediciler üzerinde bir temel bileşen modeli yapma ve aşağıdaki katsayılara bakarak tahmin edicileri seçme fikri vardı. bileşenler. Ama sonra çöp ilavesiyle - R ^ 2 modellerinin düştüğünü fark ettim. Farklı öngörücü kümelerini denemek ve daha yüksek R^2'ye sahip olanları aramak mantıklıdır, ancak bu yine de sadece bir teoridir.

Burada düzenli olarak şu öneriyi yapıyorum: Bana setinizi gönderirseniz, sonuçlarımı sizinkiyle karşılaştırırız.

Benim için ideal olan .RData'dır. Hedefin ikili olduğu ve tahmin edicilerin tercihen gerçek sayılar olduğu bir çerçeve.

 
Dr.Tüccar :

Daha önce ormanı eğitti ve doğrulama kümesinde bir hata döndürdü. Prensip olarak işe yaradı - orman en azından biraz yeniden eğitilmişse, hata hemen% 50'ye düşer.

Şimdi yukarıdaki kod olan GetPCrsquared() kullanıyorum. Ayrıca feature_selector_modeller.txt'den sizin örneğiniz var, ancak bunu çözmeniz ve doğru kod parçasını almanız gerekiyor, bu yüzden henüz verilerim üzerinde test etmedim.

işte bunu almalısın:

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

Bir veri çerçevesinde, en sağdaki sütun hedef sütundur.

TÜM sütunlar kategoriler (tamsayı, karakter veya faktör) olmalıdır.

Ve tüm İncilleri indirmeniz gerekiyor.

Sayıların kategorik değişkenlere nasıl çevrileceğini gösteren bir kod parçası:

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]

}

 

İnternette böyle ilginç bir işlev buldum

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)

belki bu formda algoritma verileri tanımada daha iyi olur? Ancak bir yanlış anlaşılma var, fonksiyonun çıktısı "d" değişkeni ve "x" ve "y" sütunlu iki sütunlu bir matris, biri fiyatı gösteriyor, ikinci kez algoritma tarafından eğriliyor, soru nasıl özelliklerini kaybetmemesi için bu matrisi bir vektöre dönüştürmek

 
San Sanych Fomenko :

Burada düzenli olarak şu öneriyi yapıyorum: Bana setinizi gönderirseniz, sonuçlarımı sizinkiyle karşılaştırırız.

Benim için ideal olan .RData'dır. Hedefin ikili olduğu ve tahmin edicilerin tercihen gerçek sayılar olduğu bir çerçeve.

Ekli, en iyi tahmincilerimdir. trainData - 2015 için eurusd için D1, fronttestData - 1 Ocak 2016'dan Haziran'a kadar. Ön test uzun, gerçek ticarette aynı ayarlarla bir aydan fazla ticaret yapma ihtimalim yok, sadece modelin karlılığının gerçekten ne kadar süreceğini görmek istedim. fronttestData1, fronttestData2, fronttestData3, fronttestData'dan yalnızca Ocak, yalnızca Şubat ve yalnızca Mart için ayrı kupürlerdir. Gerçekten sadece fronttestData1'deki hatayı azaltmakla ilgileniyorum, gerisi sadece araştırma içindir. Tahmin ediciler seti, esas olarak göstergeler ve aralarında çeşitli hesaplamalar içerir. nnet ile fronttestData1'de yineleme kontrolü ve dahili nöron sayısı seçimi ile eğitimde %30 hata alıyorum. Buradaki %30'un sadece bir şans meselesi olduğuna inanıyorum, model Mart 2015'ten Şubat 2016'ya kadar piyasada bir miktar trend yakaladı. Ama diğer dönemlerin birleşmemesi zaten iyi.

İşte mt5 tester 2014.01-2016.06'dan bir resim, eğitim dönemini bir çerçeve ile işaretledim. Zaten eskisinden daha iyi :). Şimdiye kadar, bu benim sınırım, göstergelerle ilgili birçok sorunu çözmem gerekiyor, yani varsayılan parametrelerinin kesinlikle zaman dilimlerine bağlı olduğu gerçeği, örneğin, H1'de deneyimim tamamen işe yaramaz, aynı gösterge seçim algoritması H1'de her şeyi çöp olarak kabul eder. İlk gösterge grubuna farklı parametrelere sahip bir grup varyasyon eklemeniz veya bir şekilde ohlc'den rastgele göstergeler oluşturmanız gerekir.

Dosyalar:
 
Alexey Burnakov :

işte bunu almalısın:

Bu daha açık, teşekkürler. Bana öyle geliyor ki gösterge başına sadece 3 kategori çalışmayacak. Mantıken en az 100 seviye yapardım ama daha mı iyi olur yoksa bu algoritmanın tüm anlamını mı kaybeder?

 
Dr.Tüccar :

Bu daha açık, teşekkürler. Bana öyle geliyor ki gösterge başına sadece 3 kategori çalışmayacak. Mantıken en az 100 seviye yapardım ama daha mı iyi olur yoksa bu algoritmanın tüm anlamını mı kaybeder?

O zaman anlam kaybolur. Algoritma, girdi değişkenlerinin toplam düzeylerini ve yanıt düzeylerinin bu düzeyler arasında nasıl dağıldığını dikkate alır. Buna göre, girdi seviyelerinin her birindeki yanıt değerlerinin sayısı çok düşükse, olasılık çarpıklığının istatistiksel önemini değerlendirmek imkansız olacaktır.

100 seviye yaparsanız, birçok değişken olacaktır. Daha sonra algoritma, sınırlı örnek boyutu göz önüne alındığında oldukça makul olan herhangi bir alt kümenin sıfır önemini döndürür.

Bir örnek iyi bir örnektir.

giriş seviyeleri | gözlem sayısı

1 150

2 120

...

9 90

burada yanıtın içindeki önemi değerlendirebilirsiniz

Örnek kötü.

giriş seviyeleri

112 5

...

357 2

...

1045 1

burada yanıtın içindeki önemi tahmin etmek imkansız

 
Dr.Tüccar :

Ekli, en iyi tahmincilerimdir. trainData - 2015 için eurusd için D1, fronttestData - 1 Ocak 2016'dan Haziran'a kadar. Ön test uzun, gerçek ticarette aynı ayarlarla bir aydan fazla ticaret yapma ihtimalim yok, sadece modelin karlılığının gerçekten ne kadar süreceğini görmek istedim. fronttestData1, fronttestData2, fronttestData3, fronttestData'dan yalnızca Ocak, yalnızca Şubat ve yalnızca Mart için ayrı kupürlerdir. Gerçekten sadece fronttestData1'deki hatayı azaltmakla ilgileniyorum, gerisi sadece araştırma içindir. Tahmin ediciler seti, esas olarak göstergeler ve aralarında çeşitli hesaplamalar içerir. nnet ile fronttestData1'de yineleme kontrolü ve dahili nöron sayısı seçimi ile eğitimde %30 hata alıyorum. Buradaki %30'un sadece bir şans meselesi olduğuna inanıyorum, model Mart 2015'ten Şubat 2016'ya kadar piyasada bir miktar trend yakaladı. Ama diğer dönemlerin birleşmemesi zaten iyi.

İşte mt5 tester 2014.01-2016.06'dan bir resim, eğitim dönemini bir çerçeve ile işaretledim. Zaten eskisinden daha iyi :). Şimdiye kadar, bu benim sınırım, göstergelerle ilgili birçok sorunu çözmem gerekiyor, yani varsayılan parametrelerinin kesinlikle zaman dilimlerine bağlı olduğu gerçeği, örneğin, H1'de deneyimim tamamen işe yaramaz, aynı gösterge seçim algoritması H1'de her şeyi çöp olarak kabul eder. İlk gösterge grubuna farklı parametrelere sahip bir grup varyasyon eklemeniz veya bir şekilde ohlc'den rastgele göstergeler oluşturmanız gerekir.

Fena değil, ancak örneklem dışı dönemlerin kendileri küçük.

Numunenin dışında kaç işlemin kaldığı henüz belli değil. Onlarca, yüzlerce var, ne sıra?

 
Dr.Tüccar :

Ekli, en iyi tahminci setimdir. trainData - 2015 için eurusd için D1, fronttestData - 1 Ocak 2016'dan Haziran'a kadar. Ön test uzun, gerçek ticarette aynı ayarlarla bir aydan fazla ticaret yapma ihtimalim yok, sadece modelin karlılığının gerçekten ne kadar süreceğini görmek istedim. fronttestData1, fronttestData2, fronttestData3, fronttestData'dan yalnızca Ocak, yalnızca Şubat ve yalnızca Mart için ayrı kupürlerdir. Gerçekten sadece fronttestData1'deki hatayı azaltmakla ilgileniyorum, gerisi sadece araştırma içindir. Tahmin ediciler seti, esas olarak göstergeler ve aralarında çeşitli hesaplamalar içerir. nnet ile fronttestData1'de yineleme kontrolü ve dahili nöron sayısı seçimi ile eğitimde %30 hata alıyorum. Buradaki %30'un sadece bir şans meselesi olduğuna inanıyorum, model Mart 2015'ten Şubat 2016'ya kadar piyasada bir miktar trend yakaladı. Ama diğer dönemlerin birleşmemesi zaten iyi.

İşte mt5 tester 2014.01-2016.06'dan bir resim, eğitim dönemini bir çerçeve ile işaretledim. Zaten eskisinden daha iyi :). Şimdiye kadar, bu benim sınırım, göstergelerle ilgili birçok sorunu çözmem gerekiyor, yani varsayılan parametrelerinin kesinlikle zaman dilimlerine bağlı olduğu gerçeği, örneğin, H1'de deneyimim tamamen işe yaramaz, aynı gösterge seçim algoritması H1'de her şeyi çöp olarak kabul eder. İlk gösterge grubuna farklı parametrelere sahip bir grup varyasyon eklemeniz veya bir şekilde ohlc'den rastgele göstergeler oluşturmanız gerekir.

Baktı.

Toplam veri setinde 107 satır (107 gözlem) olduğunu doğru anladım mı?

 
San Sanych Fomenko :

Baktı.

Toplam veri setinde 107 satır (107 gözlem) olduğunu doğru anladım mı?

hayır, eğitim setinde 250'lik satır var (2015'teki işlem gün sayısı). Modeli trainData tablosunda eğittim. Test edildi - fronttestData1'de. Ek kontroller için diğer her şey göz ardı edilebilir

trainData - tüm yıl 2015.
fronttestData1 - Ocak 2016
fronttestData2 - Şubat 2016
fronttestData3 - Mart 2016
fronttestData - Ocak 2016 - Haziran 2016

 
Dr.Tüccar :

hayır, eğitim setinde 250'lik satır var (2015'teki işlem gün sayısı). Modeli trainData tablosunda eğittim. Test edildi - fronttestData1'de. Ek kontroller için diğer her şey göz ardı edilebilir

trainData - tüm yıl 2015.
fronttestData1 - Ocak 2016
fronttestData2 - Şubat 2016
fronttestData3 - Mart 2016
fronttestData - Ocak 2016 - Haziran 2016

Benim için bu çok az - istatistik kullanıyorum. Şu anki pencere için bile 107 satır benim için çok az. Mevcut pencere için 400'ün üzerinde kullanıyorum

Genel olarak, kümelerinizde gözlem sayısı, tahmin edicilerin sayısıyla karşılaştırılabilir. Bunlar çok özel setlerdir. Her nasılsa bu tür setlerin özel yöntemler gerektirdiğini gördüm. Bağlantı yok, çünkü böyle bir sorunum yok.

Ne yazık ki yöntemlerim verileriniz için uygun değil.

Neden: