Как лучше искать среднее, если мы знаем только 2 последних значения

 

допустим, идет произвольный ряд значений, мы знаем только текущее и предыдущее, но нам нужно примерно определить среднее по всему ряду, например среднюю величину проскальзывания позиций. Но нереально постоянно пересчитывать все значения и копить их, это бред.

можно складывать предыдущее с текущим и делить на 2, потом то что получится опять складывать с новым и делить на 2. При этом естессно получаются отклонения от того среднего, которое бы мы имели зная сразу все значения. и оно со временем будет возрастать (а может и нет)

вопрос естессно нубский, но мб есть способ сделать это точнее? )  т.е. приблизить результат к реальному среднему

 
Maxim Dmitrievsky:

допустим, идет произвольный ряд значений, мы знаем только текущее и предыдущее, но нам нужно примерно определить среднее по всему ряду, например среднюю величину проскальзывания позиций. Но нереально постоянно пересчитывать все значения и копить их, это бред.

можно складывать предыдущее с текущим и делить на 2, потом то что получится опять складывать с новым и делить на 2. При этом естессно получаются отклонения от того среднего, которое бы мы имели зная сразу все значения. и оно со временем будет возрастать (а может и нет)

вопрос естессно нубский, но мб есть способ сделать это точнее? )  т.е. приблизить результат к реальному среднему

что бы не пересчитывать каждый раз все, есть EMA
 
double GetMA(double new_value)
{
   static int    Count = 0;
   static double Summ = 0;
  
   Summ += new_value;
  
   ++Count;
  
   return Summ/Count;
}
 
Maxim Dmitrievsky:

допустим, идет произвольный ряд значений, мы знаем только текущее и предыдущее, но нам нужно примерно определить среднее по всему ряду, например среднюю величину проскальзывания позиций. Но нереально постоянно пересчитывать все значения и копить их, это бред.

можно складывать предыдущее с текущим и делить на 2, потом то что получится опять складывать с новым и делить на 2. При этом естессно получаются отклонения от того среднего, которое бы мы имели зная сразу все значения. и оно со временем будет возрастать (а может и нет)

вопрос естессно нубский, но мб есть способ сделать это точнее? )  т.е. приблизить результат к реальному среднему

А за какой период считаем среднее?

Если есть возможность обратиться к n-му значению (считая с конца, и n - период усреднения), то можно считать так:

MAi = [MAi-1 x n + k1 - kn] / n

И это будет точно, никаких смещений. 

 
Marat Sultanov:
double GetMA(double new_value)
{
   static int    Count = 0;
   static double Summ = 0;
  
   Summ += new_value;
  
   ++Count;
  
   return Summ/Count;
}
вот это пять, спасибо )
 
Oleg Shenker:

А за какой период считаем среднее?

Если есть возможность обратиться к n-му значению (считая с конца, и n - период усреднения), то можно считать так:

MAi = [MAi-1 x n + k1 - kn] / n

И это будет точно, никаких смещений. 

нужно как раз без лишних массивов, имея только 2 значения, и период не известен. вариант со статическими переменными подходит
 
Maxim Dmitrievsky:

допустим, идет произвольный ряд значений, мы знаем только текущее и предыдущее, но нам нужно примерно определить среднее по всему ряду, например среднюю величину проскальзывания позиций. Но нереально постоянно пересчитывать все значения и копить их, это бред.

можно складывать предыдущее с текущим и делить на 2, потом то что получится опять складывать с новым и делить на 2. При этом естессно получаются отклонения от того среднего, которое бы мы имели зная сразу все значения. и оно со временем будет возрастать (а может и нет)

вопрос естессно нубский, но мб есть способ сделать это точнее? )  т.е. приблизить результат к реальному среднему

Обычно я делал это примерно так:

input int n; // период усреднения

double    RangeN[];
ArrayResize(RangeN, n - 1);

MA_N(double new_value)
    {
     static int i;
     RangeN[i] = new_value;
     i++;
     if(i == n) i = 0;
     for(int k = 0; k < n; k++) double average += RangeN[k];
     average = average / n;
     return(average)
    }
          

Каждый раз вычисляет точное среднее значение n последних элементов. 

 
Maxim Dmitrievsky:
нужно как раз без лишних массивов, имея только 2 значения, и период не известен. вариант со статическими переменными подходит
Только с двумя значениями можно вычислить экспоненциальное среднее. А обычное среднее не получится. 
 
Maxim Dmitrievsky:

допустим, идет произвольный ряд значений, мы знаем только текущее и предыдущее, но нам нужно примерно определить среднее по всему ряду, например среднюю величину проскальзывания позиций. Но нереально постоянно пересчитывать все значения и копить их, это бред.

Почему "бред" ???

Сколько вам значений надо копить-то ? Ну не больше же пары сотен - хранить их что, бред ???

Зная только два значения - нельзя делать никакие предположения о предыдущих значениях в силу нестационарности рынка.

 
Oleg Shenker:
Только с двумя значениями можно вычислить экспоненциальное среднее. А обычное среднее не получится. 

Почему ? На мой взгляд - если получается экспотенциальное, то среднее тем более получается. А если не получается обычного среднего - то и экспотенциального не получить.

Впрочем - выше уже правильно написали, надо хранить не все значения, а только сумму, и количество.

 
С такими данные только экспоненциальную среднюю можно посчитать.
Причина обращения: