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

 
Maxim Dmitrievsky #:
100 в год по сигналам 

Вполне нормально имхо, около 8 сделок в месяц. Для HFT конечно мало.

 

решыл попрограммировть (первый раз за три четыре месяца).


Идея : собрать ансамбль из множества ТС у которых на выходе 1 покупка -1 продажа. Сигналы ТС сумируються в некий осцилятор и таким образом можно видеть перекупленость/перепроданость

(Много ТС купили - перекуплено, много продали - перепродано) 


Запустил PSO для генерации меток класса которые дают прибыль и RF в качестве МО-шки в качестве генератора сигналов (ТС)

Инструмент евра м1, период тестирования OOS  20к свечей.

Запустил погремуху, процесс поиска и создания ТС пошел


нагенерил около 35 шт. ТС


Создаем осцилятор из сигналов ТС и визулизируем на OOS


 

Также добавил кумулятивную сумму от осцилятора для лучшего понимания


Обратная корреляция цены с торговлей ансамбля ТС очевидна

 
mytarmailS #:

Также добавил кумулятивную сумму от осцилятора для лучшего понимания


Обратная корреляция цены с торговлей ансамбля ТС очевидна

это не обратная корреляция, а "запаздывание" ;-)

 
mytarmailS #:

Также добавил кумулятивную сумму от осцилятора для лучшего понимания


Обратная корреляция цены с торговлей ансамбля ТС очевидна

смотрим сумму открытых позиций в динамике из сайта агрегатора и видим тоже самое


 
mytarmailS #:

смотрим сумму открытых позиций в динамике из сайта агрегатора и видим тоже самое

Таким образом наблюдая торговлю большого ансамбля "прибыльных на истории" ТС можно симулировать действия какой то группы примитивных игроков которых большынство


код по создания погремухи генератора ТС и создания осцилятора + визуализация прилагаю...

library(garage)
library(quantmod)
library(dbscan)
library(randomForest)
library(pso)


d <- read.csv("D:\\fin_data\\EURUSD_M1_2022_2024.csv", 
              sep = "", header = T, check.names = F)

colnames(d) <- gsub("[<>]", "", colnames(d))
colnames(d)[ colnames(d) == "VOL" ] <- "VOLUME"


d <- d[1:100000,]
d[,3:6] <- d[,3:6] + rnorm(n = nrow(d), sd = 0.0000001)


indic <- TTR_indicators(d, n = 10)
indic[is.na(indic)] <- 0
indic <- cbind(close=Cl(d), indic)



set.seed(1)
hd <- hdbscan(t(indic[200:2000,]), minPts = 5)
indic[, hd$cluster==3] <- indic[, hd$cluster==3] - indic$close




count_balance <- function(prices,signals){
  p <- c(0,diff(prices))
  s <- c(0,signals[-length(signals)])
  return(   cumsum(p*s)   )
}



tr <- 101:200
ts <- 201:20000

p <- as.matrix(OHLC(d))


bst_model <- list()



bst_val <- -0.96
fit <- function(y){
  
rf <- randomForest(y~., indic[tr,], ntree=100)
sig <- sign(predict(rf, indic[ts, ]))

B <- count_balance(d[ts,]$CLOSE, signals = sig)

res <- cor(B, 1:length(B)) / -1


if(res < bst_val){
  bst_val <<- res
  li <- list(model=rf, Y=y, val=res, bal=B)
  bst_model <<- append(bst_model, list(li))
 
  plot(B, t="l", main=round(res,4))
}

res
}



pso <- psoptim(rep(NA,length(tr)),
               fit,
               lower= -10,
               upper=  10,
               
               control=list(trace=1,
                            REPORT=1,
                            maxit=20))


bst_model |> length()


vl <- 20001:22000+1000


preds <- lapply(1:length(bst_model), \(i)
                   sign(predict(bst_model[[i]]$model, indic[vl,])))


res <- as.data.frame(preds) |> as.matrix() |> rowSums()


k <- 1:200+200
par(mfrow=c(3,1), mar=c(2,2,2,2))
plot(res[k],t="l", main="сумма сигналов") ; abline(h=c(0,25,-25), col=c(1,2,3))
plot(cumsum(res[k]),t="l", main="кумулятивная сумма сигналов") 
plot(d$CLOSE[vl][k],t="l", main="цена закрытия")

 
mytarmailS #:

Также добавил кумулятивную сумму от осцилятора для лучшего понимания


Обратная корреляция цены с торговлей ансамбля ТС очевидна

Какой хороший OOS у вас.

Коррелляция естественна, т.к. чем выше цена - тем больше роботы продают и чем ниже - тем больше покупают. И это не запаздывание - это естественная логика трейдинга: покупай дешевое, продавай дорогое.

 
Forester #:
Какой хороший OOS у вас.

Коррелляция естественна, т.к. чем выше цена - тем больше роботы продают и чем ниже - тем больше покупают. И это не запаздывание - это естественная логика трейдинга: покупай дешевое, продавай дорогое.

вполне вероятно

[Удален]  
В ONNX бы сконвертить, для проверки )
 
Мне кажется там маркап не учтен.
И что надо все тесты в пунктах проводить (или сообщать каким лотом). 0,06-0,08 чего-то за 20тыс сделок. Выглядит маловато.