Optimización avanzada
Descripción general
StockSharp proporciona herramientas avanzadas para ajustar con precisión el proceso de optimización de estrategias. Esta sección describe componentes avanzados: configuración de algoritmo genético mediante GeneticSettings, compilación de fórmulas de fitness personalizadas mediante FitnessFormulaProvider y supervisión del progreso mediante OptimizationProgressTracker.
GeneticSettings
La clase GeneticSettings gestiona todos los aspectos del algoritmo de optimización genética. Se encuentra en el espacio de nombres StockSharp.Algo.Strategies.Optimization.
Parámetros de población y generaciones
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
Population |
int | 8 | Tamaño de población inicial |
PopulationMax |
int | 16 | Tamaño máximo de población |
GenerationsMax |
int | 20 | Número máximo de generaciones |
GenerationsStagnation |
int | 5 | Detener por estancamiento (generaciones sin mejora) |
Parámetros de probabilidad
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
MutationProbability |
decimal | 0.1 | Probabilidad de mutación (0-1) |
CrossoverProbability |
decimal | 0.8 | Probabilidad de crossover (0-1) |
Operadores genéticos
| Propiedad | Predeterminado | Descripción |
|---|---|---|
Reinsertion |
ElitistReinsertion | Estrategia de reemplazo de generación |
Mutation |
UniformMutation | Operador de mutación |
Crossover |
OnePointCrossover | Operador de crossover |
Selection |
TournamentSelection | Operador de selección |
FitnessFormulaProvider
La clase FitnessFormulaProvider compila expresiones de string C# en funciones Func<Strategy, decimal> usadas para evaluar estrategias durante la optimización.
Método Compile
var fitnessProvider = new FitnessFormulaProvider();
Func<Strategy, decimal> fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");
Variables disponibles
Las siguientes variables están disponibles en fórmulas de función fitness, correspondientes a indicadores estadísticos de estrategia:
| Variable | Descripción |
|---|---|
| PnL | Beneficio neto |
| WinTrades | Operaciones ganadoras |
| LosTrades | Operaciones perdedoras |
| TCount | Operaciones totales |
| RTrip | Round-trips |
| AvgTPnL | Beneficio medio por operación |
| AvgWTrades | Operación ganadora media |
| AvgLTrades | Operación perdedora media |
| MaxLong | Posición larga máxima |
| MaxShort | Posición corta máxima |
| MaxPnL | Beneficio máximo |
| MaxDD | Drawdown máximo |
| MaxRelDD | Drawdown relativo máximo |
| Ret | Rentabilidad |
| Recovery | Factor de recuperación |
| MaxLatReg | Latencia máxima de registro |
| MaxLatCan | Latencia máxima de cancelación |
| MinLatReg | Latencia mínima de registro |
| MinLatCan | Latencia mínima de cancelación |
| OrdCount | Número de órdenes |
| OrdRegErrCount | Errores de registro |
| OrdCancelErrCount | Errores de cancelación |
| OrdFundErrCount | Errores de fondos insuficientes |
Las variables se pueden combinar en expresiones matemáticas arbitrarias: "PnL - MaxDD * 2", "Recovery * WinTrades", "PnL / (MaxDD + 1)".
OptimizationProgressTracker
La clase OptimizationProgressTracker proporciona una supervisión cómoda del proceso de optimización.
Propiedades
| Propiedad | Tipo | Descripción |
|---|---|---|
TotalIterations |
int | Número total de iteraciones |
CompletedIterations |
int | Número de iteraciones completadas |
TotalProgress |
double | Progreso general (0-100) |
StartedAt |
DateTimeOffset | Hora de inicio de la optimización |
Elapsed |
TimeSpan | Tiempo transcurrido |
Remaining |
TimeSpan | Tiempo restante estimado |
Métodos
| Método | Descripción |
|---|---|
IterationCompleted() |
Marca una iteración como completada |
Reset(totalIterations) |
Restablece el tracker para una nueva ejecución |
Clases de optimizador
StockSharp proporciona dos optimizadores que heredan de BaseOptimizer:
- BruteForceOptimizer -- enumeración exhaustiva de todas las combinaciones de parámetros. Adecuado para espacios de parámetros pequeños.
- GeneticOptimizer -- algoritmo genético. Eficiente con una gran cantidad de parámetros, converge automáticamente hacia la solución óptima.
Ejemplo de uso
var geneticSettings = new GeneticSettings
{
Population = 16,
PopulationMax = 32,
GenerationsMax = 50,
GenerationsStagnation = 10,
MutationProbability = 0.15m,
CrossoverProbability = 0.75m,
};
// Fórmula de función fitness personalizada
var fitnessProvider = new FitnessFormulaProvider();
var fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");
// Crear el optimizador genético
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;
// Supervisión del progreso
var tracker = new OptimizationProgressTracker();
tracker.Reset(totalIterations: 100);
optimizer.SingleProgressChanged += (strategy, parameters, progress) =>
{
if (progress == 100)
{
tracker.IterationCompleted();
Console.WriteLine($"Progress: {tracker.TotalProgress:F1}%, " +
$"Remaining: {tracker.Remaining:hh\\:mm\\:ss}");
}
};