Otimização Avançada
Visão Geral
StockSharp fornece ferramentas avançadas para afinar o processo de otimização de estratégias. Esta secção descreve componentes avançados: configuração do algoritmo genético através de GeneticSettings, compilação de fórmulas de fitness personalizadas através de FitnessFormulaProvider e monitorização do progresso através de OptimizationProgressTracker.
GeneticSettings
A classe GeneticSettings gere todos os aspetos do algoritmo de otimização genética. Está localizada no namespace StockSharp.Algo.Strategies.Optimization.
Parâmetros de População e Geração
| Propriedade | Tipo | Por defeito | Descrição |
|---|---|---|---|
Population |
int | 8 | Tamanho inicial da população |
PopulationMax |
int | 16 | Tamanho máximo da população |
GenerationsMax |
int | 20 | Número máximo de gerações |
GenerationsStagnation |
int | 5 | Parar em estagnação (gerações sem melhoria) |
Parâmetros de Probabilidade
| Propriedade | Tipo | Por defeito | Descrição |
|---|---|---|---|
MutationProbability |
decimal | 0.1 | Probabilidade de mutação (0-1) |
CrossoverProbability |
decimal | 0.8 | Probabilidade de crossover (0-1) |
Operadores Genéticos
| Propriedade | Por defeito | Descrição |
|---|---|---|
Reinsertion |
ElitistReinsertion | Estratégia de substituição de geração |
Mutation |
UniformMutation | Operador de mutação |
Crossover |
OnePointCrossover | Operador de crossover |
Selection |
TournamentSelection | Operador de seleção |
FitnessFormulaProvider
A classe FitnessFormulaProvider compila expressões C# em string para funções Func<Strategy, decimal> usadas para avaliar estratégias durante a otimização.
Método Compile
var fitnessProvider = new FitnessFormulaProvider();
Func<Strategy, decimal> fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");
Variáveis Disponíveis
As seguintes variáveis estão disponíveis em fórmulas de função de fitness, correspondendo aos indicadores estatísticos da estratégia:
| Variável | Descrição |
|---|---|
| PnL | Lucro líquido |
| WinTrades | Negócios vencedores |
| LosTrades | Negócios perdedores |
| TCount | Total de negócios |
| RTrip | Round-trips |
| AvgTPnL | Lucro médio por negócio |
| AvgWTrades | Negócio vencedor médio |
| AvgLTrades | Negócio perdedor médio |
| MaxLong | Posição longa máxima |
| MaxShort | Posição curta máxima |
| MaxPnL | Lucro máximo |
| MaxDD | Drawdown máximo |
| MaxRelDD | Drawdown relativo máximo |
| Ret | Retorno |
| Recovery | Fator de recuperação |
| MaxLatReg | Latência máxima de registo |
| MaxLatCan | Latência máxima de cancelamento |
| MinLatReg | Latência mínima de registo |
| MinLatCan | Latência mínima de cancelamento |
| OrdCount | Número de ordens |
| OrdRegErrCount | Erros de registo |
| OrdCancelErrCount | Erros de cancelamento |
| OrdFundErrCount | Erros de fundos insuficientes |
As variáveis podem ser combinadas em expressões matemáticas arbitrárias: "PnL - MaxDD * 2", "Recovery * WinTrades", "PnL / (MaxDD + 1)".
OptimizationProgressTracker
A classe OptimizationProgressTracker fornece monitorização conveniente do processo de otimização.
Propriedades
| Propriedade | Tipo | Descrição |
|---|---|---|
TotalIterations |
int | Número total de iterações |
CompletedIterations |
int | Número de iterações concluídas |
TotalProgress |
double | Progresso global (0-100) |
StartedAt |
DateTimeOffset | Hora de início da otimização |
Elapsed |
TimeSpan | Tempo decorrido |
Remaining |
TimeSpan | Tempo restante estimado |
Métodos
| Método | Descrição |
|---|---|
IterationCompleted() |
Marca uma iteração como concluída |
Reset(totalIterations) |
Repõe o rastreador para uma nova execução |
Classes de Otimizador
StockSharp fornece dois otimizadores que herdam de BaseOptimizer:
- BruteForceOptimizer -- enumeração exaustiva de todas as combinações de parâmetros. Adequado para espaços de parâmetros pequenos.
- GeneticOptimizer -- algoritmo genético. Eficiente com um grande número de parâmetros, converge automaticamente para a solução ótima.
Exemplo de Utilização
var geneticSettings = new GeneticSettings
{
Population = 16,
PopulationMax = 32,
GenerationsMax = 50,
GenerationsStagnation = 10,
MutationProbability = 0.15m,
CrossoverProbability = 0.75m,
};
// Fórmula personalizada da função de aptidão
var fitnessProvider = new FitnessFormulaProvider();
var fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");
// Criar o otimizador 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;
// Monitoramento do progresso
var tracker = new OptimizationProgressTracker();
tracker.Reset(totalIterations: 100);
optimizer.SingleProgressChanged += (strategy, parameters, progress) =>
{
if (progress == 100)
{
tracker.IterationCompleted();
Console.WriteLine($"Progresso: {tracker.TotalProgress:F1}%, " +
$"Restante: {tracker.Remaining:hh\\:mm\\:ss}");
}
};