Вопрос математикам. - страница 2

 
lasso:

Что бы не плодить ветки, спрошу у гуру здесь.

Задача:

1) Имеем ряд данных из ста элементов. Считаем по этим данным стандартное отклонение. Запоминаем значение в prevCO
2) По появлению новых пяти элементов, можно ли используя значение prevCO и значения новых пяти элементов, рассчитать новое значение стандартного отклонения?
Без пересчета всего нового ряда из 105 элементов.


Догадываюсь, что точно это сделать не возможно.

А с некоторым приближением?


Да, можно быстро получать оценки при помощи экспоненциального сглаживания.

extern int period = 15;

double alpha, mean, var;
bool init = false;

void Update(double val) {
  if (!init) {
    alpha = 2.0 / (1.0 + period);

    // doesn't matter
    mean = val;
    var = 0.0;

    init = true;
    return;
  }

  // this is magic :P
  mean += alpha * (val - mean);
  val -= mean;
  var += alpha * (val * val - var);
}

double GetMean() { return (mean); }
double GetVariance() { return (var); }
double GetStandardDeviation() { return (MathSqrt(var)); }
 
Vinin:

Хотя можно поступить проще - использовать стандартную функцию

Я про iStdDev();
 
lasso:

Что бы не плодить ветки, спрошу у гуру здесь.

Задача:

1) Имеем ряд данных из ста элементов. Считаем по этим данным стандартное отклонение. Запоминаем значение в prevCO
2) По появлению новых пяти элементов, можно ли используя значение prevCO и значения новых пяти элементов, рассчитать новое значение стандартного отклонения?
Без пересчета всего нового ряда из 105 элементов.


Догадываюсь, что точно это сделать не возможно.

А с некоторым приближением?

Вы хотите сказать, можно-ли спрогнозировать значения последующих 5 значений по 100 предыдущим?, если не лукавить. Приведите этие 100 значений. попробуем.
 
Vinin:

Я про iStdDev();
Я не понимаю, Виктор, как Вы предлагаете решить задачу?
Тогда уж iStdDevOnArray(...)
 
yosuf:
Вы хотите сказать, можно-ли спрогнозировать значения последующих 5 значений по 100 предыдущим?, если не лукавить. Приведите этие 100 значений. попробуем.
Нет. Прогнозировать ничего не хочу, хочу оптимизировать выполнение кода.
Хочу после процесса оптимизации советника сохранить некое значение СО, а следующий период оптимизации не начинать заново с начала истории, а добавлять новые полученные значения данных и корректировать значение СО (самооптимизирующийся советник).
 
anonymous:


Да, можно быстро получать оценки при помощи экспоненциального сглаживания.

Загадочно... И обнадёживающе... )
Если не сложно, прямо по поставленном мною примере, можете пояснить?
Спасибо.
 
lasso:
Я не понимаю, Виктор, как Вы предлагаете решить задачу?
Тогда уж iStdDevOnArray(...)

Пусть эта функция будет. Хотя и задачи-то не было. Только вопрос
 
lasso:
Загадочно... И обнадёживающе... )
Если не сложно, прямо по поставленном мною примере, можете пояснить?
Спасибо.

В переменную mean запишите среднее значение первых ста элементов, в переменную var запишите дисперсию первых ста элементов. Затем для 5 новых элементов выполните операцию

  mean += alpha * (val - mean);
  val -= mean;
  var += alpha * (val * val - var);

val - значение текущего элемента, alpha - коэффициент экспоненциального сглаживания (от нуля до единицы, пересчитывается из периода по формуле alpha=2/(1+period)). В результате вы получите обновленное значение дисперсии (var).

Суть в следующем: первая строчка обновляет оценку среднего, вторая строчка удаляет среднее из наблюдений, третья строчка считает EMA квадратов наблюдений с поправкой на среднее. Если alpha достаточно мало, число элементов достаточно велико, среднее и дисперсия постоянны - этот метод должен сходиться к значениям, вычисляемым по обычным формулам. Если брать большое alpha - это будет эквивалентно расчетам в скользящем окне, т.е. мы не полагаемся на постоянство среднего и дисперсии.

 
anonymous:

В переменную mean запишите среднее значение первых ста элементов, в переменную var запишите дисперсию первых ста элементов. Затем для 5 новых элементов выполните операцию

Благодарю.

Буду пробовать.
............
Царица наук!!! Как ни крути...

 
А у Роша в инклюднике Z-include.mq4 косячок по определению Standard deviation?
Или я опять чего-то не допонимаю?
Results[3]=Sn;       // Standard deviation

Причина обращения: