Ошибки, баги, вопросы - страница 3592

 
vector x = {10,34,23,54,9};               
vector y = {4,5,11,15,20};

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   Print("Ковариация рассчиталась по выборке");
   Print(x.Cov(y));
   
   Print("\nДисперсия рассчиталась по совокупности");
   Print(x.Var());

}
2024.11.28 13:50:24.694 Ковариация рассчиталась по выборке
2024.11.28 13:50:24.694 [[350.5,5.750000000000007]
2024.11.28 13:50:24.694  [5.750000000000007,45.5]]
2024.11.28 13:50:24.694 
2024.11.28 13:50:24.694 Дисперсия рассчиталась по совокупности
2024.11.28 13:50:24.694 280.4

Калькулятор ковариации
cov

Калькулятор дисперсии

var


Очевидно, что дисперсия должна так-же рассчитываться по выборке, т.е. (size-1)

//------------------------------------------------
double Mean(const double &arr[], int size) 
{
   double sum = 0.0;
   
   for(int i=0; i<size; i++)
      sum += arr[i];
   
   return(sum / size);
}

//-----------------------------------------------
double Var(const double &arr[], int size) 
{
   double avg = Mean(arr, size); 
   double sum = 0.0;
   
   for(int i=0; i<size; i++) 
      sum += (arr[i] - avg) * (arr[i] - avg); 
      
   sum /= (size-1);
      
   return(sum); 
}
2024.11.28 14:35:24.284 Дисперсия рассчиталась по выборке
2024.11.28 14:35:24.284 350.5
 

Не читается дата записанная в файл. Что не так?

//+------------------------------------------------------------------+
//|                                                   TestScript.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

string FileName="TestFile.txt";
int H_File;

datetime Date1=D'2024.11.28 09:22';
datetime Date2,Date3;
string Str;
string StrStr[3];

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
Print("-----");

H_File=FileOpen(FileName,FILE_WRITE|FILE_TXT);
FileWriteString(H_File,IntegerToString(Date1)+" "+TimeToString(Date1));
FileClose(H_File);

Print("Date1=",Date1);

H_File=FileOpen(FileName,FILE_READ|FILE_TXT);
FileSeek(H_File,0,SEEK_SET);
Str=FileReadString(H_File);
FileClose(H_File);

Print("Str=",Str);
Date2=(datetime)StringToInteger(Str);
Print("Date2=",Date2);

StringSplit(Str,32,StrStr);
Print("StrStr[0]=",StrStr[0]," StrStr[1]=",StrStr[1]," StrStr[2]=",StrStr[2]);
Date3=(datetime)StringToInteger(StrStr[0]);
Print("Date3=",Date3);


}
//+------------------------------------------------------------------+

Вывод:

LJ 0 12:44:54.122 TestScript (EURUSD,H4) -----

NS 0 12:44:54.122 TestScript (EURUSD,H4) Date1=2024.11.28 09:22:00

QS 0 12:44:54.122 TestScript (EURUSD,H4) Str= 1732785720 2024.11.28 09:22

QQ 0 12:44:54.122 TestScript (EURUSD,H4) Date2=1970.01.01 00:00:00

CL 0 12:44:54.122 TestScript (EURUSD,H4) StrStr[0]= 1732785720 StrStr[1]=2024.11.28 StrStr[2]=09:22

DJ 0 12:44:54.122 TestScript (EURUSD,H4) Date3=1970.01.01 00:00:00

 
Roman #:

Калькулятор ковариации

Калькулятор дисперсии


Очевидно, что дисперсия должна так-же рассчитываться по выборке, т.е. (size-1)

Это - неочевидно.

В статистике есть понятия "полная выборка" и "подвыборка".

Для полной выборки считается size. Для подвыборки (например, в скользящем окне) считается size-1

 
Slava #:

Это - неочевидно.

В статистике есть понятия "полная выборка" и "подвыборка".

Для полной выборки считается size. Для подвыборки (например, в скользящем окне) считается size-1

О чём и речь. У вас
для  x.Cov(y)  считает как "подвыборка"  size-1,
для  x.Var()  считает как "полная выборка"  size.

Почему разногласие в двух методах? 
Например я хочу использовать оба метода в неком расчёте.
Сейчас один метод считает "подвыборку",  второй метод "полную выборку".
Ну это не корректор ведь будет. 

Для рыночных данных используется "подвыборка".


 
Roman #:

О чём и речь. У вас
для  x.Cov(y)  считает как "подвыборка"  size-1,
для  x.Var()  считает как "полная выборка"  size.

Почему разногласие в двух методах? 
Например я хочу использовать оба метода в неком расчёте.
Сейчас один метод считает "подвыборку",  второй метод "полную выборку".
Ну это не корректор ведь будет. 

Для рыночных данных используется "подвыборка".


Мы считаем ровно так же, как считаются в питоне аналогичные функции cov и var
numpy.cov#
  • numpy.org
numpy.cov# , , , , , , , , # Estimate a covariance matrix, given data and weights. Covariance indicates the level to which two variables vary together. If we examine N-dimensional samples, , then the covariance matrix element is the covariance of and . The element is the variance of . See the notes for an outline of the algorithm. Parameters m...
 
Slava #:
Мы считаем ровно так же, как считаются в питоне аналогичные функции cov и var

А если в питоне ошибка ))

Ну неправильно же cov и var считать по разным выборкам.

 
Roman #:

А если в питоне ошибка ))

Ну неправильно же cov и var считать по разным выборкам.

Добавим в методы Std, Var и Cov параметр ddof (Delta Degrees of Freedom), чтобы можно было устанавливать делитель на size или size-1

 
Slava #:

Добавим в методы Std, Var и Cov параметр ddof (Delta Degrees of Freedom), чтобы можно было устанавливать делитель на size или size-1

Спасибо.

 
Putnik #:

Не читается дата записанная в файл. Что не так?

Вывод:

LJ 0 12:44:54.122 TestScript (EURUSD,H4) -----

NS 0 12:44:54.122 TestScript (EURUSD,H4) Date1=2024.11.28 09:22:00

QS 0 12:44:54.122 TestScript (EURUSD,H4) Str= 1732785720 2024.11.28 09:22

QQ 0 12:44:54.122 TestScript (EURUSD,H4) Date2=1970.01.01 00:00:00

CL 0 12:44:54.122 TestScript (EURUSD,H4) StrStr[0]= 1732785720 StrStr[1]=2024.11.28 StrStr[2]=09:22

DJ 0 12:44:54.122 TestScript (EURUSD,H4) Date3=1970.01.01 00:00:00

всё нормально...это просто чудеса Print() и приведения типов в нём. По хорошему его надо использовать только с единственным аргументом - строкой. Остальное только для быстрой отладки и чревато фокусами. 

вот так примерно (константа copy-paste взята у вас)

   datetime d=(datetime)StringToInteger("1732785720");
   Print("date is "+TimeToString(d,TIME_DATE|TIME_MINUTES|TIME_SECONDS));

 
Maxim Kuznetsov #:
Print("date is "+TimeToString(d,TIME_DATE|TIME_MINUTES|TIME_SECONDS));

Попробовал, не помогло.

DL 0 23:51:40.684 TestScript (EURUSD,H4) Date3=1970.01.01 00:00:00

PG 0 23:51:40.684 TestScript (EURUSD,H4) date is 1970.01.01 00:00:00