/**************************************************** **** **************************
수정된 Levenberg-Marquardt를 사용하여 정확한 신경망 훈련
헤시안 계산 및 정규화. 서브루틴은 신경망을 훈련시킵니다.
임의의 위치에서 다시 시작합니다. 알고리즘은 소규모에 적합합니다.
및 중간 규모 문제(수백 개의 가중치).
입력 매개변수:
네트워크 - 초기화된 지오메트리가 있는 신경망
XY 트레이닝 세트
NPoints - 훈련 세트 크기
감쇠 - 중량 감쇠 상수, >=0.001
감쇠 용어 '감쇠*||가중치||^2'가 오류에 추가되었습니다.
기능.
어떤 Decay를 선택해야 할지 모르겠다면 0.001을 사용하십시오.
다시 시작 - 임의 위치에서 다시 시작 횟수, >0.
무엇을 다시 시작해야 할지 모르는 경우 2를 사용하십시오.
어쩌면 누군가가 탐닉하기를 원할 수도 있습니다. 숲은 증분으로 훈련되며 앞으로 1바에 대한 예측을 제공합니다. 설정은 훈련 깊이, 증분 지연 및 항목 수를 설정합니다(각각의 새 항목은 1bar씩 뒤로 시프트됨). 그런 다음 현재 가격 에서 예측 값을 뺍니다. 히스토그램은 각각의 새 막대에 대해서만 그려지며 시각화 도우미에서 보았습니다.
//+------------------------------------------------------------------+//| NonLinearPredictor.mql5 |//| Dmitrievsky Max |//| https://www.mql5.com/ru/users/dmitrievsky |//+------------------------------------------------------------------+#property copyright"Dmitrievsky Max."#property link"https://www.mql5.com/ru/users/dmitrievsky"#property version"1.00"#property indicator_separate_window#property indicator_buffers2#property indicator_plots1//--- plot Label1#property indicator_label1"Tensor non-linear predictor"#property indicator_type1DRAW_COLOR_HISTOGRAM#property indicator_color1clrOrangeRed , clrOrange#property indicator_style1STYLE_SOLID#property indicator_width11//--- подключим библиотеку Alglib#include <Math\Alglib\alglib.mqh>
//RDF system. Here we create all RF objects.
CDecisionForest RDF; //Random forest object
CDFReport RDF_report; //RF return errors in this object, then we can check itdouble RFout[ 1 ], vector[]; //Arrays for calculate result of RF
CMatrixDouble RMmatrix;
int retcode= 0 ;
//--- input parametersinputint last_bars= 500 ;
inputint lag= 5 ;
inputint bars_seria = 100 ;
//--- indicator buffersdouble SpreadBuffer[];
double ColorsBuffer[];
//--- время открытия предыдущего бараstaticdatetime last_time= 0 ;
int needToLearn= 0 ;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- indicator buffers mappingSetIndexBuffer ( 0 ,SpreadBuffer, INDICATOR_DATA );
SetIndexBuffer ( 1 ,ColorsBuffer, INDICATOR_COLOR_INDEX );
//--- установим индексацию как в таймсерии - от настоящего в прошлоеArraySetAsSeries (SpreadBuffer, true );
ArraySetAsSeries (ColorsBuffer, true );
RMmatrix.Resize(last_bars,bars_seria);
ArrayResize (vector,bars_seria- 1 );
//---IndicatorSetString ( INDICATOR_SHORTNAME , StringFormat ( "Non-linear predictor (%s, %s, %s)" , _Symbol ,( string )last_bars, ( string )lag));
IndicatorSetInteger ( INDICATOR_DIGITS , 5 );
return ( INIT_SUCCEEDED );
}
intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---ArraySetAsSeries (close, true );
if (prev_calculated== 0 || needToLearn>last_bars/ 5 )
{
for ( int i= 0 ;i<last_bars;i++)
{
for ( int l= 0 ;l< ArraySize (vector);l++)
{
RMmatrix[i].Set(l, MathLog (close[i+ 1 +l]/close[i+lag+ 1 +l]));
}
RMmatrix[i].Set(bars_seria- 1 , MathLog (close[i]/close[i+lag]));
}
CDForest::DFBuildRandomDecisionForest(RMmatrix,last_bars,bars_seria- 1 , 1 , 100 , 0.95 ,retcode,RDF,RDF_report);
needToLearn= 0 ;
}
if (isNewBar())
{
if (retcode== 1 )
{
for ( int i= 0 ;i< ArraySize (vector);i++)
{
vector[i]= MathLog (close[i]/close[i+lag]);
}
CDForest::DFProcess(RDF,vector,RFout);
SpreadBuffer[ 0 ]= MathLog (close[ 0 ]/close[ 0 +lag])-RFout[ 0 ];
ColorsBuffer[ 0 ]=(SpreadBuffer[ 0 ]> 0 ? 0 : 1 );
}
needToLearn++;
}
return (rates_total);
}
//+------------------------------------------------------------------+//| возвращает true при появлении нового бара |//+------------------------------------------------------------------+bool isNewBar()
{
datetime lastbar_time= datetime ( SeriesInfoInteger ( Symbol (), _Period , SERIES_LASTBAR_DATE ));
if (last_time== 0 )
{
last_time=lastbar_time;
return ( false );
}
if (last_time!=lastbar_time)
{
last_time=lastbar_time;
return ( true );
}
return ( false );
}
NS(4분)보다 훨씬 빠른 스캐폴딩도 확인했는데 결과는 거의 같습니다. 흥미롭게도 선형 회귀 는 동일한 결과로 훨씬 더 빠르게 계산합니다.
누군가가 여기에 썼듯이 - 그것은 모두 기능에 관한 것입니다.
글쎄, 이것이 가장 중요한 것이고 다른 모델과 가방을 가지고 노는 것은 큰 증가를주지 않습니다 :)
내가 이해하는 한 거기에서 1-2 Epoch를 설정할 수 있습니다. 거의 항상 처음으로 수렴합니다 .. 여기에 누락이 있었습니까? 오랫동안 사용하지 않았지만 뭔가 혼란 스러울 수 있습니다.
에포크의 제한 사항을 어디에서도 본 적이 없습니다.
mlptrainlm 함수
글쎄, 이것이 가장 중요한 것이고 다른 모델과 가방을 가지고 노는 것은 큰 증가를주지 않습니다 :)
Vladimir의 마지막 기사 에는 2개가 있습니다.
오히려 선형 회귀를 악화시킵니다.
mlptrainlm 함수
NN의 장점은 비선형 종속성을 찾아 사용하는 것이라고 생각합니다.
Vladimir의 마지막 기사 에는 2개가 있습니다.
오히려 선형 회귀를 악화시킵니다.
포리스트는 또한 비선형 이전 패턴에만 독점적으로 사용되며 선형 패턴에서는 작동하지 않습니다.
이것은 권장 값이며 아무도 최소 1000을 설정하는 것을 귀찮게하지 않지만 오랜 시간이 걸릴 것입니다 ... 코드를 살펴 보았습니다. epoch 수에 대한주기가 있습니다. 2).
포리스트는 또한 비선형 이전 패턴에만 독점적으로 사용되며 선형 패턴에서는 작동하지 않습니다.
어쩌면 누군가가 탐닉하기를 원할 수도 있습니다. 숲은 증분으로 훈련되며 앞으로 1바에 대한 예측을 제공합니다. 설정은 훈련 깊이, 증분 지연 및 항목 수를 설정합니다(각각의 새 항목은 1bar씩 뒤로 시프트됨). 그런 다음 현재 가격 에서 예측 값을 뺍니다. 히스토그램은 각각의 새 막대에 대해서만 그려지며 시각화 도우미에서 보았습니다.
아마도 이것이 유효성 검사 플롯의 숲이 선형 회귀 보다 0.4% 더 나은 이유입니다))). 훈련 시간은 각각 36분과 3분입니다(265개 입력). 내가 선형 회귀 를 좋아하는 것.
나는 또한 비교했다 - 나는 VR autoregression을하고 숲을 통해 동일하게했습니다 - 차이점은 최소화됩니다 :) 본질적으로 이것은 거기에 정상적인 패턴이 없다는 것을 의미합니다.