Продвинутая оптимизация
Обзор
StockSharp предоставляет расширенные инструменты для тонкой настройки процесса оптимизации стратегий. В этом разделе описаны продвинутые компоненты: конфигурация генетического алгоритма через GeneticSettings, компиляция пользовательских фитнес-формул через FitnessFormulaProvider, а также мониторинг прогресса через OptimizationProgressTracker.
GeneticSettings
Класс GeneticSettings управляет всеми аспектами генетического алгоритма оптимизации. Расположен в пространстве имен StockSharp.Algo.Strategies.Optimization.
Параметры популяции и поколений
| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
Population |
int | 8 | Начальный размер популяции |
PopulationMax |
int | 16 | Максимальный размер популяции |
GenerationsMax |
int | 20 | Максимальное количество поколений |
GenerationsStagnation |
int | 5 | Остановка при стагнации (поколений без улучшения) |
Параметры вероятностей
| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
MutationProbability |
decimal | 0.1 | Вероятность мутации (0-1) |
CrossoverProbability |
decimal | 0.8 | Вероятность скрещивания (0-1) |
Генетические операторы
| Свойство | По умолчанию | Описание |
|---|---|---|
Reinsertion |
ElitistReinsertion | Стратегия замены поколений |
Mutation |
UniformMutation | Оператор мутации |
Crossover |
OnePointCrossover | Оператор скрещивания |
Selection |
TournamentSelection | Оператор отбора |
FitnessFormulaProvider
Класс FitnessFormulaProvider компилирует строковые выражения C# в функции Func<Strategy, decimal>, используемые для оценки стратегий во время оптимизации.
Метод Compile
var fitnessProvider = new FitnessFormulaProvider();
Func<Strategy, decimal> fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");
Доступные переменные
В формулах фитнес-функции доступны следующие переменные, соответствующие статистическим показателям стратегии:
| Переменная | Описание |
|---|---|
| PnL | Чистая прибыль |
| WinTrades | Прибыльные сделки |
| LosTrades | Убыточные сделки |
| TCount | Всего сделок |
| RTrip | Раундтрипы |
| AvgTPnL | Средняя прибыль на сделку |
| AvgWTrades | Средняя прибыльная сделка |
| AvgLTrades | Средняя убыточная сделка |
| MaxLong | Макс. длинная позиция |
| MaxShort | Макс. короткая позиция |
| MaxPnL | Макс. прибыль |
| MaxDD | Макс. просадка |
| MaxRelDD | Макс. относительная просадка |
| Ret | Доходность |
| Recovery | Фактор восстановления |
| MaxLatReg | Макс. задержка регистрации |
| MaxLatCan | Макс. задержка отмены |
| MinLatReg | Мин. задержка регистрации |
| MinLatCan | Мин. задержка отмены |
| OrdCount | Количество заявок |
| OrdRegErrCount | Ошибки регистрации |
| OrdCancelErrCount | Ошибки отмены |
| OrdFundErrCount | Ошибки "недостаточно средств" |
Переменные можно комбинировать в произвольных математических выражениях: "PnL - MaxDD * 2", "Recovery * WinTrades", "PnL / (MaxDD + 1)".
OptimizationProgressTracker
Класс OptimizationProgressTracker предоставляет удобный мониторинг процесса оптимизации.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
TotalIterations |
int | Общее количество итераций |
CompletedIterations |
int | Количество завершенных итераций |
TotalProgress |
double | Общий прогресс (0-100) |
StartedAt |
DateTimeOffset | Время начала оптимизации |
Elapsed |
TimeSpan | Затраченное время |
Remaining |
TimeSpan | Оценка оставшегося времени |
Методы
| Метод | Описание |
|---|---|
IterationCompleted() |
Отмечает завершение одной итерации |
Reset(totalIterations) |
Сбрасывает трекер для нового запуска |
Классы оптимизаторов
StockSharp предоставляет два оптимизатора, наследующих от BaseOptimizer:
- BruteForceOptimizer -- полный перебор всех комбинаций параметров. Подходит для небольшого пространства параметров.
- GeneticOptimizer -- генетический алгоритм. Эффективен при большом количестве параметров, автоматически сходится к оптимальному решению.
Пример использования
var geneticSettings = new GeneticSettings
{
Population = 16,
PopulationMax = 32,
GenerationsMax = 50,
GenerationsStagnation = 10,
MutationProbability = 0.15m,
CrossoverProbability = 0.75m,
};
// Пользовательская формула фитнес-функции
var fitnessProvider = new FitnessFormulaProvider();
var fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");
// Создание генетического оптимизатора
var optimizer = new GeneticOptimizer(
new CollectionSecurityProvider(new[] { security }),
new CollectionPortfolioProvider(new[] { portfolio }),
storageRegistry,
Paths.FileSystem);
optimizer.Settings.Population = geneticSettings.Population;
optimizer.Settings.PopulationMax = geneticSettings.PopulationMax;
optimizer.Settings.GenerationsMax = geneticSettings.GenerationsMax;
optimizer.Settings.GenerationsStagnation = geneticSettings.GenerationsStagnation;
optimizer.Settings.MutationProbability = geneticSettings.MutationProbability;
optimizer.Settings.CrossoverProbability = geneticSettings.CrossoverProbability;
// Мониторинг прогресса
var tracker = new OptimizationProgressTracker();
tracker.Reset(totalIterations: 100);
optimizer.SingleProgressChanged += (strategy, parameters, progress) =>
{
if (progress == 100)
{
tracker.IterationCompleted();
Console.WriteLine($"Прогресс: {tracker.TotalProgress:F1}%, " +
$"Осталось: {tracker.Remaining:hh\\:mm\\:ss}");
}
};