首页 > 解决方案 > Sympy - 从函数计算“隐含”值

问题描述

我有以下功能:

import sympy as sy
import sympy.stats as systats
def euro_vanilla_price(S, K, T, r, vol, call=True):

    N = systats.Normal("n",0.0, 1.0)

    d1 = (sy.ln(S / K) + (r + 0.5 * vol ** 2) * T) / (vol * sy.sqrt(T))
    d2 = (sy.ln(S / K) + (r - 0.5 * vol ** 2) * T) / (vol * sy.sqrt(T))
    norm_d1 = systats.cdf(N)(d1)
    norm_d2 = systats.cdf(N)(d2)

    if call:
        price = (S * norm_d1 - K * sy.exp(-r * T) * norm_d2)
    else: price = (K * sy.exp(-r * T) *( 1-norm_d2) - S * (1-norm_d1))

    return price

所以这个特定的函数有 5 个输入(忽略默认调用变量)和一个输出。如果我传入一些值如下:

p,S,K,T,r, vol, call = symbols('p S K T r vol call')
exp = euro_vanilla_price(S, K, T, r, vol,call)

subs = {S:100, K:100, T:1, r:0.1, vol: 0.2}
price = exp.evalf(subs = subs)
print(price)

然后一切都很好,我得到了 13.27 的价格......这是正确的。然而,我真正想要做的是传递一个价格和 4 个其他值并计算缺失值。所以我想设置价格 = 13.27... S=100, K=100, r=0.1 然后让 sympy '退出' vol = 0.2。我希望这对于给定其他值的任何未知值都是通用的。我花了几个小时尝试各种选项,但无济于事。我曾经通过为每个未知数编写一个单独的函数并从“猜测”开始然后重新计算价格直到它接近实际价格的容差(二进制印章)来做到这一点。这导致了很多重复的代码,所以想避免

标签: sympy

解决方案


您的表达式和所需值以及除一个指定的变量之外的所有变量都将导致一个变量中的方程(可能很复杂)。nsoslve这是擅长的事情。您所需要的只是估计您认为答案将是什么(并且有很多技巧可以得到这个值,但有时系统在这方面表现得很好并且宽容,几乎任何最初的猜测都会起作用):

>>> guess = 1; val = 13.27
>>> nsolve(exp.subs({S:100, K:100, T:1, r:0.1})-val, guess).round(2)
0.20

推荐阅读