高级优化

概览

StockSharp 提供用于微调策略优化过程的高级工具。本节描述高级组件:通过 GeneticSettings 配置遗传算法,通过 FitnessFormulaProvider 编译自定义适应度公式,以及通过 OptimizationProgressTracker 监控进度。

遗传设置

GeneticSettings 类管理遗传优化算法的所有方面。它位于 StockSharp.Algo.Strategies.Optimization 命名空间中。

人口与代参数

属性 类型 默认值 描述
Population 整数 8 初始种群规模
PopulationMax 整数 16 最大人口规模
GenerationsMax 整数 20 最大世代数
GenerationsStagnation 整数 5 在停滞时停止(几代没有改进)

概率参数

属性 类型 默认值 描述
MutationProbability 十进制 0.1 突变概率(0-1)
CrossoverProbability 十进制 0.8 交叉概率(0-1)

遗传算子

属性 默认值 描述
Reinsertion 精英再插入 代替生成策略
Mutation 统一变异 变异算子
Crossover 单点交叉 交叉算子
Selection 锦标赛选择 选择算子

健身公式提供者

FitnessFormulaProvider 类将 C# 字符串表达式编译为 Func<Strategy, decimal> 函数,用于在优化过程中评估策略。

编译方法

var fitnessProvider = new FitnessFormulaProvider();
Func<Strategy, decimal> fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");

可用变量

在适应度函数公式中,可以使用以下变量,对应于策略统计指标:

变量 描述
盈亏 净利润
赢利交易 赢利交易
亏损交易 亏损的交易
TCount 总交易
RTrip 往返旅行
平均每笔交易利润 每笔交易的平均利润
AvgWTrades 平均获利交易
AvgLTrades 平均亏损交易
最大多头 最大多头持仓
最大空头 最大空头持仓
最大盈利 最大利润
最大回撤 最大回撤
最大相对回撤 最大相对回撤
Ret 返回
回收 回收因子
MaxLatReg 最大注册延迟
MaxLatCan 最大取消延迟
MinLatReg 最小注册延迟
MinLatCan 最小取消延迟
订单数量 订单计数
OrdRegErrCount 注册错误
OrdCancelErrCount 取消错误
OrdFundErrCount 资金不足错误

变量可以组合成任意数学表达式:"PnL - MaxDD * 2", "Recovery * WinTrades", "PnL / (MaxDD + 1)"

优化进度跟踪器

OptimizationProgressTracker 类提供了对优化过程的便捷监控。

属性

属性 类型 描述
TotalIterations 整数 迭代总次数
CompletedIterations int 完成的迭代次数
TotalProgress 双精度 总体进度 (0-100)
StartedAt 日期时间偏移 优化开始时间
Elapsed 时间间隔 已用时间
Remaining 时间间隔 预计剩余时间

方法

方法 描述
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($"Progress: {tracker.TotalProgress:F1}%, " +
			$"Remaining: {tracker.Remaining:hh\\:mm\\:ss}");
	}
};

另请参阅