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

 
Aleksey Vyazmikin:

Итак, провел я первую фазу исследований

Сколько же энергии ушло....

 
mytarmailS:

Сколько же энергии ушло....

Это подарок всем скептикам.

 
Maxim Dmitrievsky:

Или отсеять по корреляции все предикторы сначала (секунды времени), а потом взять оставшиеся 5-15 (если от силы столько наберется) 

А вот проверю я Вашу идею - мне не сложно. Так какой коэффициент корреляции взять? И как из оставшихся предикторов отобрать 5-15 - напишите конкретно - может как измерить их там надо и упорядочить?

 
mytarmailS:

Сколько же энергии ушло....

Вместо того, что бы считать чужие деньги, могли бы Вы подсказать по R?

Вот сделал скрипт, который должен корреляцию посчитать и удалить коррелирующие столбцы.

library('caret')

df1 = read.csv("F:\\FX\\Открытие Брокер_Demo\\MQL5\\Files\\Proboy_236_TP_4_SL_4\\Si\\Setup\\train.csv", header = TRUE, sep = ";",dec = ".")

df1 <- df1[, ! colnames(df1)  %in% 
           c("Target_100_Buy",
             "Target_100_Sell",
             "Target_P",
             "Time",
             "Target_100")  ] # удаляем не нужные колонки
print (df1)
df2 = cor(df1)
hc = findCorrelation(df2, cutoff=0.3) # putt any value as a "cutoff" 
hc = sort(hc)
reduced_Data = df1[,-c(hc)]
print (reduced_Data)
write.table(reduced_Data, file = "F:\\FX\\Открытие Брокер_Demo\\MQL5\\Files\\Proboy_236_TP_4_SL_4\\Si\\Setup\\outfile_03.csv",
            append = FALSE, quote = FALSE, sep=";",
            eol = "\n", na = "NA", dec = ".", row.names = FALSE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

И есть два вопроса:

1. Как сделать выполнение этого кода в цикле for, а именно мне нужно увеличивать коэффициент и менять название файла для сохранения с индексом коэффициента, или в другую директорию, генерируемую в цикле.

2. Я убираю для расчетов вспомогательные столбцы, как их скопировать в появившуюся таблицу (df2) после удаления коррелирующих столбцов.

Спасибо за ответ.

 
Aleksey Vyazmikin:

Вместо того, что бы считать чужие деньги, могли бы Вы подсказать по R?

Вот сделал скрипт, который должен корреляцию посчитать и удалить коррелирующие столбцы.

И есть два вопроса:

1. Как сделать выполнение этого кода в цикле for, а именно мне нужно увеличивать коэффициент и менять название файла для сохранения с индексом коэффициента, или в другую директорию, генерируемую в цикле.

2. Я убираю для расчетов вспомогательные столбцы, как их скопировать в появившуюся таблицу (df2) после удаления коррелирующих столбцов.

Спасибо за ответ.

ответ на вопрос (2)

library('caret')
#df1 загруженная дата
df1 <- as.data.frame(matrix(nrow = 100,ncol = 10,data = sample(1:10,1000,replace = T)))
# head(df1)

not <- c("V1","V2","V3") #  имена переменных которые нам НЕ нужны для корреляции

df2 <-  cor(     df1[, ! colnames(df1)  %in%  not]      )  
# head(df2)

not.need <- findCorrelation(df2, cutoff=0.1) # putt any value as a "cutoff" 
not.need.nms <- colnames(df2[,not.need])  # получаем имена переменных что не прошли коррел тест
# head(not.need.nms)

# получаем изначальную  df1 только без признаков что не прошли отбор
reduced_Data <- df1[, ! colnames(df1)  %in%  not.need.nms]
# head(reduced_Data)


теперь можно написать функцию которая делает тоже самое но выглядит более аккуратно

get.findCorrelation <- function(data , not.used.colums , cor.coef){
library('caret')
df2 <-  cor(     data[, ! colnames(data)  %in%  not.used.colums])  
not.need <- findCorrelation(df2, cutoff=cor.coef) 
not.need.nms <- colnames(df2[,not.need])  # получаем имена переменных что не прошли коррел тест
reduced_Data <- data[, ! colnames(data)  %in%  not.need.nms]
return(reduced_Data)}

 

gf <- get.findCorrelation(data = df1 , 
                          not.used.colums = c("V1","V2","V3"),
                          cor.coef = 0.1)

на вход подается файл  

data = df1
указываем колонки что не будут использоваться для корел анализа

not.used.colums = c("V1","V2","V3")

ну  и настройка коеф. корел из функции findCorrelation

cor.coef = 0.1
на выходе получаем  df1 но без мусорных признаков
 

теперь ответ на первый вопрос

way <- "F:\\FX\\Открытие Брокер_Demo\\MQL5\\Files\\Proboy_236_TP_4_SL_4\\Si\\Setup\\"

cor.test.range <- seq(from = 0.1,to = 0.7,by = 0.1)  # диапазон перебора в коеф корр

for(i in 1:length(cor.test.range)){
  
  reduced_Data <- get.findCorrelation(data = df1 , 
                      not.used.colums = c("V1","V2","V3"),
                      cor.coef = cor.test.range[i] )
  
  file.name <- paste0("test.with.cor_" , cor.test.range[i] , ".csv")
  final.way <- paste0(way , file.name)
  
  
  write.csv2(x = reduced_Data,file = final.way,row.names = F)  # возможно это лучше
  
  # write.table(reduced_Data, file = final.way,
  #             append = FALSE, quote = FALSE, sep=";",
  #             eol = "\n", na = "NA", dec = ".", row.names = FALSE,
  #             col.names = TRUE, qmethod = c("escape", "double"),
  #             fileEncoding = "")
}
 
Aleksey Vyazmikin:

Далее мной было проведено обучение с фиксированной настройкой квантовой таблицы на выборке train - 60% test - 20% exam - 20% с

А вам не кажется, что вы свою модель тюните под самый успешный вариант на test?
Сам несколько раз попадал на удачные тестовые участки и думал - вот он Грааль))). А после смещения участков вперед или назад на несколько месяцев, - все становилось ясно и модель уже не та и предикторы не те, а на тех - слив.

Я полностью перешел на анализ моделей на кросс-валидации или валкинг-форварде. В лучшем случае видел 50%50.
У дока в одном из последних сообщений было тоже про кросс-валидацию.

 
YURY_PROFIT:

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

YURY_PROFIT:

Приведите, пожалуйста, пример прибыльного советника на машинном обучении, который хотя бы 3 месяца работал на реальном рынке в прибыль без переобучения

Так а в чем собственно проблема непрерывно дообучать? Что за вакуумные условия "без переобучения"? Если на форварде работает хоть день это уже грааль, а дообучать можно хоть каждым тиком, это дело техники.

 
mytarmailS:

теперь ответ на первый вопрос

Спасибо!

Попробую разобраться, но сходу сложно - всё же синтаксис кода существенно отличается от C++.

 
elibrarius:

А вам не кажется, что вы свою модель тюните под самый успешный вариант на test?

А в какой момент я тюню на test, на Ваш взгляд? Выборка "test" используется для остановки обучения, в Проектах, кроме одного, её вообще нет, потом я использовал её при окончательном обучении - ну можно заменить на фиксированное число деревьев - 50/100/300/500/800 и посмотреть результат по всем выборкам, тогда полагаете будет получен значительно хуже результат?