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

 
산산이치 포멘코 :

나는 국회가 아무 것도 하지 않았다는 어떤 증거도 보지 못했다.

과적합은 과학, 특히 모델 구축에서 세계적인 악입니다.

따라서 세 가지 세트에 대해 오류가 필요합니다.

  • 훈련 세트. 딸랑이가 이해하는 방식(OOB, 테스트, 유효성 검사)이 매우 적합합니다.
  • 날짜 측면에서 훈련 세트 외부에 있는 세트.
  • 날짜 측면에서 훈련 세트 외부에 있는 다른 세트.

마지막 두 세트는 터미널에 들어왔기 때문에 혼합 없이 막대 단위로 제공됩니다.

세 세트 모두 거의 동일한 오류가 있어야 합니다. 이 경우 모델을 훈련할 때 사용하는 예측 변수 집합을 수정해야 합니다.

처음에는이 작업에서 재교육을 고려하지 않았으므로 필요하지 않았습니다. 첫 번째 뉴런은 내부 레이어에 단 하나의 뉴런만 있었습니다. 방금 확인해보니 장기 훈련시 오차가 45% 정도인데 그 이하로 떨어지지 않습니다. 훈련하는 동안 네트워크는 이러한 입력에 1,3,5,7,9,11 더 높은 가중치를 부여하지만 뉴런이 부족하여 실제로 다시 학습할 수 없습니다. 이것은 매우 제한된 조건에서 가장 정확한 결과를 짜내고 어떤 입력에 더 많은 가중치를 줄 것인지 확인하는 아이디어였습니다.

이제 유효성 검사 파일이 있으면 이미 더 진지하게 작업할 수 있습니다. 이제 소스 파일을 두 부분(85% 및 15%)으로 나누고 첫 번째 부분에서 훈련하고 때로는 훈련을 중단하고 두 부분에서 오류를 측정했습니다. 파일의 15%에 해당하는 예제는 훈련에 포함되지 않았지만 그 오류는 훈련 부분과 거의 동일하게 감소했습니다. 파일의 두 부분에서 모두 0%가 되었을 때 훈련을 중단하고 두 번째 파일에서 뉴런을 확인했는데 오류는 ~0%였습니다. 이 작업의 경우 재교육이 효과가 없었습니다. 재미있습니다.


그러나 Forex의 뉴런은 이 작업보다 더 나쁩니다. 첫째, 오류는 훈련과 검증 모두에서 두 샘플 모두에 해당합니다. 그런 다음 오류는 훈련 세트에서 계속 떨어지지만 테스트 세트에서는 증가하기 시작하며 이 지점에서 훈련을 중지해야 합니다. 그런 다음 나는 보통 선택 전의 이력에서 결과를 확인하고 선택 후의 이력에서 다시 확인합니다. 나에게 이것은 당신과 같은 세 가지 데이터 세트입니다. 그러나 세 세트 모두의 오류는 여전히 나에게 다릅니다(그리고 훈련 기간 외에는 큽니다).

결과를 매끄럽게 하거나 필터를 추가(<0.1 - 매도, >0.9 - 매수 및 그 사이의 모든 것 - 거래가 없는 기간)와 같이 결과를 개선하는 방법에 대한 다양한 아이디어가 있었습니다. 뉴런의 결과에 필터를 추가하고 최적화도 하면 거래 결과를 아주 잘 향상시킬 수 있지만 전면 테스트에서는 전혀 도움이 되지 않았습니다. 또한 뉴런이 특정 기간의 히스토리에 대해 훈련된 경우 이 기간 이전의 히스토리에 대한 필터를 최적화할 수 있다는 좋은 아이디어도 있었습니다. 최적화 기간 이전의 오류는 최적화 기간 이후의 오류와 관련이 있을 수 있습니다. 그러나 작동하지 않았습니다. "뉴런을 배우기 전" - "뉴런을 배우기" - "뉴런을 배운 후"의 세 가지 역사 기간이 있는 경우 세 기간 모두 연결되지 않은 자체 최적의 필터를 갖게 됩니다. 방법.

현재로서는 모델이 훈련 및 테스트 샘플에서 작은 오류(<10%)를 가져야 한다고 스스로 결론을 내렸습니다. 모델의 결과에 대한 필터는 적용되지 않으며 "4주마다 결과를 반전시킨다"와 같은 운세도 없습니다. M15보다 작은 주기로 내려가지 마십시오. 나는 다른 새로운 아이디어를 시도합니다. 적어도 10개 중 1개가 결과를 개선하면 좋습니다. 그리고 어떻게든 수익성 있는 모델로 밝혀져야 합니다.

 
트레이더 박사 :

처음에는이 작업에서 재교육을 고려하지 않았으므로 필요하지 않았습니다. 첫 번째 뉴런은 내부 레이어에 단 하나의 뉴런만 있었습니다. 방금 확인해보니 장기 훈련시 오차가 45% 정도인데 그 이하로 떨어지지 않습니다. 훈련하는 동안 네트워크는 이러한 입력에 1,3,5,7,9,11 더 높은 가중치를 부여하지만 뉴런이 부족하여 실제로 다시 학습할 수 없습니다. 이것은 매우 제한된 조건에서 가장 정확한 결과를 짜내고 어떤 입력에 더 많은 가중치를 줄 것인지 확인하는 아이디어였습니다.

이제 유효성 검사 파일이 있으면 더 진지하게 작업할 수 있습니다. 이제 소스 파일을 두 부분(85% 및 15%)으로 나누고 첫 번째 부분에서 훈련하고 때로는 훈련을 중단하고 두 부분에서 오류를 측정했습니다. 파일의 15%에 해당하는 예제는 훈련에 포함되지 않았지만 그 오류는 훈련 부분과 거의 동일하게 감소했습니다. 파일의 두 부분에서 모두 0%가 되었을 때 훈련을 중단하고 두 번째 파일에서 뉴런을 확인했는데 오류는 ~0%였습니다. 이 작업의 경우 재교육이 제대로 작동하지 않은 것으로 나타났습니다.


그러나 Forex의 뉴런은 이 작업보다 더 나쁩니다. 첫째, 오류는 훈련과 검증 모두에서 두 샘플 모두에 해당합니다. 그런 다음 오류는 훈련 세트에서 계속 떨어지지만 테스트 세트에서는 증가하기 시작하며 이 지점에서 훈련을 중지해야 합니다. 그런 다음 일반적으로 선택 전의 이력에서 결과를 확인하고 선택 후의 이력에서 다시 확인합니다. 나에게 이것은 당신과 같은 세 가지 데이터 세트입니다. 그러나 세 세트 모두의 오류는 여전히 나에게 다릅니다(그리고 훈련 기간 외에는 큽니다).

결과를 매끄럽게 하거나 필터를 추가(<0.1 - 매도, >0.9 - 매수 및 그 사이의 모든 것 - 거래가 없는 기간)와 같이 결과를 개선하는 방법에 대한 다양한 아이디어가 있었습니다. 뉴런의 결과에 필터를 추가하고 최적화도 하면 거래 결과를 아주 잘 향상시킬 수 있지만 전면 테스트에서는 전혀 도움이 되지 않았습니다. 또한 뉴런이 특정 기간의 히스토리에 대해 훈련된 경우 이 기간 이전의 히스토리에 대한 필터를 최적화할 수 있다는 좋은 아이디어도 있었습니다. 최적화 기간 이전의 오류는 최적화 기간 이후의 오류와 관련이 있을 수 있습니다. 그러나 작동하지 않았습니다. "뉴런을 배우기 전" - "뉴런을 배우기" - "뉴런을 배운 후"의 세 가지 역사 기간이 있는 경우 세 기간 모두 연결되지 않은 자체 최적의 필터를 갖게 됩니다. 방법.

현재로서는 모델이 훈련 및 테스트 샘플에서 작은 오류(<10%)를 가져야 한다고 스스로 결론을 내렸습니다. 모델의 결과에 대한 필터는 적용되지 않으며 "4주마다 결과를 반전시킨다"와 같은 운세도 없습니다. M15보다 작은 주기로 하강하지 마십시오. 나는 다른 새로운 아이디어를 시도합니다. 적어도 10개 중 1개가 결과를 개선하면 좋습니다. 그리고 어떻게든 수익성 있는 모델로 밝혀져야 합니다.

모든 것이 데이터에 관한 것입니다

모든 세트의 데이터는 상호 독립적인 관측치를 포함해야 합니다. 그러나 이 경우에도 유효성 검사는 더 나쁜 결과를 제공합니다.
 

Rattle에서 다른 모델을 시도했는데, 숲(forest)도 좋은 결과를 주었습니다.

1단계 - 숲은 무언가를 배웠고 통계에서 입력 1,3,5,7,9,11은 어떻게든 격리된 것처럼 보입니다. 교육 파일의 오류 0%, 검증 파일의 오류 - 46%

2단계 - 입력 1,3,5,7,9,11과 결과만 파일에 남겼습니다. 다시 새 파일에서 포리스트를 훈련했습니다. 이제 오류는 훈련 파일과 유효성 검사 파일 모두에서 0%이고 모든 것이 좋습니다. 유일한 주의 사항은 Rattle이 두 번째 단계에서 "변수 수" 매개변수를 2로 설정했다는 것입니다. 아마도 파일이 더 작기 때문일 것입니다. 첫 번째 단계에서와 같이 4로 변경했습니다.

 

닥터 트레이더

딸랑이를 기반으로 마음에 형제를 보니 반갑습니다. 어쨌든 결과를 비교할 기회가 있습니다.

그래서, 내 자신의 경험.

우리는 딸랑이와 모델을 가져옵니다.

모델 탭에서 RLE 값을 가져와 학습하고 평가 탭에서 검증 및 테스트 세트를 평가합니다. 우리는 세 개의 숫자를 얻습니다.

나는 예측자 집합이 이전에 잡음 예측자에서 지워지지 않았다면 얻은 결과가 거의 아무 것도 아니며 아마도 숫자 집합일 가능성이 높다고 주장합니다.

평가 탭에서 나열된 결과를 얻는 것 외에도 R 데이터 집합 창에 집합을 넣어야 합니다. 이 세트는 원본 파일을 기계적으로 분할하여 얻는 것이 매우 중요합니다. 3자리 모두의 첫 번째 파일(예: 2014년 1월 1일부터 2015년 1월 1일까지), 여기 창에 있는 파일

R Dataset은 2015년 1월 1일 이후에 R에서 사용된 임의의 샘플 및 기타 트릭 없이 필요합니다. 그냥 멍청하게, 기계적으로 말이죠.

내가 제안한 방법은 실제 거래를 모방하기 때문에 중요한 예측 변수를 노이즈 예측 변수와 분리하는 성공을 평가하는 다른 방법을 인식하지 못합니다.

네 개의 숫자를 모두 게시할 수 있습니까? R Dataset 창의 파일에 결과를 포함하시겠습니까?

 
트레이더 박사 :

Rattle에서 다른 모델을 시도했는데, 숲(forest)도 좋은 결과를 주었습니다.

1단계 - 숲은 무언가를 배웠고 통계에서 입력 1,3,5,7,9,11은 어떻게든 격리된 것처럼 보입니다. 교육 파일의 오류 0%, 검증 파일의 오류 - 46%

2단계 - 입력 1,3,5,7,9,11과 결과만 파일에 남겼습니다. 다시 새 파일에서 포리스트를 훈련했습니다. 이제 오류는 훈련 파일과 유효성 검사 파일 모두에서 0%이고 모든 것이 좋습니다. 유일한 주의 사항은 Rattle이 두 번째 단계에서 "변수 수" 매개변수를 2로 설정했다는 것입니다. 아마도 파일이 더 작기 때문일 것입니다. 첫 번째 단계에서와 같이 4로 변경했습니다.

흥미롭습니다... 모든 중요한 변수를 선택하려면 깊이를 6개의 변수로 설정해야 합니다.
 
트레이더 박사 :

Rattle에서 다른 모델을 시도했는데, 숲(forest)도 좋은 결과를 주었습니다.

1단계 - 숲은 무언가를 배웠고 통계에서 입력 1,3,5,7,9,11은 어떻게든 격리된 것처럼 보입니다. 교육 파일의 오류 0%, 검증 파일의 오류 - 46%

2단계 - 입력 1,3,5,7,9,11과 결과만 파일에 남겼습니다. 다시 새 파일에서 포리스트를 훈련했습니다. 이제 오류는 훈련 파일과 유효성 검사 파일 모두에서 0%이고 모든 것이 좋습니다. 유일한 주의 사항은 Rattle이 두 번째 단계에서 "변수 수" 매개변수를 2로 설정했다는 것입니다. 아마도 파일이 더 작기 때문일 것입니다. 첫 번째 단계에서와 같이 4로 변경했습니다.

첫 번째 경우, 숲은 훈련을 위해 소음을 사용했는데 이는 그다지 좋지 않습니다.
 
산산이치 포멘코 :

네 개의 숫자를 모두 게시할 수 있습니까? R Dataset 창의 파일에 결과를 포함하시겠습니까?

나는 이것을 뉴런으로 했습니다 - dummy_set_features.csv는 표준적으로 70% / 15% / 15%의 3 부분으로 나뉩니다. dummy_set_validation.csv는 평가 탭에서 "csv 파일"로 사용되었습니다(본질적으로 R Dataset과 동일하고 파일 형식만 다름).

Rattle에서 로그를 가져 와서 이전에 작성한 뉴런 호출에서 두 가지 제한 사항을 제거하고 R에서 실행했지만 모델은 여전히 과소 훈련 된 것으로 나타났습니다 (훈련 세트에서 35 % 오류). 훈련 샘플을 줄이면 학습 결과가 나빠집니다. 그러나 내부 레이어의 뉴런 수를 늘릴 수 있습니다. 그러면 학습이 향상됩니다.

뉴런의 수를 10에서 20으로 변경하고 다시 훈련을 시작했는데 이제 훈련 세트의 오류가 0%가 되었습니다. 검증 샘플의 오차는 0.6%, 테스트 샘플의 오차는 0.1%입니다. dummy_set_validation.csv 파일의 오류는 0.3%입니다. 모든 것이 잘됩니다. R은 응용 프로그램에 있습니다.

흥미롭게도 뉴런 학습의 문제는 나무의 문제와 매우 다릅니다. 나에게 NN의 문제는 올바른 수의 내부 뉴런을 가져와서 네트워크가 재훈련을 시작하기 전에 훈련을 일시 중지하는 것입니다. 원칙적으로 뉴런이 많을수록 좋지만 필요한 RAM과 훈련 시간에 큰 영향을 미칩니다. 추가 예측자는 학습을 특별히 방해하지 않으며 뉴런은 일반적으로 학습을 더 나쁘게 하지 않지만 학습 시간을 늘리므로 더 빨리 만들기 위해 거부하는 것이 좋습니다.

mt4에서 자체 작성 네트워크를 사용하면 어드바이저가 즉시 학습하고 거래할 수 있습니다. 학습률, 가중치 초기화, 학습 알고리즘에 문제가 있었습니다. 작은 문제가 너무 많아서 훈련 샘플에서도 좋은 결과를 얻기가 어렵습니다. 결국 모든 것을 포기하고 이제 R에서 작업합니다. nnet 패키지는 bfgs 알고리즘에서 배울 수 있으므로 작은 모든 것을 제거합니다. 문제. 그러나 패키지에는 내부 레이어가 1개로 제한됩니다. 나는 적어도 3개의 내부 레이어를 갖고 싶지만, bfgs 알고리즘과 함께, 그렇지 않으면 다시 많은 학습 문제가 있을 것입니다.

파일:
r_nnet2.txt  10 kb
 
Dr.Trader :

뉴런으로 이 작업을 수행했습니다. dummy_set_features.csv는 기본적으로 70%/15%/15%의 세 부분으로 나뉩니다. dummy_set_validation.csv는 평가 탭에서 "csv 파일"로 사용되었습니다(본질적 으로 R Dataset과 동일 하고 파일 형식만 다름).

아니요, 동일하지 않습니다.

놀라운 사실은 내가 이 글을 쓰는 동안 많은 사람들과 이 문제를 논의했지만 아무도 하지 않는다는 것입니다. 그리고 나는 당신과 같은 운동과 rattle() 외의 운동에 반년을 보냈기 때문에 내가 무엇을 쓰고 있는지 압니다. 테스터에서 대체하지 않는 것은 완전히 다른 실수입니다. 그리고 나서 위에서 설명한 대로 해보니 테스터의 오류가 R Dataset 파일의 오류와 거의 일치했습니다.

나는 하나의 큰 파일을 세 부분으로 기계적으로 나누어 얻은 세 개의 파일을 Alexey에게 보냈습니다. 첫 번째 부분에서 우리는 연습하고, 가르치고, 평가합니다... 그리고 다른 두 부분에서는 첫 번째 부분에서 받은 숫자를 확인합니다. 세 파일 모두에서 오류가 20%(!)보다 크거나 40%보다 가까우면 모델이 재학습되지 않고 작업할 수 있습니다.

언급된 3개의 파일에는 27개의 예측 변수와 6개의 대상 변수가 있습니다. 170개의 예측변수 중 27개의 예측변수를 내 알고리즘으로 선택했습니다. 현재까지 이 27개의 예측 변수는 모델을 과적합하지 않습니다. 그러나 내 세트의 나머지 143개 예측자는 잡음이고 이 잡음에 대해 당신의 것과 비슷한 오류를 쉽게 얻을 수 있지만 모델은 다시 훈련되어 더 이상 사용하기에 적합하지 않습니다.

중요 예측 변수보다 노이즈 예측 변수의 오류가 적은 이유는 무엇입니까?

내 생각에 모델 피팅 알고리즘은 피팅 오류를 줄이기 위해 노력하기 때문에 항상 노이즈, 임의 값 중에서 중요한 예측 변수보다 나은 것을 찾을 수 있습니다. 결과적으로 오류가 작을수록 모델 구축에 관련된 중요한 예측 변수가 줄어듭니다!

추신

실수로 판단되면 NN은 100% 재교육되거나 앞을 내다봅니다.

 

평가 탭의 "CSV 파일" 및 "R 데이터 세트"는 데이터 소스를 지정하는 다른 방법일 뿐입니다. 동일한 데이터를 제출하면 모델을 테스트할 때의 결과가 동일합니다.

래틀을 시작하기 전에 실행하면

dataset_validate <- read.csv( "file:///C:/dummy_set_validation.csv" , na.strings=c( "." , "NA" , "" , "?" ), strip.white= TRUE , encoding= "UTF-8" )

, 그러면 이 동일한 dataset_validate를 이제 평가 탭에서 R 데이터 세트로 사용할 수 있습니다. 그러나 모델 유효성 검사 결과는 결국 csv 파일 옵션을 선택하고 C:/dummy_set_validation.csv 파일을 지정하면 두 경우 모두 테스트용 데이터가 동일하게 되는 것과 같습니다.

훈련 자체는 다른 파일인 dummy_set_features.csv에 있었으므로 두 파일의 데이터가 다르고 시간에 전혀 의존하지 않기 때문에 여기서 미래를 보는 것은 불가능합니다(그러나 공식에 의존). 나는 뉴런이 훌륭한 일을 했고 결과를 결정하는 6개의 입력을 찾았고 나머지 입력의 영향을 줄였으며 일부 신경 논리로 원하는 공식을 설명했다고 생각합니다.

만일을 대비하여 중복 행을 찾기 위해 두 파일을 모두 확인했지만 여전히 존재하는지 알 수 없습니다. 다음은 R 코드입니다.

 #читаем данные из файлов для обучения и валидации
dataset_train <- read.csv( "file:///C:/dummy_set_features.csv" , na.strings=c( "." , "NA" , "" , "?" ), strip.white= TRUE , encoding= "UTF-8" )
dataset_validate <- read.csv( "file:///C:/dummy_set_validation.csv" , na.strings=c( "." , "NA" , "" , "?" ), strip.white= TRUE , encoding= "UTF-8" )

anyDuplicated(dataset_train) #количество повторных строк в первом файле - 567
anyDuplicated(dataset_validate) #количество повторных строк во втором файле - 202
# это покачто просто повторные строки в обоих файла по отдельности. Это не вредит, но и ничего не улучшает, лучше их убрать.
dataset_train <- unique(dataset_train)
dataset_validate <- unique(dataset_validate)

#Теперь можно узнать сколько строк из dataset_train повторяются в dataset_validate
dataset_combined <- rbind(dataset_train, dataset_validate) #Объединяем оба файла в один
nrow(dataset_combined) - nrow(dataset_combined[!duplicated(dataset_combined), ]) #количество повторенных строк - 23 . Таких повторов быть не должно, их надо удалить.
#Удаление повторенных строк из dataset_validate
dataset_validate <- dataset_validate[!(tail(duplicated(dataset_combined), nrow(dataset_validate))), ]
#Удаление из памяти объединённого файла, он больше не нужен
rm(dataset_combined)

래틀이 시작되기 전에 이 작업이 완료되면 dataset_train 및 dataset_validate 테이블을 교육 및 모델 유효성 검사에 사용할 수 있으며 반복되지 않습니다. 글로리 R.

모델 검증을 위한 파일은 훈련 세트에서 23번의 반복을 포함하고 있지만 여기에 3000개의 고유한 라인이 더 있으므로 모델 평가에 큰 영향을 미치지 않습니다.

 
이렇게 해야 합니다. 파일은 임의의 숫자로 생성됩니다.

일반적으로 나는 작업의 복잡성을 과대평가했습니다. 사실 이미 숲이 해결하고 있습니다. 숲이 어떻게 작동하는지에 비추어 이것이 어떻게 가능한지 의아해할 수도 있습니다.