Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 213
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Başka bir simülasyon örneği.
20.000 doğrusal model oluşturulmuştur (her yerde 1000 gözlem, tahminci sayısı 1 ila 20 arasındadır (her sayı için 1000 model), artı bir bağımsız değişken). Veri kimliği, N(0,1).
Simülasyonun amacı, doğrusal modelin gereksinimlerini karşılayan bağımsız veriler (bağımlılık içermeyen) üzerinde bir LSM regresyonu oluştururken, F-istatistiğinin kritik bir değeri aşmadığından emin olmaktır. Bu, modelin eğitiminin bir göstergesi olarak kullanılabileceği anlamına gelir.
############### simulate lm f-stats with random vars
rm(list=ls());gc()
library(data.table)
library(ggplot2)
start <- Sys.time()
set.seed(1)
x <- as.data.table(matrix(rnorm(21000000, 0, 1), ncol = 21))
x[, sampling:= sample(1000, nrow(x), replace = T)]
lm_models <- x[,
{
lapply(c(1:20), function(x) summary(lm(data = .SD[, c(1:x, 21), with = F], formula = V21 ~ . -1))$'fstatistic'[[1]])
}
, by = sampling
]
lm_models_melted <- melt(lm_models, measure.vars = paste0('V', c(1:20)))
crtitical_f_stats <- qf(p = 0.99, df1 = c(1:20), df2 = 1000, lower.tail = TRUE, log.p = FALSE)
boxplot(data = lm_models_melted, value ~ variable); lines(crtitical_f_stats, type = 's', col = 'red')
Sys.time() - start
gc()
Kod çalışma süresi: 1.35 dakika.
Yararlı kod. İşlem dizileri üç şekilde görselleştirilir.
##########################
rm(list=ls());gc()
library(data.table)
library(ggplot2)
library(gridExtra)
library(tseries)
start <- Sys.time()
set.seed(1)
x <- as.data.table(matrix(rnorm(1000000, 0.1, 1), ncol = 1)) #random normal value with positive expectation
x[, variable:= rep(1:1000, times = 1000)]
x[, trade:= 1:.N, by = variable]
x.cast = dcast.data.table(x, variable ~ trade, value.var = 'V1', fun.aggregate = sum)
x_cum <- x.cast[, as.list(cumsum(unlist(.SD))), by = variable]
monte_trades <- melt(x_cum, measure.vars = names(x_cum)[-1], variable.name = "trade", value.name = 'V1')
setorder(monte_trades, variable, trade)
monte_trades_last <- as.data.table(monte_trades[trade == '1000', V1])
quantile_trade <- monte_trades[, quantile(V1, probs = 0.05), by = trade]
RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[1]], by = variable]
p1 <- ggplot(data = monte_trades, aes(x = trade, y = V1, group = variable)) +
geom_line(size = 2, color = 'blue', alpha = 0.01) +
geom_line(data = quantile_trade, aes(x = trade, y = V1, group = 1), size = 2, alpha = 0.5, colour = 'blue') +
ggtitle('Simulated Trade Sequences of Length 1000')
p2 <- ggplot(data = monte_trades_last, aes(V1)) +
geom_density(alpha = 0.1, size = 1, color = 'blue', fill = 'blue') +
scale_x_continuous(limits = c(min(monte_trades$V1), max(monte_trades$V1))) +
coord_flip() +
ggtitle('Cumulative Profit Density')
p3 <- ggplot(data = RF_last, aes(V1)) +
geom_density(alpha = 0.1, size = 1, color = 'blue', fill = 'blue') +
geom_vline(xintercept = mean(RF_last$V1), colour = "blue", linetype = 2, size = 1) +
geom_vline(xintercept = median(RF_last$V1), colour = "red", linetype = 2, size = 1) +
ggtitle('Recovery Factor Density + Mean (blue) and Median (red)')
grid.arrange(p1, p2, p3, ncol = 3)
Sys.time() - start
gc()
Yaklaşık 45 sn çalışır. Yaklaşık 1.5 dakika işliyor.
Simülasyonun amacı, doğrusal modelin gereksinimlerini karşılayan bağımsız veriler (bağımlılık içermeyen) üzerinde bir LSM regresyonu oluştururken, F-istatistiğinin kritik bir değeri aşmadığından emin olmaktır. Bu nedenle, model öğrenmenin bir göstergesi olarak kullanılabilir.
Bu örnekten elde edilen sonuç nasıl doğru bir şekilde yorumlanır?
İlk tahmin edicinin birinci + saniyeden daha iyi kabul edilebileceğini anlıyorum. Ve 1+2, 1+2+3'ten daha iyidir. Bunun gibi bir şey mi? En yüksek istatistiki değeri verecek bir dizi tahmin ediciyi seçmek için genetiği kullanmak mantıklı mı?
Fstatistic'i tam olarak anlamadım. Buradaki veriler rastgeledir, ancak model bir şeyler öğrenmiştir, bu nedenle modelin takıldığı ve fazla takıldığı sonucuna varabiliriz. Bu, modelin değerlendirmesinin kötü olması gerektiği anlamına gelir. Onlar. Negatif bir istatistik bekliyordum ya da grafikte her şeyin kötü olduğuna dair başka bir gösterge.
Bu örnekten çıkan sonuç nasıl doğru bir şekilde yorumlanır?
İlk tahmin edicinin birinci + saniyeden daha iyi kabul edilebileceğini anlıyorum. Ve 1+2, 1+2+3'ten daha iyidir. Bunun gibi bir şey mi? En yüksek istatistiki değeri verecek bir dizi tahmin ediciyi seçmek için genetiği kullanmak mantıklı mı?
Tablo F dağılımına bakın. http://www.socr.ucla.edu/applets.dir/f_table.html
F istatistiği, serbestlik derecelerine bağlı bir niceliktir. Tek taraflı bir dağılımımız olduğu için her zaman pozitiftir.
Ancak, eğitilen modelin yüksek bir F istatistiğine sahip olması gerektiğinden model hiçbir şey öğrenmez (belirli bir alfa için kritik değerden büyük veya buna eşit - sıfır hipotezini test ederken duyulduğu gibi).
Her durumda, alfa = 0,01'deki kritik değeri aşmadılar, ancak örneğin 0,0001'i ayarlayabilirsiniz.
Aynı zamanda, lineer modele gürültü değişkenleri eklemenin öğrenmede bir artış göstermeyeceğinden emin olmak istedim (bunu üniversitede okumadım). Ne görüldü...
Yararlı kod. İşlem dizileri üç şekilde görselleştirilir.
Yukarıdaki kodla ilgili. Lütfen koda en azından kısa yorumlar yazın. Özellikle karmaşık ifadeler kullanırken. Herkes "data.table" paketini bilmiyor ve kullanmıyor, dcast.data.table'ın ne yaptığını, .N, .SD'nin ne olduğunu açıklamak gereksiz değil. Konunun ne kadar derinde olduğunu göstermemek için kodu yayınlıyorsunuz. Benim düşünceme göre, yayınlanan kod diğer kullanıcıların (ilk eğitim seviyesinde bile) komut dosyasını anlamalarına yardımcı olmalıdır.
R'nin eylemi birkaç şekilde programlamanıza izin vermesi harika, ancak kodun okunabilirliğinin kaybolmaması arzu edilir.
Birkaç kod önerisi:
- ara değişkenler x, x.cast, x.cum hesaplamalarda gerekli değildir ve sadece hafızayı işgal eder. Boru aracılığıyla ara sonuçların kaydedilmesini gerektirmeyen tüm hesaplamaların yapılması arzu edilir.
örneğin
rm(list=ls());gc()
library(data.table)
library(ggplot2)
library(gridExtra)
library(tseries)
#----
require(magrittr)
require(dplyr)
start <- Sys.time()
monte_trades <- as .data.table(matrix(rnorm( 1000000 , 0.1 , 1 ), ncol = 1 )) %>%
.[, variable := rep( 1 : 1000 , times = 1000 )]%>%
.[, trade := 1 :.N, by = variable] %>%
dcast.data.table(., variable ~ trade, value . var = 'V1' , fun.aggregate = sum)%>%
.[, as .list(cumsum(unlist(.SD))), by = variable]%>%
melt(., measure.vars = names(.)[- 1 ], variable.name = "trade" , value .name = 'V1' )%>%
setorder(., variable, trade)
monte_trades_last <- as .data.table(monte_trades[trade == '1000' , V1])
quantile_trade <- monte_trades[, quantile(V1, probs = 0.05 ), by = trade]
RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[ 1 ]], by = variable]
Sys.time() - start
#Time difference of 2.247022 secs
Ve elbette, grafikleri oluşturmak çok uzun zaman alıyor.
Eleştiri değil.
İyi şanlar
Fstatistic'i tam olarak anlamadım. Buradaki veriler rastgeledir, ancak model bir şeyler öğrenmiştir, bu nedenle modelin takıldığı ve fazla takıldığı sonucuna varabiliriz. Bu, modelin değerlendirmesinin kötü olması gerektiği anlamına gelir. Onlar. Negatif bir fstatistiс veya grafikte her şeyin kötü olduğuna dair başka bir gösterge bekliyordum.
Bu örnekten çıkan sonuç nasıl doğru bir şekilde yorumlanır?
İlk tahmin edicinin birinci + saniyeden daha iyi kabul edilebileceğini anlıyorum. Ve 1+2, 1+2+3'ten daha iyidir. Bunun gibi bir şey mi? En yüksek istatistiki değeri verecek bir dizi tahmin ediciyi seçmek için genetiği kullanmak mantıklı mı?
Ve işte tam olarak eğitilmiş bir modelin 20 değişken içereceğini ve bunların ağırlık artışlarını (1 değişken - ağırlık 1, 20. değişken - ağırlık 20) içereceğini varsaydığımızda bir örnek. Modele sırayla tahmin ediciler ekledikten sonra F istatistiklerinin dağılımının nasıl değişeceğini görelim:
############### simulate lm f-stats with non-random vars
rm(list=ls());gc()
library(data.table)
library(ggplot2)
start <- Sys.time()
set.seed(1)
x <- as.data.table(matrix(rnorm(20000000, 0, 1), ncol = 20))
x[, (paste0('coef', c(1:20))):= lapply(1:20, function(x) rnorm(.N, x, 1))]
x[, output:= Reduce(`+`, Map(function(x, y) (x * y), .SD[, (1:20), with = FALSE], .SD[, (21:40), with = FALSE])), .SDcols = c(1:40)]
x[, sampling:= sample(1000, nrow(x), replace = T)]
lm_models <- x[,
{
lapply(c(1:20), function(x) summary(lm(data = .SD[, c(1:x, 41), with = F], formula = output ~ . -1))$'fstatistic'[[1]])
}
, by = sampling
]
lm_models_melted <- melt(lm_models, measure.vars = paste0('V', c(1:20)))
crtitical_f_stats <- qf(p = 0.99, df1 = c(1:20), df2 = 1000, lower.tail = TRUE, log.p = FALSE)
boxplot(data = lm_models_melted, value ~ variable, log = 'y'); lines(crtitical_f_stats, type = 's', col = 'red')
summary(lm(data = x[sample(1000000, 1000, replace = T), c(1:20, 41), with = F], formula = output ~ . -1))
Sys.time() - start
gc()
Logaritmik y ekseni ile arsa:
Görünüşe göre evet...
> summary(lm(data = x[sample(1000000, 1000, replace = T), c(1:20, 41), with = F], formula = output ~ . -1))
Call:
lm(formula = output ~ . - 1, data = x[sample(1e+06, 1000, replace = T),
c(1:20, 41), with = F])
Residuals:
Min 1Q Median 3Q Max
-19.6146 -2.8252 0.0192 3.0659 15.8853
Coefficients:
Estimate Std. Error t value Pr(>|t|)
V1 0.9528 0.1427 6.676 4.1e-11 ***
V2 1.7771 0.1382 12.859 < 2e-16 ***
V3 2.7344 0.1442 18.968 < 2e-16 ***
V4 4.0195 0.1419 28.325 < 2e-16 ***
V5 5.2817 0.1479 35.718 < 2e-16 ***
V6 6.2776 0.1509 41.594 < 2e-16 ***
V7 6.9771 0.1446 48.242 < 2e-16 ***
V8 7.9722 0.1469 54.260 < 2e-16 ***
V9 9.0349 0.1462 61.806 < 2e-16 ***
V10 10.1372 0.1496 67.766 < 2e-16 ***
V11 10.8783 0.1487 73.134 < 2e-16 ***
V12 11.9129 0.1446 82.386 < 2e-16 ***
V13 12.8079 0.1462 87.588 < 2e-16 ***
V14 14.2017 0.1487 95.490 < 2e-16 ***
V15 14.9080 0.1458 102.252 < 2e-16 ***
V16 15.9893 0.1428 111.958 < 2e-16 ***
V17 17.4997 0.1403 124.716 < 2e-16 ***
V18 17.8798 0.1448 123.470 < 2e-16 ***
V19 18.9317 0.1470 128.823 < 2e-16 ***
V20 20.1143 0.1466 137.191 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.581 on 980 degrees of freedom
Multiple R-squared: 0.9932, Adjusted R-squared: 0.993
F-statistic: 7123 on 20 and 980 DF, p-value: < 2.2e-16
Teşekkür ederim! Bunu henüz yapamadım. Ama gerçekten, mümkün olduğu kadar hesaplamaları hafızada tutmak gerekiyor. Daha hızlı olacak. İyi kung fu...
Yaptığınız değişikliklerle:
#---variant-------------
rm(list=ls());gc()
library(data.table)
library(ggplot2)
library(gridExtra)
library(tseries)
#----
require(magrittr)
require(dplyr)
start <- Sys.time()
monte_trades <- as.data.table(matrix(rnorm(1000000, 0.1, 1), ncol = 1)) %>%
.[, variable := rep(1:1000, times = 1000)]%>%
.[, trade := 1:.N, by = variable] %>%
dcast.data.table(., variable ~ trade, value.var = 'V1', fun.aggregate = sum)%>%
.[, as.list(cumsum(unlist(.SD))), by = variable]%>%
melt(., measure.vars = names(.)[-1], variable.name = "trade", value.name = 'V1')%>%
setorder(., variable, trade)
monte_trades_last <- as.data.table(monte_trades[trade == '1000', V1])
quantile_trade <- monte_trades[, quantile(V1, probs = 0.05), by = trade]
RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[1]], by = variable]
p1 <- ggplot(data = monte_trades, aes(x = trade, y = V1, group = variable)) +
geom_line(size = 2, color = 'blue', alpha = 0.01) +
geom_line(data = quantile_trade, aes(x = trade, y = V1, group = 1), size = 2, alpha = 0.5, colour = 'blue') +
ggtitle('Simulated Trade Sequences of Length 1000')
p2 <- ggplot(data = monte_trades_last, aes(V1)) +
geom_density(alpha = 0.1, size = 1, color = 'blue', fill = 'blue') +
scale_x_continuous(limits = c(min(monte_trades$V1), max(monte_trades$V1))) +
coord_flip() +
ggtitle('Cumulative Profit Density')
p3 <- ggplot(data = RF_last, aes(V1)) +
geom_density(alpha = 0.1, size = 1, color = 'blue', fill = 'blue') +
geom_vline(xintercept = mean(RF_last$V1), colour = "blue", linetype = 2, size = 1) +
geom_vline(xintercept = median(RF_last$V1), colour = "red", linetype = 2, size = 1) +
ggtitle('Recovery Factor Density + Mean (blue) and Median (red)')
grid.arrange(p1, p2, p3, ncol = 3)
Sys.time() - start
Çalışma süresi 47 saniye. Yani kod daha güzel ve derli toplu hale geldi ama hız farkı yok evet render çok uzun. 1000 satır şeffaflık - onlar sayesinde...
Teşekkür ederim! Bunu henüz yapamadım. Ama gerçekten, hesaplamaları mümkün olduğunca hafızada tutmak gerekiyor. Daha hızlı olacak. İyi kung fu...
Çalışma süresi 47 saniye. Yani kod daha güzel ve derli toplu hale geldi ama hız farkı yok evet render çok uzun. 1000 satır şeffaflık - onlar sayesinde...
bir hesabım var
# - saniye cinsinden yürütme süresi
# min lq ortalama medyan uq maks neval
# 2.027561 2.253354 2.254134 2.275785 2.300051 2.610649 100
Ama o kadar da önemli değil. Kod okunabilirliği ile ilgiliydi.
İyi şanlar
not. Ve lm() hesaplamalarını paralelleştirin. Bu sadece ihtiyacınız olduğunda durum
bir hesabım var
# - saniye cinsinden yürütme süresi
# min lq ortalama medyan uq maks neval
# 2.027561 2.253354 2.254134 2.275785 2.300051 2.610649 100
Ama o kadar da önemli değil. Kod okunabilirliği ile ilgiliydi.
İyi şanlar
not. Ve lm() hesaplamalarını paralelleştirin. Bu sadece ihtiyacınız olduğunda durum
Hayır. Kod bölümünü grafiklerden önce zamanlıyorsunuz. Grafiklerle birlikte belirttim.
Grafiklerden önce elimde: 1.5 saniye. Yönteminiz 1.15 saniyedir.
rm(list=ls());gc()
library(data.table)
library(ggplot2)
library(gridExtra)
library(tseries)
start <- Sys.time()
set.seed(1)
x <- as.data.table(matrix(rnorm(1000000, 0.1, 1), ncol = 1)) #random normal value with positive expectation
x[, variable:= rep(1:1000, times = 1000)]
x[, trade:= 1:.N, by = variable]
x.cast = dcast.data.table(x, variable ~ trade, value.var = 'V1', fun.aggregate = sum)
x_cum <- x.cast[, as.list(cumsum(unlist(.SD))), by = variable]
monte_trades <- melt(x_cum, measure.vars = names(x_cum)[-1], variable.name = "trade", value.name = 'V1')
setorder(monte_trades, variable, trade)
monte_trades_last <- as.data.table(monte_trades[trade == '1000', V1])
quantile_trade <- monte_trades[, quantile(V1, probs = 0.05), by = trade]
RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[1]], by = variable]
Sys.time() - start
rm(list=ls());gc()
library(data.table)
library(ggplot2)
library(gridExtra)
library(tseries)
#----
require(magrittr)
require(dplyr)
start <- Sys.time()
monte_trades <- as.data.table(matrix(rnorm(1000000, 0.1, 1), ncol = 1)) %>%
.[, variable := rep(1:1000, times = 1000)]%>%
.[, trade := 1:.N, by = variable] %>%
dcast.data.table(., variable ~ trade, value.var = 'V1', fun.aggregate = sum)%>%
.[, as.list(cumsum(unlist(.SD))), by = variable]%>%
melt(., measure.vars = names(.)[-1], variable.name = "trade", value.name = 'V1')%>%
setorder(., variable, trade)
monte_trades_last <- as.data.table(monte_trades[trade == '1000', V1])
quantile_trade <- monte_trades[, quantile(V1, probs = 0.05), by = trade]
RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[1]], by = variable]
Sys.time() - start
Görünüşe göre hala daha hızlısın ...