跳转到内容

处理不连续性

许多函数在跳跃点或不连续点处不存在数学导数。这些通常通过源代码中的条件语句或使用数学函数absmaxmin来实现。

XAD通常将标准数学函数的导数定义为不连续点处左导数和右导数的平均值。例如,函数abs(x)在点x = 0处的导数设为0,因为左导数为-1而右导数为1

由于这个定义在数学上不够精确,并且会导致高阶导数出现问题,XAD提供了一组平滑的数学函数,这些函数在所有点都可微分,可以作为原始函数的替代品。这些函数的实现确保了在不连续点附近小范围区域外能提供精确的导数,同时在该区域内使用样条曲线来近似原始函数。

例如,下图展示了smooth_abs函数(使用c = 0.001参数):

smooth_abs function

请注意,原始代码中的条件结构可能隐藏了不连续性。为了充分利用平滑数学函数的优势,需要将条件语句替换为函数。例如:

# original code
y = 0.0
if value > strike:
    y = value - strike

# equivalent smoothed code
y = math.smooth_max(0.0, value - strike)
// original code
double y = 0;
if (value > strike)
    y = value - strike;

// equivalent smoothed code
double y = smooth_max(0, value - strike);

所有提供的平滑数学函数的参考可在Smoothed Math Functions中找到。