1) Имеем ряд данных из ста элементов. Считаем по этим данным стандартное отклонение. Запоминаем значение в prevCO 2) По появлению новых пяти элементов, можно ли используя значение prevCO и значения новых пяти элементов, рассчитать новое значение стандартного отклонения? Без пересчета всего нового ряда из 105 элементов.
Догадываюсь, что точно это сделать не возможно.
А с некоторым приближением?
Да, можно быстро получать оценки при помощи экспоненциального сглаживания.
externint 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)); }
1) Имеем ряд данных из ста элементов. Считаем по этим данным стандартное отклонение. Запоминаем значение в prevCO
2) По появлению новых пяти элементов, можно ли используя значение prevCO и значения новых пяти элементов, рассчитать новое значение стандартного отклонения?
Без пересчета всего нового ряда из 105 элементов.
Догадываюсь, что точно это сделать не возможно.
А с некоторым приближением?
Вы хотите сказать, можно-ли спрогнозировать значения последующих 5 значений по 100 предыдущим?, если не лукавить. Приведите этие 100 значений. попробуем.
yosuf: Вы хотите сказать, можно-ли спрогнозировать значения последующих 5 значений по 100 предыдущим?, если не лукавить. Приведите этие 100 значений. попробуем.
Нет. Прогнозировать ничего не хочу, хочу оптимизировать выполнение кода. Хочу после процесса оптимизации советника сохранить некое значение СО, а следующий период оптимизации не начинать заново с начала истории, а добавлять новые полученные значения данных и корректировать значение СО (самооптимизирующийся советник).
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 - это будет эквивалентно расчетам в скользящем окне, т.е. мы не полагаемся на постоянство среднего и дисперсии.
В переменную mean запишите среднее значение первых ста элементов, в переменную var запишите дисперсию первых ста элементов. Затем для 5 новых элементов выполните операцию
Благодарю.
Буду пробовать.
............
Царица наук!!! Как ни крути...
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Что бы не плодить ветки, спрошу у гуру здесь.
Задача:
1) Имеем ряд данных из ста элементов. Считаем по этим данным стандартное отклонение. Запоминаем значение в prevCO2) По появлению новых пяти элементов, можно ли используя значение prevCO и значения новых пяти элементов, рассчитать новое значение стандартного отклонения?
Без пересчета всего нового ряда из 105 элементов.
Догадываюсь, что точно это сделать не возможно.
А с некоторым приближением?
Да, можно быстро получать оценки при помощи экспоненциального сглаживания.
Хотя можно поступить проще - использовать стандартную функцию
Я про iStdDev();
Что бы не плодить ветки, спрошу у гуру здесь.
Задача:
1) Имеем ряд данных из ста элементов. Считаем по этим данным стандартное отклонение. Запоминаем значение в prevCO2) По появлению новых пяти элементов, можно ли используя значение prevCO и значения новых пяти элементов, рассчитать новое значение стандартного отклонения?
Без пересчета всего нового ряда из 105 элементов.
Догадываюсь, что точно это сделать не возможно.
А с некоторым приближением?
Я про iStdDev();
Тогда уж iStdDevOnArray(...)
Вы хотите сказать, можно-ли спрогнозировать значения последующих 5 значений по 100 предыдущим?, если не лукавить. Приведите этие 100 значений. попробуем.
Хочу после процесса оптимизации советника сохранить некое значение СО, а следующий период оптимизации не начинать заново с начала истории, а добавлять новые полученные значения данных и корректировать значение СО (самооптимизирующийся советник).
Да, можно быстро получать оценки при помощи экспоненциального сглаживания.
Если не сложно, прямо по поставленном мною примере, можете пояснить?
Спасибо.
Я не понимаю, Виктор, как Вы предлагаете решить задачу?
Тогда уж iStdDevOnArray(...)
Пусть эта функция будет. Хотя и задачи-то не было. Только вопрос
Загадочно... И обнадёживающе... )
Если не сложно, прямо по поставленном мною примере, можете пояснить?
Спасибо.
В переменную mean запишите среднее значение первых ста элементов, в переменную var запишите дисперсию первых ста элементов. Затем для 5 новых элементов выполните операцию
val - значение текущего элемента, alpha - коэффициент экспоненциального сглаживания (от нуля до единицы, пересчитывается из периода по формуле alpha=2/(1+period)). В результате вы получите обновленное значение дисперсии (var).
Суть в следующем: первая строчка обновляет оценку среднего, вторая строчка удаляет среднее из наблюдений, третья строчка считает EMA квадратов наблюдений с поправкой на среднее. Если alpha достаточно мало, число элементов достаточно велико, среднее и дисперсия постоянны - этот метод должен сходиться к значениям, вычисляемым по обычным формулам. Если брать большое alpha - это будет эквивалентно расчетам в скользящем окне, т.е. мы не полагаемся на постоянство среднего и дисперсии.
В переменную mean запишите среднее значение первых ста элементов, в переменную var запишите дисперсию первых ста элементов. Затем для 5 новых элементов выполните операцию
Буду пробовать.
............
Царица наук!!! Как ни крути...
Или я опять чего-то не допонимаю?