Sympy-计算';隐含的';函数中的值

Sympy-计算';隐含的';函数中的值,sympy,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 -

我有以下功能:

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。我想这是通用的任何未知的价值给予其他人。我花了几个小时尝试各种选择,但都没有用。我以前是这样做的,为每个未知的东西写一个单独的函数,从一个“猜测”开始,然后重新计算价格,直到它接近实际价格的容差(二进制切块)。这导致了大量重复代码,因此希望避免使用表达式和所需的值,并且除了指定的一个变量外,其他所有变量都将在一个变量中生成一个等式(可能比较复杂)。这是
nsoslve
擅长的事情。你所需要的只是估计你认为答案会是什么(获得这个值有很多技巧,但有时系统在这方面是适当的和宽容的,几乎任何最初的猜测都会奏效):

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