Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 2801

 
Aleksey Vyazmikin #:

Почему они должны соответствовать бинарным? Я просто сказал о том, что скрипт рабочий, но не со всеми данными работает.

Ну не знаю, может ты сепаратор поменял например или ещё что то..
И какую ошибку выдаёт скрипт я так и не понял
И почему ты установил пакеты на более новый Р, а используешь старый Р
 
Aleksey Vyazmikin #:

Вот пробуй, пришлось все переписать наново, там такой говнокод был что я сам не понял что он делает

df <- read.csv(file = file.choose(), header = T,sep = ";",dec = ".",stringsAsFactors = F)


# указываем какие колонки не использовать
not_used_vars <- c("Target_100_Buy","Target_100_Sell","Target_P","Time","Target_100")


# сохраняем отдельно не испозуемые колонки
not_used_vars_df <- df[,not_used_vars]


# создаем датафрейм для поиска, без колонок  not_used_vars
df <- df[!names(df) %in% not_used_vars]


# чтобы прочитать как работает функция и примеры  ?caret::findCorrelation
# находим колонки которые не коррелированы с порогом корреляции 0,9    "cutoff = 0.9"
not_corr_colums <- caret::findCorrelation(as.matrix(df), cutoff = 0.9, exact = F,names = F)


# оставляем df с некоррелироваными колонками
df <- df[,not_corr_colums]


# обьединяем все в результирующий датафрейм
df <- cbind.data.frame(not_used_vars_df , df)


# сохраняем результат
res_save_way <- "C:\\......\\not_correl_data.csv"
write.csv2(x = df,file = res_save_way,row.names = F)
 
Aleksey Vyazmikin #:

Как то Вы делали скрипт, которым я решил вот снова воспользоваться

Запустил его на выборке, а он выдает ошибку - не могу понять, где искать ошибку и как исправить - может Вы знаете, раз пользуетесь этими библиотеками/пакетами?

На бинарной выборке все отработало нормально.

Ошибка говорит о том, что в корреляционной матрице появились неопределенные значения(NA) и функция findCorrelation не может ее использовать. Открой пакет и почитай описание функций.

Скрипты расхристанные и море ненужных промежуточных результатов. внизу скрипт исправленный

#=====================================================================
require(tidyft)
#--get df1------------------------------------------------------------
way <-         "D:\\FX\\MT5_CB\\MQL5\\Files\\Po_Vektoru_TP_0_SL_0\\EURUSD_0\\Setup"
df1 = read.csv(paste0(way, "train.csv"), header = TRUE, sep = ";",dec = ".")
#df1 = fread(paste0(way, "train1.csv"))
#fst::write_fst(df1, "train1.fst")
#-----archiv--------------------------------
ft <- as_fst(df1) #
rm(df1)


#---constanti--------------------------------------------
cor.test.range <- seq(from = 0.1,to = 0.9,by = 0.1)  # диапазон перебора в коеф корр
not.used.colums = c("Target_100_Buy","Target_100_Sell","Target_P","Time","Target_100")

ft %>% select_fst(cols = not.used.colums, negate = TRUE)-> dt
#--function--------------------------------------------
get.findCor<- function(data , cor.coef = cor.test.range){
    import::here(.from = caret, findCor = findCorrelation)
    data %>%
        cor(method = "kendall", use = "pairwise" ) %>%
        findCor(cutoff = cor.coef, exact = FALSE, names = TRUE)->nms
        if(nms!= 0)
        select_dt(data, cols = nms, negate = TRUE)
}
#----Calculate--------------------------------------------------------------
for(i in seq_len(length(cor.test.range))){
    get.findCor(dt, cor.coef = cor.test.range[i])-> dt.n
    paste0("train2_" , cor.test.range[i]*10 , ".csv") %>%
        paste0(way , .) %>% fwrite(dt.n, .)
    rm(dt.n)
}

Пояснения по порядку:

1. Не нужно грузить пакет "caret" в глобальную область. Он очень тяжелый, тянет очень много зависимостей и данных. Тебе нужна только одна функция его. Ты ее импортируешь прямо в функцию get.findCor.

Пакет tidyft очень быстрый пакет манипуляции датафреймами. Используй его.

 

Для контроля я проверил на своем наборе с использованием этого скрипта. Результат:

# patch <- "C:/RData/Project/FEDOT/"
# df1 <- fread(paste0(patch, "DF_train_M5.csv"))
# object.size(df1) #780184 bytes
# dim(df1) #[1] 4030   25
# ft <- as_fst(df1)#
# rm(df1)
#ft %>% select_fst(cols = c(1:3,25), negate = TRUE)-> dt
#dim(dt) [1] 4030   21
bench::workout({
    for(i in seq_len(length(cor.test.range))){
        get.findCor(dt, cor.coef = cor.test.range[i])-> dt.n
        paste0("train2_" , cor.test.range[i]*10 , ".csv") %>%
            paste0(patch , .) %>% fwrite(dt.n, .)
        rm(dt.n)
    }
})->t1 #(12.9 m)
setwd(patch)
dim(fread("train2_1.csv"))
#[1] 4030    3
dim(fread("train2_2.csv"))
#[1] 4030    6
dim(fread("train2_3.csv"))
#[1] 4030   10
dim(fread("train2_4.csv"))
#[1] 4030   13
dim(fread("train2_5.csv"))
#[1] 4030   16
dim(fread("train2_6.csv"))
#[1] 4030   17
dim(fread("train2_7.csv"))
#[1] 4030   18
dim(fread("train2_8.csv"))
#[1] 4030   18
dim(fread("train2_9.csv"))
#[1] 4030   18

считает довольно долго (12.9 мин.). Но и фрейм не маленький. Конечно нужно распараллелить, поискать более быструю функцию cor.

Из первоначальных 21 предикторов с разными порогами отбиралось разное количество предикторов. 

Но это не тот путь по которому нужно идти.

Удачи

 
СанСаныч Фоменко #:

Вы не обратили внимание на изменчивость sd

обращу в след. раз, посчитаю sd от sd от sd %)

 

Привязка смещения окна признаков к какому-нибудь индикатору (например std) ничего не дала

чем больше значение тем больше смещение, кратное этому значению

или наоборот. Попробовал оба.

есть еще вариант расширения-сужения (+смещение?), пока не пробовал

в рамках фракталов только перебор таких вариантов вижу

 
Vladimir Perervenko #:

1. Не нужно грузить пакет "caret" в глобальную область. Он очень тяжелый, тянет очень много зависимостей и данных. Тебе нужна только одна функция его. Ты ее импортируешь прямо в функцию get.findCor.

Ух ты, поленая штука

Vladimir Perervenko #:

Владимир, а не знаете, есть ли пакет для бектеста который ведет журнал сделок и все такое (ну чтобы не примитивщина), кроме медленного "quantstrat" и "SIT"

 
Maxim Dmitrievsky #:

Привязка смещения окна признаков к какому-нибудь индикатору (например std) ничего не дала

чем больше значение тем больше смещение, кратное этому значению

или наоборот. Попробовал оба.

есть еще вариант расширения-сужения (+смещение?), пока не пробовал

в рамках фракталов только перебор таких вариантов вижу

Абсолютно точно.

Все надо пересчитывать на каждом шаге.

 
СанСаныч Фоменко #:

Абсолютно точно.

Все надо пересчитывать на каждом шаге.

мне проще перебирать способы пересчета метки vs фичи на большом датасете, чем переобучать каждый бар, завязну надолго

Да и частым переобучением вы определяете какую-то общую закономерность, если глобально посмотреть. Если эта конструкция не льет конечно.
 
Maxim Dmitrievsky #:

мне проще перебирать способы пересчета метки vs фичи на большом датасете, чем переобучать каждый бар, завязну надолго

Полностью согласен, именно из-за этого не удается перейти к советнику.

Но это поврос принципиальный. Я перешел на схему "учить на каждом шаге" из-за скрытого заглядывания вперед, которые возникают из-за  подготовки всего дэйтасета. У меня именно эта проблема, причем я не смог найти предикторы, которые порождают эффект "заглядывания вперед". 

Причина обращения: