跳转至

自定义优化适应度函数

cBot 优化是在将其部署到实盘交易之前确定 cBot 最佳参数值的过程。 在 cTrader 中,您可以针对一系列内置标准优化 cBot,例如最大化利润或最小化净值回撤。 然而,您也可以编写自己的适应度函数进行优化,如果您希望对 cBot 应用自定义性能标准,这将非常有用。 在本文及其对应的视频中,我们讨论了自定义适应度函数的工作原理。

请注意,本文不涵盖使用内置标准进行 cBot 优化 的过程。

定义自定义适应度函数

自定义适应度函数只是 GetFitness() 方法的重写。

1
2
3
4
protected override double GetFitness(GetFitnessArgs args)
{

}

重写必须接受 GetFitness args 类型的单个参数,才能被视为自定义适应度函数。

编写自定义适应度函数

由于 GetFitness() 方法必须返回 double,因此方法的主体应包含一个计算结果为此类型的计算。

例如,我们可以编写一个简单的自定义适应度函数,将 cBot 的盈利交易总数平方,然后将该值除以亏损交易的总值。 这样,我们为盈利交易分配了更多的权重,并在某种意义上允许优化后的 cBot 进行一些高风险操作。

以下是我们的适应度函数的样子。

1
2
3
4
protected override double GetFitness(GetFitnessArgs args)
{
    return Math.Pow(args.WinningTrades, 2) / args.LosingTrades;
}

此时,我们可以将重写添加到任何我们想要的 cBot 中,然后保存并构建它。

在优化中使用自定义适应度函数

添加我们的函数后,我们需要添加所选 cBot 的实例,然后切换到 回测 选项卡。 要使用我们的自定义函数进行优化,我们只需打开 优化标准 部分并选择 自定义 选项。 之后,我们可以像往常一样运行优化。

在优化过程中,较高的适应度分数将分配给 cBot 最大化盈利交易数平方与亏损交易数比率的那些阶段。

修改自定义适应度函数

我们还可以回到我们的自定义函数并对其进行如下修改。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override double GetFitness(GetFitnessArgs args)
{
    if (args.TotalTrades > 20)
    {
        return Math.Pow(args.WinningTrades, 2) / args.LosingTrades;
    }
    else
    {
        return double.MinValue;
    }
}

该函数仍然遵循之前的算法,但仅在 cBot 进行了超过 20 笔交易时才应用自定义计算。 在任何其他情况下,函数返回最低可能的 double。 理论上,这应该通过减少统计偏差的可能性来改善结果。

如果我们重新构建机器人并再次运行优化,我们应该看到由于 cBot 进行的总交易数较少,几个阶段的适应度分数非常低。

最后,我们希望最小化净值回撤,同时仍然鼓励积极交易。

1
2
3
4
5
6
7
8
if (args.TotalTrades > 20 && args.MaxEquityDrawdownPercentages < 50)
{
    return Math.Pow(args.WinningTrades, 2) / args.LosingTrades;
}
else
{
    return double.MinValue;
}

如果我们再次运行优化,我们应该看到给定我们的交易策略的最佳阶段。

自定义适应度函数提供了一个出色的工具,用于确定适合您独特交易方法的最佳参数值。