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

 

상금 수령 조건을 명확히 하겠습니다.

문제를 먼저 해결한 사람에게 5학점이 주어집니다.

결정 심의 마감일: 2016년 6월 30일

 

거래 전략을 구현하기 위해 정보 기능을 선택하는 알고리즘을 사용하는 예가 있습니다.

Big Experiment에 대한 내 블로그를 읽었을 것입니다. https://www.mql5.com/en/blogs/post/661895

그리고 여기 사진이 있습니다:

5쌍에 대해 하나의 패턴을 찾고 25년 된 검증 샘플에서 올바르게 추측된 거래의 백분율을 감지하려고 했습니다. 그것은 박쥐에서 바로 작동하지 않았습니다. 주어진 기간에 대해 예측이 원하는 정확도를 달성하지 못했습니다.

다음으로, 한 쌍의 eurusd만 가져 가자. 나는 앞으로 3시간 동안의 가격 움직임의 결과가 내 예측 변수의 일부 하위 집합에 달려 있음을 발견했습니다.

예측 변수를 분류하고 중요한 예측 변수 찾기를 실행했습니다. 저는 지금 직장에서 20분 만에 해냈습니다.

[1] "1.51%"

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

> names(sampleA)[final_vector]

[1] "lag_diff_45_var"      "lag_diff_128_var"     "lag_max_diff_8_var"   "lag_max_diff_11_var"  "lag_max_diff_724_var" "lag_sd_362_var"      

[7] "output"   

그렇게 빨리 수렴을 이루지는 못했지만 설명력의 1.5% 수준에서 어느 정도 성과를 냈다.

수렴 플롯(최소화).

다음 단계는 모델을 구축하는 것입니다.

몇 가지 범주형 예측 변수가 있습니다. 우리는 "규칙 책" 또는 예측 변수와 출력 사이에 어떤 종류의 관계가 있는지 구축하고 있습니다. 3시간 관점에서 길거나 짧습니다.

결과적으로 어떻게 보이는지:

уровни предикторов
sell
buy
pval
concat
direction
121121
11
31
2.03E-03
121121
1
211112
3
15
4.68E-03
211112
1
222222
19
4
1.76E-03
222222
0
222311
8
0
4.68E-03
222311
0
321113
7
0
8.15E-03
321113
0
333332
53
19
6.15E-05
333332
0

50/50 분포를 준수하기 위해 이러한 수치에 해당하는 각 라인의 매수 및 매도 수의 왜곡과 카이-제곱 검정의 p-값을 봅니다. 확률이 0.01 미만인 행만 선택합니다.

그리고 입력이 이미 선택된 순간부터 전체 실험의 코드:

dat_test <- sampleA[, c("lag_diff_45_var"      

  , "lag_diff_128_var"     

  , "lag_max_diff_8_var"   

  , "lag_max_diff_11_var"  

  , "lag_max_diff_724_var" 

  , "lag_sd_362_var"

  , "output")]


dat_test$concat <- do.call(paste0, dat_test[1:(ncol(dat_test) - 1)])


x <- as.data.frame.matrix(table(dat_test$concat

   , dat_test$output))


x$pval <- NA

for (i in 1:nrow(x)){

x$pval[i] <- chisq.test(x = c(x$`0`[i], x$`1`[i])

, p = c(0.5, 0.5))$p.value

}


trained_model <- subset(x

  , x$pval < 0.01)


trained_model$concat <- rownames(trained_model)


trained_model$direction <- NA

trained_model$direction [trained_model$`1` > trained_model$`0`] <- 1

trained_model$direction [trained_model$`0` > trained_model$`1`] <- 0


### test model


load('C:/Users/aburnakov/Documents/Private/big_experiment/many_test_samples.R')


many_test_samples_eurusd_categorical <- list()


for (j in 1:49){


dat <- many_test_samples[[j]][, c(1:108, 122)]

disc_levels <- 3

for (i in 1:108){

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

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

}

dat$output <- NA

dat$output [dat$future_lag_181 > 0] <- 1

dat$output [dat$future_lag_181 < 0] <- 0

many_test_samples_eurusd_categorical[[j]] <- subset(dat

   , is.na(dat$output) == F)[, 110:218]

many_test_samples_eurusd_categorical[[j]] <- many_test_samples_eurusd_categorical[[j]][(nrow(dat) / 5):(2 * nrow(dat) / 5), ]


}



correct_validation_results <- data.frame()


for (i in 1:49){

dat_valid <- many_test_samples_eurusd_categorical[[i]][, c("lag_diff_45_var"      

   , "lag_diff_128_var"     

   , "lag_max_diff_8_var"   

   , "lag_max_diff_11_var"  

   , "lag_max_diff_724_var" 

   , "lag_sd_362_var"

   , "output")]

dat_valid$concat <- do.call(paste0, dat_valid[1:(ncol(dat_valid) - 1)])

y <- as.data.frame.matrix(table(dat_valid$concat

   , dat_valid$output))

y$concat <- rownames(y)


valid_result <- merge(x = y, y = trained_model[, 4:5], by.x = 'concat', by.y = 'concat')

correct_sell <- sum(subset(valid_result

 , valid_result$direction == 0)[, 2])

correct_buys <- sum(subset(valid_result

     , valid_result$direction == 1)[, 3])

correct_validation_results[i, 1] <- correct_sell

correct_validation_results[i, 2] <- correct_buys

correct_validation_results[i, 3] <- sum(correct_sell

    , correct_buys)

correct_validation_results[i, 4] <- sum(valid_result[, 2:3])

correct_validation_results[i, 5] <- correct_validation_results[i, 3] / correct_validation_results[i, 4]


}


hist(correct_validation_results$V5, breaks = 10)


plot(correct_validation_results$V5, type = 's')

sum(correct_validation_results$V3) / sum(correct_validation_results$V4)

또한 각각 약 5년에 해당하는 49개의 검증 샘플이 있습니다. 여기에서 모델을 검증하고 올바르게 추측된 거래 방향의 백분율을 계산합니다.

샘플로 정확하게 추측된 거래의 비율과 이 값의 히스토그램을 살펴보겠습니다.

그리고 우리는 거래의 방향을 추측하는 모든 샘플에서 총 몇 개를 계산합니다.

> sum(correct_validation_results$`total correct deals`) / sum(correct_validation_results$`total deals`)

[1] 0.5361318

약 54%. 그러나 Ask & Bid 사이의 거리를 극복해야한다는 사실을 고려하지 않고. 즉, 위 차트에 따른 임계값은 스프레드 = 1pip인 경우 대략 53% 수준입니다.

즉, 예를 들어 터미널에서 하드코딩하기 쉬운 간단한 모델을 30분 만에 만들었습니다. 그리고 위원회도 아닙니다. 그리고 20시간이 아닌 20분 동안 종속성을 찾고 있었습니다. 일반적으로 무언가가 있습니다.

유익한 기능을 올바르게 선택했기 때문입니다.

유효한 각각에 대한 자세한 통계. 견본.

sample
correct sell correct buy total correct deals total deals share correct
1 37 10 47 85 0.5529412
2 26 7 33 65 0.5076923
3 30 9 39 80 0.4875
4 36 11 47 88 0.5340909
5 33 12 45 90 0.5
6 28 10 38 78 0.4871795
7 30 9 39 75 0.52
8 34 8 42 81 0.5185185
9 24 11 35 67 0.5223881
10 23 14 37 74 0.5
11 28 13 41 88 0.4659091
12 31 13 44 82 0.5365854
13 33 9 42 80 0.525
14 23 7 30 63 0.4761905
15 28 12 40 78 0.5128205
16 23 16 39 72 0.5416667
17 30 13 43 74 0.5810811
18 38 8 46 82 0.5609756
19 26 8 34 72 0.4722222
20 35 12 47 79 0.5949367
21 32 11 43 76 0.5657895
22 30 10 40 75 0.5333333
23 28 8 36 70 0.5142857
24 21 8 29 70 0.4142857
25 24 8 32 62 0.516129
26 34 15 49 83 0.5903614
27 24 9 33 63 0.5238095
28 26 14 40 66 0.6060606
29 35 6 41 84 0.4880952
30 28 8 36 74 0.4864865
31 26 14 40 79 0.5063291
32 31 15 46 88 0.5227273
33 35 14 49 93 0.5268817
34 35 19 54 85 0.6352941
35 27 8 35 64 0.546875
36 30 10 40 83 0.4819277
37 36 9 45 79 0.5696203
38 25 8 33 73 0.4520548
39 39 12 51 85 0.6
40 37 9 46 79 0.5822785
41 41 12 53 90 0.5888889
42 29 7 36 59 0.6101695
43 36 14 50 77 0.6493506
44 36 15 51 88 0.5795455
45 34 7 41 67 0.6119403
46 28 12 40 75 0.5333333
47 27 11 38 69 0.5507246
48 28 16 44 83 0.5301205
49 29 10 39 72 0.5416667
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: доказательство значимости предсказаний
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: доказательство значимости предсказаний
  • 2016.03.02
  • Alexey Burnakov
  • www.mql5.com
Начало по ссылкам: https://www.mql5.com/ru/blogs/post/659572 https://www.mql5.com/ru/blogs/post/659929 https://www.mql5.com/ru/blogs/post/660386 https://www.mql5.com/ru/blogs/post/661062
 

모든 소스 데이터는 블로그의 링크를 통해 사용할 수 있습니다.

그리고 이 모델은 수익성이 거의 없습니다. 반점 수준의 MO. 하지만 나는 그 방향을 고수하고 있다.

 
산산이치 포멘코 :

우리는 항상 과거로부터 배웁니다.

우리는 수세기 동안 그래프를 봅니다. 둘 다 켜져 있고 "병사 3명"이 표시된 다음 "머리와 어깨"가 표시됩니다. 그러한 수치가 이미 얼마나 많이 보았고 우리는 이 수치를 믿고 거래합니다...

작업이 다음과 같이 설정된 경우:

1. 이러한 수치를 자동으로 찾습니다. 일반적으로 모든 차트가 아니라 특정 통화 쌍에 대해 쌀을 거래할 때 일본인이 최근에(300년 전 아님) 마주한 수치를 찾습니다.

2. 초기 데이터가 우리에게 적합한가요? 그런 수치를 자동으로 찾는 패턴 - 패턴입니다.

첫 번째 질문에 답하기 위해 "랜덤 포레스트"라는 알고리즘을 고려하십시오. 알고리즘은 사람이 작업의 초기 데이터로 생각한 모든 것, 하나 또는 여러 통화, 지표, 가격 증분의 견적을 취합니다. 10-5-100-200 ... 입력 변수. 그런 다음 하나의 막대에 해당하는 한 순간과 관련된 변수의 전체 값 세트를 취하여 과거 데이터에 대해 잘 정의된 결과에 해당하는 이러한 입력 변수의 조합을 찾습니다. 예를 들면, 구매 주문. 그리고 다른 주문에 대한 또 다른 조합 세트 - SELL. 이러한 각 집합은 별도의 트리에 해당합니다. 경험에 따르면 18,000바(약 3년)의 입력 클록 세트에 대해 알고리즘은 200-300개의 트리를 찾습니다. 이것은 "머리와 어깨"와 거의 유사한 패턴 세트 및 전체 군인 회사입니다.

이 알고리즘의 문제는 그러한 트리가 미래에 발생하지 않을 일부 세부 사항을 캡처할 수 있다는 것입니다. 이것은 기계 학습 "과적합"에서 포럼 "과적합"에서 호출됩니다. 초기 변수의 전체 큰 집합은 출력 변수와 관련된 부분과 잡음과 관련되지 않은 부분의 두 부분으로 나눌 수 있는 것으로 알려져 있습니다. 여기에서 Burnakov는 결과와 관련이 없는 것들을 제거하려고 노력하고 있습니다.

추신.

트렌딩 TS(BUY, SELL)를 구축할 때 모든 종류의 자동차는 소음입니다!

당신이 보는 것은 시장의 작은 부분이며 가장 중요한 것이 아닙니다. 피라미드를 거꾸로 세우는 사람은 없습니다.
 
예를란 이만겔디노프
당신이 보는 것은 시장의 작은 부분이며 가장 중요한 것이 아닙니다. 피라미드를 거꾸로 세우는 사람은 없습니다.
더 구체적으로, 내가 보지 못하는 것은 무엇입니까?
 
예를란 이만겔디노프
당신이 보는 것은 시장의 작은 부분이며 가장 중요한 것이 아닙니다. 피라미드를 거꾸로 세우는 사람은 없습니다.
가격 내역 외에 시스템에 정보를 추가할 수 있습니다. 그러나 여전히 역사에 대해 가르쳐야 합니다. 아니면 추이카.
 

입력 데이터로 뉴런을 훈련시킨 다음 가중치를 살펴보았습니다. 입력 데이터의 가중치가 작은 경우 필요하지 않을 수 있습니다. SanSanych의 기사 https://www.mql5.com/ru/articles/1165 덕분에 R(Rattle)을 사용하여 이 작업을 수행했습니다.

입력 입력_1 입력_2 입력_3 입력_4 입력_5 입력_6 입력_7 입력_8 입력_9 입력_10 입력_11 입력_12 입력_13 입력_14 입력_15 입력_16 입력_17 입력_18 입력_19 입력_20
무게 -186.905 7.954625 -185.245 14.88457 -206.037 16.03497 190.0939 23.05248 -182.923 4.268967 196.8927 16.43655 5.419367 8.76542 36.8237 5.940322 8.304859 8.176511 17.13691 -0.57317
부분집합

실제로이 접근 방식을 확인하지 않았고 흥미롭지 않은 것으로 나타났습니다. 나는 input_1 input_3 input_5 input_7 input_9 input_11을 취할 것입니다

Случайные леса предсказывают тренды
Случайные леса предсказывают тренды
  • 2014.09.29
  • СанСаныч Фоменко
  • www.mql5.com
В статье описано использование пакета Rattle для автоматического поиска паттернов, способных предсказывать "лонги" и "шорты" для валютных пар рынка Форекс. Статья будет полезна как новичкам, так и опытным трейдерам.
 
Dr.Trader :

입력 데이터로 뉴런을 훈련시킨 다음 가중치를 살펴보았습니다. 입력 데이터의 가중치가 작은 경우 필요하지 않을 수 있습니다. SanSanych의 기사 https://www.mql5.com/en/articles/1165 덕분에 R(Rattle)을 사용하여 이 작업을 수행했습니다.

입력 입력_1 입력_2 입력_3 입력_4 입력_5 입력_6 입력_7 입력_8 입력_9 입력_10 입력_11 입력_12 입력_13 입력_14 입력_15 입력_16 입력_17 입력_18 입력_19 입력_20
무게 -186.905 7.954625 -185.245 14.88457 -206.037 16.03497 190.0939 23.05248 -182.923 4.268967 196.8927 16.43655 5.419367 8.76542 36.8237 5.940322 8.304859 8.176511 17.13691 -0.57317
부분집합

실제로이 접근 방식을 확인하지 않았고 흥미롭지 않은 것으로 나타났습니다. 나는 input_1 input_3 input_5 input_7 input_9 input_11을 취할 것입니다

) 흠. 매우 흥미로운 것으로 밝혀졌습니다.

해명 질문. 그리고 13, 14, 16과 같이 가중치가 작은 입력을 더 켜보는 것은 어떻습니까? 가중치에 따라 정렬된 입력 및 가중치의 다이어그램을 보여줄 수 있습니까?

죄송합니다. 처음에는 이해하지 못했습니다. 예, 이러한 입력은 당연히 그래야 하는 큰 모듈로 가중치를 갖습니다.

 

시각적으로 모든 가중치는 두 그룹으로 나뉩니다. 중요/중요의 원칙에 따라 구분해야 한다면 5,11,7,1,3,9가 명확하게 구분되는데 이 세트로 충분하다고 생각합니다.