Канал линейной регрессии - страница 13

 
Задача: Подсчет среднего значения и дисперсии числового ряда
Задача: Подсчет среднего значения и дисперсии числового ряда
  • голосов: 2
  • 2015.10.16
  • Google+
  • purecodecpp.com
Эта задача имеет очень большое практическое применение: в статистической обработке данных, обработке временных рядов, в цифровой обработке сигналов применительно к цифровым отсчётам сигнала. Постановка задачи такая: – вводится последовательность (вещественных) чисел … – нужно просчитать, в итоге, среднее значение и дисперсию (или СКО...
 

Сейчас попробую.

 

Вот 1

Вот расчет:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   int start;
   if(prev_calculated==0){
      start=period;
      double ms=0;
      for(int i=0;i<period;i++){
         ms+=close[i];
      }
      ma[period-1]=ms/period;
   }
   else{
      start=prev_calculated-1;
   }

   for(int i=start;i<rates_total;i++){      
      //ma[i]=ma[i-1]+(-close[i-period]+close[i])/period;      
      double s1=0;
      double s2=0;
      for(int j=i-period+1;j<=i;j++){
         s1+=close[j];
         s2+=close[j]*close[j];
      }
      s1/=period;
      s2=s2/period-s1*s1;
      Label1Buffer[i]=s2;
   }

   return(rates_total);
  }

Не ускоренный алгоритм, что бы формулу проверить. Может что не так сделал?

Файлы:
stdX4.mq5  6 kb
 
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      period=14;
//--- indicator buffers
double         Label1Buffer[];

int OnInit()
  {
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static double ms,ms2;
   int start;
   if(prev_calculated==0)
     {
      start=period;
      ms=0; ms2=0;
      for(int i=0;i<period;i++)
        {
         ms +=close[i];
         ms2+=close[i]*close[i];
        }
     }
   else
     {
      start=prev_calculated-1;
     }

   for(int i=start;i<rates_total;i++)
     {
      double Ms =ms +(-close[i-period]+close[i]);
      double Ms2=ms2+(-close[i-period]*close[i-period]+close[i]*close[i]);
      double s=Ms/period;
      Label1Buffer[i]=sqrt(s*s+(Ms2-2*Ms*s)/period);
      ms=Ms;
      ms2=Ms2;
     }
   return(rates_total);
  }
 
Yuriy Asaulenko:
Не с вами пари. 2.дня молчания, плиз.
Хеннеси вам по любому не достанется.)) А вот мне обедню испортите.

пить вредно. Сорян. Я был первый. ))

 

Гуглиться по "Moving Standard Deviation"

https://www.johndcook.com/blog/standard_deviation/

Accurately computing running variance
  • www.johndcook.com
The most direct way of computing sample variance or standard deviation can have severe numerical problems. Mathematically, sample variance can be computed as follows. The most obvious way to compute variance then would be to have two sums: one to accumulate the sum of the x‘s and another to accumulate the sums of the squares of the x‘s. If the...
 
Dmitry Fedoseev:

Вот

Вот расчет:

Не ускоренный алгоритм, что бы формулу проверить. Может что не так сделал?

у вас не учитывается приход новых данных и необходимость удаления старых (вне окна).

Николай это делает. см. код ниже вашей мессаги.

 

Такс... мое завершающее сообщение.

Пусть Юрий в личку пишет, куда ему доставить, или сертификат купить, или как.

Бывайте. Через месяц появлюсь.

 
Nikolai Semko:

пить вредно. Сорян. Я был первый. ))

На здоровье. Бегать наперегонки я не собирался. Только попросил не мешать, а тех кто знает, помолчать.
Алгоритм, да, практически эквивалентен, я о нем писал на 1-2 стр темы.
Дмитрий, извини, хоть и доказано, но Хеннеси, к моему сожалению, принять не могу.
Код, я полагаю, писать нет смысла. Пришел Семко, и все...  Приоритета захотелось.)) Как будто кто, кроме Дмитрия, сомневался.
Придется самому в магазин идти.((  На днях.
 
Dmitry Fedoseev:

Такс... мое завершающее сообщение.

Пусть Юрий в личку пишет, куда ему доставить, или сертификат купить, или как.

Бывайте. Через месяц появлюсь.

Завидую. Плодотворной работы! 
Мой посыл то был, что это можно делать не только с СКО для простой машки, но и для полинома любой степени. 
Правда формула растёт с геометрической прогрессией с увеличением степени полинома.