Динамические алерты для генетических алгоритмов

Динамические алерты для генетических алгоритмов

Проблема

При использовании генетических алгоритмов для оптимизации торговых стратегий возникает проблема с таймаутами:

Динамические таймауты

graph LR
    subgraph "Объем данных"
        Q100[100 котировок]
        Q500[500 котировок]
        Q1000[1000+ котировок]
    end
    
    subgraph "Таймауты"
        T10[10 секунд]
        T30[30 секунд]
        T120[120 секунд]
    end
    
    subgraph "Расчет"
        BASE[Базовое время: 6 сек/100]
        FORMULA[Формула: quotes/100 * 6]
    end
    
    Q100 --> T10
    Q500 --> T30
    Q1000 --> T120
    BASE --> FORMULA
    FORMULA --> T10
    FORMULA --> T30
    FORMULA --> T120
  • Текущая ситуация: Алерты срабатывают на основе фиксированного таймера (60 секунд)
  • Проблема: При большом количестве котировок (1000+) генетические мутации не укладываются в отведенное время
  • Результат: Ложные алерты и прерывание оптимизации

Решение: Динамические алерты

Принцип работы

Система автоматически рассчитывает оптимальный таймаут на основе количества котировок:

Базовое время: 6 секунд на 100 котировок
Динамический расчет: timeout = (quotes_count / 100) * 6 секунд

Настройки для разных объемов данных

Количество котировокРекомендуемый таймаутОписание
1-10010 секундМинимальный таймаут
101-50030 секундСредний объем
501-100060 секундБольшой объем
1000+120 секундОчень большой объем

Конфигурация

1. Основные настройки в config.yaml

system_setup:
  worker_pool:
    ab_optimizer:
      max_workers: 8      # Увеличено для параллельной обработки
      queue_size: 100     # Увеличено для больших объемов
      task_timeout: "120s" # Увеличено для больших объемов котировок

ab_tests:
  max_simulation_steps: 0  # 0 = использовать все доступные котировки

2. Дополнительные настройки (опционально)

genetic_optimization:
  timeout_settings:
    base_time_per_100_quotes: 6
    min_timeout: "10s"
    max_timeout: "300s"
    safety_buffer_percent: 20

Использование

1. Автоматическая проверка таймаутов

Система автоматически проверяет достаточность таймаутов при запуске генетической оптимизации:

// Создаем динамический менеджер таймаутов
timeoutManager := NewDynamicTimeoutManager(log, cfg, nil)

// Проверяем и корректируем таймауты
timeoutManager.AdjustWorkerPoolTimeout(ctx, len(quotes))

// Получаем рекомендации
recommendation := timeoutManager.GetTimeoutRecommendation(len(quotes))

2. Логирование рекомендаций

Система выводит подробные рекомендации в логах:

📋 Анализ таймаутов для генетической оптимизации
{
  "quotes_count": 1500,
  "current_timeout": "60s",
  "optimal_timeout": "120s",
  "needs_adjustment": true,
  "timeout_ratio": 0.5,
  "recommendation": "Увеличить task_timeout в конфигурации worker_pool.ab_optimizer до 120s"
}

Новые правила алертов

1. Алерт на превышение времени выполнения

{
    Name: "genetic_optimization_timeout",
    Description: "Превышение времени выполнения генетической оптимизации",
    Level: AlertLevelWarning,
    Condition: func() (bool, error) {
        // Динамический расчет на основе количества котировок
        quotesCount := cfg.ABTests.MaxSimulationSteps
        expectedTime := time.Duration(quotesCount/100) * 6 * time.Second
        currentTimeout := cfg.SystemSetup.WorkerPool.ABOptimizer.TaskTimeout
        return currentTimeout < expectedTime, nil
    },
    Duration: 5 * time.Minute,
}

2. Алерт на высокое потребление памяти

{
    Name: "genetic_optimization_high_memory",
    Description: "Высокое потребление памяти генетическим алгоритмом",
    Level: AlertLevelWarning,
    Condition: func() (bool, error) {
        var m runtime.MemStats
        runtime.ReadMemStats(&m)
        usagePercent := float64(m.HeapAlloc) / float64(m.HeapSys) * 100
        maxMemoryUsage := cfg.ABTests.Experiment.GA.MaxMemoryUsage * 100
        return usagePercent > maxMemoryUsage, nil
    },
    Duration: 2 * time.Minute,
}

3. Алерт на медленную сходимость

{
    Name: "genetic_optimization_slow_convergence",
    Description: "Медленная сходимость генетического алгоритма",
    Level: AlertLevelInfo,
    Condition: func() (bool, error) {
        generations := cfg.ABTests.Experiment.GA.Generations
        populationSize := cfg.ABTests.Experiment.GA.PopulationSize
        expectedGenerations := 50
        if populationSize > 100 {
            expectedGenerations = 100
        }
        return generations > expectedGenerations, nil
    },
    Duration: 10 * time.Minute,
}

Примеры использования

Пример 1: Малое количество котировок (100)

ab_tests:
  max_simulation_steps: 100

system_setup:
  worker_pool:
    ab_optimizer:
      task_timeout: "10s"  # Достаточно для 100 котировок

Результат: Алерт не срабатывает, оптимизация проходит успешно.

Пример 2: Среднее количество котировок (500)

ab_tests:
  max_simulation_steps: 500

system_setup:
  worker_pool:
    ab_optimizer:
      task_timeout: "30s"  # Рекомендуется для 500 котировок

Результат: Система рекомендует увеличить таймаут до 30 секунд.

Пример 3: Большое количество котировок (1000+)

ab_tests:
  max_simulation_steps: 0  # Использовать все котировки

system_setup:
  worker_pool:
    ab_optimizer:
      task_timeout: "120s"  # Рекомендуется для больших объемов

Результат: Система автоматически адаптируется к большому объему данных.

Мониторинг и метрики

1. Метрики производительности

  • genetic_optimization_timeout_ratio - отношение текущего таймаута к оптимальному
  • genetic_optimization_quotes_count - количество котировок для оптимизации
  • genetic_optimization_actual_duration - фактическое время выполнения

2. Алерты и уведомления

  • Warning: Таймаут может быть недостаточным
  • Info: Рекомендации по настройке
  • Debug: Подробная информация о расчетах

Рекомендации по настройке

1. Для разработки и тестирования

ab_tests:
  max_simulation_steps: 100  # Ограниченный набор данных
  experiment:
    ga:
      generations: 10        # Быстрая итерация
      population_size: 20    # Малая популяция

system_setup:
  worker_pool:
    ab_optimizer:
      task_timeout: "10s"    # Минимальный таймаут

2. Для продакшена

ab_tests:
  max_simulation_steps: 0   # Все доступные данные
  experiment:
    ga:
      generations: 50        # Полная оптимизация
      population_size: 100   # Большая популяция

system_setup:
  worker_pool:
    ab_optimizer:
      task_timeout: "120s"   # Увеличенный таймаут
      max_workers: 8         # Больше параллелизма
      queue_size: 100        # Больший буфер

Отключение алертов

Если необходимо отключить динамические алерты:

alerting:
  channels: []  # Пустой список каналов

Или в коде:

// Создаем менеджер без алертов
timeoutManager := NewDynamicTimeoutManager(log, cfg, nil)

Заключение

Динамические алерты решают проблему ложных срабатываний при работе с большими объемами данных и обеспечивают:

  1. Автоматическую адаптацию к объему данных
  2. Точные рекомендации по настройке таймаутов
  3. Предотвращение прерываний оптимизации
  4. Улучшенную производительность за счет правильных настроек

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