Блог им. fxsaber

Алгоритмическая или реальная Оптимизация?

    • 16 апреля 2024, 01:25
    • |
    • fxsaber
  • Еще

Для ускорения оптимизации ТС делают следующее

 

  1. Увеличивают количество параллельных вычислительных потоков.
  2. Пробуют разные компиляторы.
  3. Переписывают код под особенности железа (OpenCL, GPU и т.д.).
  4. Пробуют разные алгоритмы оптимизации.
  5. Уменьшают количество входных данных (цены, календарь и т.д.).
  6. Заменяют внутренние алгоритмы на более оптимальные по вычислительным ресурсам.

Последний пункт называют алгоритмической оптимизацией.

 

Реальная оптимизация.

А может ли реальная (вычислительная) оптимизация ускорить оптимизацию? Звучит, как масло масленное.

Ниже приведу пример, который, возможно, кого-то натолкнет на полезные идеи ускорения расчетов в своих ТС.

 

Пример.

Хотелось привести не гипотетический, а реальный пример, но при этом лаконичный. И тут случай подвернулся.

 

Разбирался с особенностями DST/GMT-смещений в разных источниках котировок и календаря. Там многое завязано на первом/втором/последнем воскресенье месяца. Поэтому ядром подобных вычислений является расчет времени начала месяца. Вот эту функцию и попробуем ускорить.

datetime GetMonthTime( const int Year, const int Month )
{
  const MqlDateTime time = {Year, Month, 1};
  
  return(StructToTime(time));
}

 

 

 

Казалось бы, что тут ускорять? А главное — как?!

 

Оптимизация — кто кому служит?

Чем меньше математических действий, тем быстрее работает алгоритм. Поэтому немного включив интуицию, напишем общий вид функции, который хотим получить.

#define DAY (24 * 3600)

datetime GetMonthTime2( const int Year, const int Month )
{
  // Количество дней от начала года до начала месяца: январь - 0, февраль - 31, март - 59, ...
  static const double Months[] = {0, 0, 31, 59, 90, 120, 151, 181, 212 ,243, 273, 304, 334};
  
  return((datetime)(((Year - 1970) * inKoef1 + Months[Month] * inKoef2) * DAY) / DAY * DAY);
}

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

 

Коэффициенты.

А вот подобрать эти коэффициенты способна стандартная оптимизация. Поэтому пишем ФФ (фитнесс функцию) и натравливаем оптимизатор.

input double inKoef1 = 365;
input double inKoef2 = 1;

sinput int inYearFrom = 1970;
sinput int inYearTo = 2099; 
input int inMonth = 1;

double OnTester()
{
  double Sum = 0;
  
  for (int i = inYearFrom; i <= inYearTo; i++)
    Sum -= (double)MathAbs(GetMonthTime(i, inMonth) - GetMonthTime2(i, inMonth));

  return(Sum);
}

 

Для наглядности, в качестве оптимизатора выступит многоядерный MT5-Тестер в режиме математических вычислений.

Алгоритмическая или реальная Оптимизация?

 

Запускаем и мгновенно получаем результат.

Алгоритмическая или реальная Оптимизация?

Нулевая ошибка (полное совпадение с тем, что надо получить) и комбинации соответствующих коэффициентов.

 

Делаем так для каждого месяца. И в итоге получаем искомую функцию.

// Работает до конца XXI-века.
datetime GetMonthTime3( const int Year, const int Month )
{
  static const double Months[] = {0, 0.45, 31 * 1.01, 59 * 1.01, 90 * 1.007, 120 * 1.005, 151 * 1.004, 181 * 1.004,
                                  212 * 1.003, 243 * 1.003, 273 * 1.002, 304 * 1.002, 334 * 1.002};
  
  return((datetime)(((Year - 1970) * 365.25 + Months[Month]) * DAY) / DAY * DAY);
}

 

Ускорение.

Выглядит некрасиво, но работает в 10-20 раз быстрее исходной!

Наверное, подобная по скорости функция где-то опубликована. Но сгодилась в качестве примера механизма ускорения.

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
855 | ★1
6 комментариев
Вот честно не понял, что сделал автор и почему нужна оптимизация для событий детерминированных. Не проще ли создать один раз таблицу на 20 и 21 век? 
Что касается самой задачи оптимизации для алго, то просто для затравки перечислю последовательность задач и методов. 
1. Самое неформальное и сложное, это выбор функционала, который нужно оптимизировать. Как-то доходность, Шарп, Сортино, список на самом деле обширный. Некоторые вообще отказываются от сведения задачи к функционалу и воюют с многомерной оптимизацией. 
2. Собственно алгоритмы оптимизации. Перечислены в любом учебнике. 
Перебор по сетке. Покоординатный спуск. Сопряженные градиенты. Метод Ньютона и численные его вариации. Метод ветвей и границ. Монте-Карло. Генетика. 
3. Переподгонка и что с ней делать или можно ли делать то, что нельзя.  А если можно, то как.
avatar

SergeyJu, В моем текущем подходе нет понятия «оптимизация» и какого-то процесса, похожего, на то, что алго-трейдеры под ней понимают. Но было время, когда что-то похожее у меня было. Но даже если я перемещусь в то время, даже из него всё это для меня выглядит не очень историей. Причем и (1) и (2), ну (3) — классика, тут без вариантов).

 

При оптимизации, если такой процесс есть, нужно оптимизировать робастность. Ну или робастность и какую-то метрику качества. Даааже если ты выбрал какую-то метрику про робастность, смотреть надо не на метрику прогона, а на метрики прогонов — и не для того чтобы найти у кого больше.

Алгоритмы оптимизации — ну раз тумбочка из под ног пункта 1 выбита, из под 2 автоматом тоже вылетает. 

(3) — как сказал, бессмертная классика.

avatar
Replikant_mih, Вы уверены, что у Вас нет оптимизации? 
Часто оптимизация маскируется под что-то другое. Например, выбор таймфрейма или актива. 
С робастностью (устойчивостью, грубостью) тоже не все просто. 
Если в некоторой области значений все получаемые системы вполне себе торгуемы и можно торговать не одну систему, а пучок — наблюдается некая робастность. 
Но ни откуда не следует, что, в силу нестационарности цен, эта зона в будущем не престанет нести деньги робастно-робастно.
avatar
SergeyJu, Чет я опять куда-то не туда ответил).
avatar
уверены, что у Вас нет оптимизации? 


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

 

Если в некоторой области значений все получаемые системы вполне себе торгуемы и можно торговать не одну систему, а пучок — наблюдается некая робастность. 

 

Ну мож я сам тут конечно, слишком сильно деклассировал подход), но вот алгоритмы из (2) — они же, вроде, не особо ищут какие-то плато или точки стабильности — им просто нужен максимум — глобальный или локальный.

Если анализировать группы результатов не только как способ найти «самого здорового», то конечно в этом будет на порядок больше смысла.

avatar
Replikant_mih, эмпирически все доходят, что пологая зона оптимума намного лучше, чем иголка, и что не важен сам экстремум, важна некая окрестность его. 
Одно время я баловался с критериями типа хи-квадрат, Акаике и так далее. Но те грубости, в который мы копаемся, весьма далеки от красивостей матстатистики. Что ни говори, высокий уровень шума и нестационарность 
«с белой ручки не стряхнешь и за пояс не заткнешь». 
avatar

Читайте на SMART-LAB:
💰 Российский бизнес откладывает инвестпроекты
Высокая ключевая ставка и охлаждение экономики вынуждают российские компании пересматривать инвестиционные планы. Об этом заявил глава Российского...
Фото
Какие акции могут быстро закрыть дивидендный гэп
Дмитрий Пучкарев На российском рынке стартовал дивидендный сезон. После закрытия реестра акции обычно снижаются примерно на размер выплат —...
Фото
Энергопереход под вопросом. Ускорит ли развитие зеленой энергетики конфликт с Ираном?
Война в Иране поставила мир на грань энергетического кризиса. По данным The Economist, только за первые 50 дней конфликта мир лишился 550 млн...
Фото
Нефтяной срез: выпуск №9. Ормуз перекрыт, но акции нефтегаза падают. Надо ли покупать или сидеть на заборе в LQDT? Ищем лучших в секторе, где растет прибыль!
Продолжаю выпускать рубрику — Нефтяной срез.  Цель: отслеживать важные бенчмарки в нефтяной отрасли, чтобы понимать куда дует ветер.  Прошлый пост:...

теги блога fxsaber

....все тэги



UPDONW
Новый дизайн