트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩 - 페이지 21

 
트레이더 박사 :

나는 Y 스케일도 시도했는데 두 경우 모두(Y 스케일이 있거나 없는) R^2가 동일하게 나왔습니다(이 경우 다른 패키지가 사용된다는 사실에도 불구하고!).

나는 Y-척도가 더 적은 수의 주성분으로 동일한 좋은 결과를 줄 수 있다는 것을 이해합니다. 그러나 모든 구성 요소를 사용해도 결과가 여전히 만족스럽지 않다면(지금처럼) 차이가 없습니다. 또한 더 빠르게 작동하므로 지금은 더 중요합니다. 사실, 이 방법이 일반적으로 예측 변수를 선택하는 데 적합한지 여부를 이론이나 실습으로 아직 증명하지 못했습니다... 처음에는 모든 예측 변수에 대해 주성분 모델을 만들고 다음의 계수를 보고 예측 변수를 선택하는 아이디어가 있었습니다. 구성 요소. 그러나 쓰레기가 추가되면 R ^ 2 모델이 떨어지는 것을 알았습니다. 다른 예측 변수 세트를 시도하고 더 높은 R^2를 가진 예측 변수를 찾는 것이 논리적이지만 여전히 이론일 뿐입니다.

여기에서 나는 정기적으로 다음과 같은 제안을 합니다. 당신이 저에게 당신의 세트를 보내면, 우리는 당신의 결과와 나의 결과를 비교할 것입니다.

저에게 이상적인 것은 .RData입니다. 목표가 이진이고 예측자가 바람직하게는 실수인 프레임입니다.

 
트레이더 박사 :

이전에 포리스트를 훈련했으며 유효성 검사 세트에서 오류를 반환했습니다. 원칙적으로는 효과가 있었습니다. 숲이 최소한 약간 재교육되면 오류는 즉시 50%가 되는 경향이 있습니다.

이제 위의 코드인 GetPCrsquared()를 사용하고 있습니다. feature_selector_modeller.txt의 예제도 있지만, 이를 파악하고 올바른 코드를 가져와야 하므로 아직 내 데이터에서 테스트하지 않았습니다.

당신은 이것을 가지고 갈 필요가 있습니다:

library(infotheo) # measured in nats, converted to bits

library(scales)

library(GenSA)


#get data

sampleA <- read.table('C:/Users/aburnakov/Documents/Private/dummy_set_features.csv'

, sep= ','

, header = T)




#calculate parameters

predictor_number <- dim(sampleA)[2] - 1

sample_size <- dim(sampleA)[1]

par_v <- runif(predictor_number, min = 0, max = 1)

par_low <- rep(0, times = predictor_number)

par_upp <- rep(1, times = predictor_number)



#load functions to memory

shuffle_f_inp <- function(x = data.frame(), iterations_inp, quantile_val_inp){

mutins <- c(1:iterations_inp)

for (count in 1:iterations_inp){

xx <- data.frame(1:dim(x)[1])

for (count1 in 1:(dim(x)[2] - 1)){

y <- as.data.frame(x[, count1])

y$count <- sample(1 : dim(x)[1], dim(x)[1], replace = F)

y <- y[order(y$count), ]

xx <- cbind(xx, y[, 1])

}

mutins[count] <- multiinformation(xx[, 2:dim(xx)[2]])

}

quantile(mutins, probs = quantile_val_inp)

}



shuffle_f <- function(x = data.frame(), iterations, quantile_val){

height <- dim(x)[1]

mutins <- c(1:iterations)

for (count in 1:iterations){

x$count <- sample(1 : height, height, replace = F)

y <- as.data.frame(c(x[dim(x)[2] - 1], x[dim(x)[2]]))

y <- y[order(y$count), ]

x[dim(x)[2]] <- NULL

x[dim(x)[2]] <- NULL

x$dep <- y[, 1]

rm(y)

receiver_entropy <- entropy(x[, dim(x)[2]])

received_inf <- mutinformation(x[, 1 : dim(x)[2] - 1], x[, dim(x)[2]])

corr_ff <- received_inf / receiver_entropy

mutins[count] <- corr_ff

}

quantile(mutins, probs = quantile_val)

}


############### the fitness function

fitness_f <- function(par){

indexes <- c(1:predictor_number)

for (i in 1:predictor_number){

if (par[i] >= threshold) {

indexes[i] <- i

} else {

indexes[i] <- 0

}

}

local_predictor_number <- 0

for (i in 1:predictor_number){

if (indexes[i] > 0) {

local_predictor_number <- local_predictor_number + 1

}

}

if (local_predictor_number > 1) {

sampleAf <- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])])

pred_entrs <- c(1:local_predictor_number)

for (count in 1:local_predictor_number){

pred_entrs[count] <- entropy(sampleAf[count])

}

max_pred_ent <- sum(pred_entrs) - max(pred_entrs)

pred_multiinf <- multiinformation(sampleAf[, 1:dim(sampleAf)[2] - 1])

pred_multiinf <- pred_multiinf - shuffle_f_inp(sampleAf, iterations_inp, quantile_val_inp)

if (pred_multiinf < 0){

pred_multiinf <- 0

}

pred_mult_perc <- pred_multiinf / max_pred_ent

inf_corr_val <- shuffle_f(sampleAf, iterations, quantile_val)

receiver_entropy <- entropy(sampleAf[, dim(sampleAf)[2]])

received_inf <- mutinformation(sampleAf[, 1:local_predictor_number], sampleAf[, dim(sampleAf)[2]])

if (inf_corr_val - (received_inf / receiver_entropy) < 0){

fact_ff <- (inf_corr_val - (received_inf / receiver_entropy)) * (1 - pred_mult_perc)

} else {

fact_ff <- inf_corr_val - (received_inf / receiver_entropy)

}

} else if (local_predictor_number == 1) {

sampleAf<- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])])

inf_corr_val <- shuffle_f(sampleAf, iterations, quantile_val)

receiver_entropy <- entropy(sampleAf[, dim(sampleAf)[2]])

received_inf <- mutinformation(sampleAf[, 1:local_predictor_number], sampleAf[, dim(sampleAf)[2]])

fact_ff <- inf_corr_val - (received_inf / receiver_entropy)

} else  {

fact_ff <- 0

}

return(fact_ff)

}



########## estimating threshold for variable inclusion


iterations = 5

quantile_val = 1


iterations_inp = 1

quantile_val_inp = 1


levels_arr <- numeric()

for (i in 1:predictor_number){

levels_arr[i] <- length(unique(sampleA[, i]))

}


mean_levels <- mean(levels_arr)

optim_var_num <- log(x = sample_size / 100, base = round(mean_levels, 0))


if (optim_var_num / predictor_number < 1){

threshold <- 1 - optim_var_num / predictor_number

} else {

threshold <- 0.5

}



#run feature selection


start <- Sys.time()


sao <- GenSA(par = par_v, fn = fitness_f, lower = par_low, upper = par_upp

     , control = list(

      #maxit = 10

        max.time = 1200

        , smooth = F

        , simple.function = F))


trace_ff <- data.frame(sao$trace)$function.value

plot(trace_ff, type = "l")

percent(- sao$value)

final_vector <- c((sao$par >= threshold), T)

names(sampleA)[final_vector]

final_sample <- as.data.frame(sampleA[, final_vector])


Sys.time() - start

데이터 프레임에서 가장 오른쪽 열은 대상 열입니다.

모든 열은 범주(정수, 문자 또는 요소)여야 합니다.

그리고 모든 성경을 다운로드해야 합니다.

숫자를 범주형 변수로 변환하는 방법을 보여주는 코드:

disc_levels <- 3 # сколько равночастотных уровней переменной создается


for (i in 1:56){

naming <- paste(names(dat[i]), 'var', sep = "_")

dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1]

}

 

인터넷에서 그런 재미있는 기능을 찾았습니다

data_driven_time_warp <- function (y) {
  cbind(
    x = cumsum(c( 0 , abs(diff(y)))),
    y = y
  )
}


y <- cumsum(rnorm( 200 ))+ 1000
i <- seq( 1 ,length(y),by= 10 )
op <- par(mfrow=c( 2 , 1 ), mar=c(. 1 ,. 1 ,. 1 ,. 1 ))
plot(y, type= "l" , axes = FALSE )
abline(v=i, col= "grey" )
lines(y, lwd= 3 )
box()
d <- data_driven_time_warp(y)
plot(d, type= "l" , axes= FALSE )
abline(v=d[i, 1 ], col= "grey" )
lines(d, lwd= 3 )
box()
par(op)

이 형식에서 알고리즘이 데이터를 더 잘 인식할 수 있습니까? 그러나 한 가지 오해가 있습니다. 함수의 출력은 변수 "d"이고 두 개의 열 "x"와 "y"가 있는 행렬입니다. 하나는 가격을 나타내고, 두 번째는 알고리즘에 의해 곡선입니다. 문제는 어떻게 이 행렬을 벡터로 변환하여 속성을 잃지 않도록 합니다.

 
산산이치 포멘코 :

여기에서 저는 정기적으로 다음과 같은 제안을 합니다. 귀하의 세트를 저에게 보내주시면 귀하의 결과와 제 결과를 비교할 것입니다.

저에게 이상적인 것은 .RData입니다. 목표가 이진이고 예측자가 바람직하게는 실수인 프레임입니다.

첨부된 것은 최고의 예측 변수 세트입니다. trainData - 2015년 eurusd용 D1, fronttestData - 2016년 1월 1일부터 6월까지. 전면 테스트는 길고 실제 거래에서는 같은 설정으로 한 달 이상 거래할 가능성이 거의 없습니다. 모델의 수익성이 실제로 얼마나 오래 지속되는지 확인하고 싶었습니다. fronttestData1, fronttestData2, fronttestData3은 1월에만, 2월에만, 3월에만 fronttestData에서 분리된 클리핑입니다. 저는 fronttestData1의 오류를 줄이는 데만 관심이 있고 나머지는 연구용입니다. 예측 변수 세트에는 주로 지표와 지표 사이의 다양한 계산이 포함됩니다. nnet을 사용하면 fronttestData1에 30% 오류가 있습니다. 반복 제어로 훈련하고 내부 뉴런 수를 선택합니다. 여기에서 30%는 단지 우연의 문제라고 생각합니다. 이 모델은 2015년 3월부터 2016년 2월까지 시장에서 어떤 추세를 포착했습니다. 그러나 다른 기간이 병합되지 않는다는 사실은 이미 좋습니다.

mt5 테스터 2014.01-2016.06에서 찍은 사진인데, 훈련기간을 액자로 표시해 두었습니다. 이미 이전보다 더 좋습니다 :). 지금까지는 이것이 내 한계입니다. 지표에 대한 많은 문제를 해결해야 합니다. 즉, 기본 매개변수가 시간 프레임에 엄격하게 연결된 것처럼 보인다는 사실입니다. 예를 들어 H1에서 제 경험은 완전히 쓸모가 없으며 동일한 지표 선택 알고리즘입니다. H1에서는 모든 것을 쓰레기로 간주합니다. 초기 표시기 세트에 다른 매개변수를 사용하여 변형을 추가하거나 ohlc에서 임의의 표시기를 직접 생성해야 합니다.

파일:
 
알렉세이 버나코프 :

당신은 이것을 가지고 갈 필요가 있습니다:

더 명확합니다. 감사합니다. 지표당 3개의 카테고리만 작동하지 않는 것 같습니다. 논리적으로, 나는 적어도 100개의 레벨을 만들 것입니다. 그러나 그것이 더 나을 것입니까, 아니면 이것이 알고리즘의 전체 의미를 잃는 것입니까?

 
Dr.Trader :

더 명확합니다. 감사합니다. 지표당 3개의 카테고리만 작동하지 않는 것 같습니다. 논리적으로, 나는 적어도 100개의 레벨을 만들 것입니다. 그러나 그것이 더 나을 것입니까, 아니면 이것이 알고리즘의 전체 의미를 잃는 것입니까?

그러면 의미를 잃게 됩니다. 알고리즘 은 입력 변수의 총 수준 수 와 응답 수준이 이러한 수준에 어떻게 분포되는지를 고려합니다. 따라서 각 입력 수준에서 응답 값의 수가 매우 적으면 확률 스큐의 통계적 유의성을 평가하는 것이 불가능합니다.

100레벨을 하면 변수가 많이 생깁니다. 그런 다음 알고리즘은 제한된 샘플 크기를 감안할 때 매우 합리적인 모든 하위 집합의 중요도가 0인 값을 반환합니다.

좋은 예입니다.

입구 수준 | 관찰 횟수

1 150

2 120

...

9 90

여기에서 응답 내부의 중요성을 평가할 수 있습니다.

예가 나쁘다.

입구 수준

112 5

...

357 2

...

1045 1

여기서 응답 내부의 중요성을 평가하는 것은 불가능합니다.

 
Dr.Trader :

첨부된 것은 최고의 예측 변수 세트입니다. trainData - 2015년 eurusd용 D1, fronttestData - 2016년 1월 1일부터 6월까지. 전면 테스트는 길고 실제 거래에서는 같은 설정으로 한 달 이상 거래할 가능성이 거의 없습니다. 모델의 수익성이 실제로 얼마나 오래 지속되는지 확인하고 싶었습니다. fronttestData1, fronttestData2, fronttestData3은 1월에만, 2월에만, 3월에만 fronttestData에서 분리된 클리핑입니다. 저는 fronttestData1의 오류를 줄이는 데만 관심이 있고 나머지는 연구용입니다. 예측 변수 세트에는 주로 지표와 지표 사이의 다양한 계산이 포함됩니다. nnet을 사용하면 fronttestData1에 30% 오류가 있습니다. 반복 제어로 훈련하고 내부 뉴런 수를 선택합니다. 여기에서 30%는 단지 우연의 문제라고 생각합니다. 이 모델은 2015년 3월부터 2016년 2월까지 시장에서 어떤 추세를 포착했습니다. 그러나 다른 기간이 병합되지 않는다는 사실은 이미 좋습니다.

mt5 테스터 2014.01-2016.06에서 찍은 사진인데, 프레임으로 훈련기간을 표시해 두었습니다. 이미 이전보다 더 좋습니다 :). 지금까지는 이것이 내 한계입니다. 지표에 대한 많은 문제를 해결해야 합니다. 즉, 기본 매개변수가 시간 프레임에 엄격하게 연결된 것처럼 보인다는 사실입니다. 예를 들어 H1에서 제 경험은 완전히 쓸모가 없으며 동일한 지표 선택 알고리즘입니다. H1에서는 모든 것을 쓰레기로 간주합니다. 초기 표시기 세트에 다른 매개변수를 사용하여 변형을 추가하거나 ohlc에서 임의의 표시기를 직접 생성해야 합니다.

나쁘지는 않지만 표본 외 기간 자체가 짧습니다.

얼마나 많은 트랜잭션이 샘플을 벗어나는지 아직 명확하지 않습니다. 수십, 수백, 어떤 순서가 있습니까?

 
Dr.Trader :

첨부된 것은 최고의 예측 변수 세트입니다. trainData - 2015년 eurusd용 D1, fronttestData - 2016년 1월 1일부터 6월까지. 전면 테스트는 길고 실제 거래에서는 같은 설정으로 한 달 이상 거래할 가능성이 거의 없습니다. 모델의 수익성이 실제로 얼마나 오래 지속되는지 확인하고 싶었습니다. fronttestData1, fronttestData2, fronttestData3은 1월에만, 2월에만, 3월에만 fronttestData에서 분리된 클리핑입니다. 저는 fronttestData1의 오류를 줄이는 데만 관심이 있고 나머지는 연구용입니다. 예측 변수 세트에는 주로 지표와 지표 사이의 다양한 계산이 포함됩니다. nnet을 사용하면 fronttestData1에 30% 오류가 있습니다. 반복 제어로 훈련하고 내부 뉴런 수를 선택합니다. 여기에서 30%는 단지 우연의 문제라고 생각합니다. 이 모델은 2015년 3월부터 2016년 2월까지 시장에서 어떤 추세를 포착했습니다. 그러나 다른 기간이 병합되지 않는다는 사실은 이미 좋습니다.

mt5 테스터 2014.01-2016.06에서 찍은 사진인데, 프레임으로 훈련기간을 표시해 두었습니다. 이미 이전보다 더 좋습니다 :). 지금까지는 이것이 내 한계입니다. 지표에 대한 많은 문제를 해결해야 합니다. 즉, 기본 매개변수가 시간 프레임에 엄격하게 연결된 것처럼 보인다는 사실입니다. 예를 들어 H1에서 제 경험은 완전히 쓸모가 없으며 동일한 지표 선택 알고리즘입니다. H1에서는 모든 것을 쓰레기로 간주합니다. 초기 표시기 세트에 다른 매개변수를 사용하여 변형을 추가하거나 ohlc에서 임의의 표시기를 직접 생성해야 합니다.

보았다.

전체 데이터 세트에 107개의 행(107개의 관찰)이 있다는 것을 올바르게 이해했습니까?

 
산산이치 포멘코 :

보았다.

전체 데이터 세트에 107개의 행(107개의 관찰)이 있다는 것을 올바르게 이해했습니까?

아니요, 훈련 세트에 250개 행이 있습니다(2015년 거래일 수). 나는 trainData 테이블에서 모델을 훈련했습니다. 테스트됨 - fronttestData1에서. 추가 확인을 위한 다른 모든 항목은 무시할 수 있습니다.

trainData - 2015년 전체.
fronttestData1 - 2016년 1월
fronttestData2 - 2016년 2월
fronttestData3 - 2016년 3월
fronttestData - 2016년 1월 - 2016년 6월

 
트레이더 박사 :

아니요, 훈련 세트에 250개 행이 있습니다(2015년 거래일 수). 나는 trainData 테이블에서 모델을 훈련했습니다. 테스트됨 - fronttestData1에서. 추가 확인을 위한 다른 모든 항목은 무시할 수 있습니다.

trainData - 2015년 전체.
fronttestData1 - 2016년 1월
fronttestData2 - 2016년 2월
fronttestData3 - 2016년 3월
fronttestData - 2016년 1월 - 2016년 6월

저에게 이것은 매우 적습니다. 저는 통계를 사용합니다. 현재 창의 경우에도 107줄은 저에게 매우 작습니다. 현재 창에 400개 이상을 사용하고 있습니다.

일반적으로 세트에서 관측치의 수는 예측 변수의 수와 비슷합니다. 이들은 매우 구체적인 세트입니다. 어쩐지 그런 세트에는 특별한 방법이 필요하다는 것을 알았습니다. 나는 그런 문제가 없기 때문에 링크가 없습니다.

불행히도 내 방법은 귀하의 데이터에 적합하지 않습니다.

사유: