【问题标题】:Algorithm for iteratively reversing a complex function?迭代反转复杂函数的算法?
【发布时间】:2012-03-17 03:01:04
【问题描述】:

该算法通过在下限和上限之间迭代来找到给定值n,类似于二分查找。我该如何改进这个算法?一些细节。 n 的值几乎总是小于 1.0,但这不是边界条件。但是,它永远不会小于 0。

def approx_value(n, lower_bound, upper_bound, precision = 0.001):
    approx = (lower_bound + upper_bound) / 2.0
    while (abs(approx - n) > precision):
        if n > approx:
            lower_bound = approx
        else:
            upper_bound = approx
        approx = (lower_bound + upper_bound) / 2.0
    return approx

def approx_value_no_bounds(n, precision = 0.0001):
    approx = 1.0
    while (abs(approx - n) > precision):
        if approx > n: #decrease volatility
            return approx_value(n, 0.0, approx)
        else:
            approx *= 2
    return approx

我知道这看起来很奇怪,因为 n 的值已经提供,但算法不完整。基本上,n 是一个复杂方程的解,无法以封闭形式求解approx,所以我正在迭代地做它。最终,该算法会将使用approx 时的函数值与n 的值进行比较,并返回approx 是否足够接近输入变量。

我希望将运行时间保持在O(log(n)),这就是为什么我在二进制搜索之后对其进行建模的原因,尽管只是因为不一定立即知道上限。

【问题讨论】:

  • 试试看。该代码似乎应该可以工作。
  • 代码完美运行,但我想确保我没有错过任何基本优化。我知道过早的优化很危险,但我只想知道我没有遗漏任何对更有经验的程序员来说显而易见的东西。
  • 如果您担心速度,请尝试PyPy(它是 Python 的直接替代品,但使用 JIT 编译器进行了优化)。如果您想更快,请尝试使用numpy 并使用numpys 函数优化您的代码。更好的是,尝试用 C 或 C++ 编写代码。
  • 这一行中的guess 是什么:if guess > n:? (只是一个错字?:))
  • 看起来你想要做的是找到一个函数的逆。你能计算导数吗?如果是这样,您可以大大提高性能。

标签: python algorithm finance


【解决方案1】:

这听起来像是一个经典的优化问题。这些都经过充分研究,并且有几种众所周知的算法。一些简单但相当有效的方法是Newton's methodgradient descent

如果上述方法对您的功能效果不佳,您也可以尝试nonlinear-simplex 算法。

此处的运行时间与准确性权衡取决于您尝试求解的函数的性质。

【讨论】:

  • 我听说过其中几种方法,如果有机会,我可能会尝试实施适合的方法。用技术术语来说,该算法正在求解隐含波动率的 black-scholes 模型,这在封闭形式中是不可求解的。 (我知道这个问题之前已经解决过很多次了,但是为了学习,我正在重新发明轮子)
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2015-03-09
  • 2021-11-15
  • 2021-10-01
  • 1970-01-01
  • 2019-01-26
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多