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

 
mytarmailS:

Р-ка, форекс

Ну функция которая бы считала график баланса по сделкам + комиссию\спред  (издержки)

написал вот такое, не знаю правильно ли


Я вот здесь не понял

trades.count <- length(rle(c(sig))$values) # сколько было сделок
 
mytarmailS:

Р-ка, форекс

Ну функция которая бы считала график баланса по сделкам + комиссию\спред  (издержки)

написал вот такое, не знаю правильно ли


Думаю что количество сделок тут не нужно считать. А просто из каждой сделки вычесть спред с комиссией. Как то так:

calc.balance <- function(sig,x, comision=0){
sig <- ifelse(sig>0, 1, -1)


sig <- na.omit(  dplyr::lag(sig)  )
dC <- c(NA, diff(x))
bal <- cumsum(sig * tail(dC, length(sig) )   )

bal <- bal-comision
return(bal)}
 
elibrarius:

Думаю что количество сделок тут не нужно считать. А просто из каждой сделки вычесть спред с комиссией. Как то так:

Не так. Например

sig<- rep(c(1,1,1,1,1,-1,-1,-1,-1), 100)
length(sig)
[1] 900

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

cnt<-function(x){
    n <- 1:(length(x)-1)
    cnt <- 0
    for(i in n) {if(x[i]!=x[i+1]) {cnt<-cnt+1}}
    return(cnt)
}

Для вышеприведенного вектора сигналов

cnt(sig)
[1] 199
length(rle(c(sig))$values)
[1] 200

Непонятная разница.

А для расчета баланса функция

test_bal <- function(sig, CO){
    import::here(poorman, Lag = lag)
    import::here(.from = fTrading, maxDrawDown)
    sig %>%  Lag() %>% na.omit()->sig
    CO %>% tail(length(sig))-> CO
    bal <- cumsum(CO * sig)
    K <- (last(bal)/length(bal) * 10^Dig)%>% round()
    Kmax <- max(bal)/which.max(bal) * 10^Dig %>% round()
    dd <- maxDrawDown(bal)[[1]] %>% round()
    op <-cnt(sig)
    tst<-list(bal = bal, k = K, k.max = Kmax, op = op, dd = dd)
    return(tst)
}

Удачи

 
Vladimir Perervenko:

Я вот здесь не понял

c "rle"   можно посчитать количество смен сигналов, те кол. сделок

 sig <- c(1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1)
> sig
 [1] 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1
> rle(sig)
Run Length Encoding
  lengths: int [1:5] 5 4 3 4 3
  values : num [1:5] 1 0 1 0 1

видно по "values" что сигнал менялся  5 раз , значит 5 сделок было.

Vladimir Perervenko:

Непонятная разница.

думаю в моей реализации учитывается еще комиссия  как   бы "той первой сделки , открытия которой у нас нет, есть только закрытие"

 sig <- c(1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1)

 [1] 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1

типа вот за эту сделку , мой вариант берет комиссию

а ваш вариант начинает брать с этой, ваш вариант вернее, но это легко поправить , просто вычесть "1"

 sig <- c(1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1)
> sig
 [1] 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1
 
Vladimir Perervenko:

Пример скрипта в R  использующий ...

спасибо, буду вникать

 
mytarmailS:

c "rle"   можно посчитать количество смен сигналов, те кол. сделок

видно по "values" что сигнал менялся  5 раз , значит 5 сделок было.

думаю в моей реализации учитывается еще комиссия и как  " бы той первой сделки , открытия которой у нас нет, есть только закрытие"

типа вот за эту сделку , мой вариант берет комиссию

а ваш вариант начинает брать с этой, ваш вариант вернее, но это легко поправить, просто сделать , просто вычесть "1"

Да, Ваш вариант правильнее.

 
elibrarius:

Думаю что количество сделок тут не нужно считать. А просто из каждой сделки вычесть спред с комиссией. Как то так:

так там не получиться, нужно по любому считать

 
Vladimir Perervenko:

Да, Ваш вариант правильнее.

Да нет же) ваш правильнее!

ведь сделка которая была открыта "ранее"   (открытие не попало в наш вектор )

то значит что и комиссия была снята "ранее" ,а не в текущем векторе

но это все , несущественные мелочи..

 

для тех у кого есть 2 часа времени


 
mytarmailS:

для тех у кого есть 2 часа времени


О чем там?