Динамические алерты для генетических алгоритмов
Динамические алерты для генетических алгоритмов
Проблема
При использовании генетических алгоритмов для оптимизации торговых стратегий возникает проблема с таймаутами:
Динамические таймауты
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-100 | 10 секунд | Минимальный таймаут |
| 101-500 | 30 секунд | Средний объем |
| 501-1000 | 60 секунд | Большой объем |
| 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)
Заключение
Динамические алерты решают проблему ложных срабатываний при работе с большими объемами данных и обеспечивают:
- Автоматическую адаптацию к объему данных
- Точные рекомендации по настройке таймаутов
- Предотвращение прерываний оптимизации
- Улучшенную производительность за счет правильных настроек
Система автоматически анализирует объем данных и рекомендует оптимальные настройки, что позволяет эффективно использовать генетические алгоритмы для оптимизации торговых стратегий.