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 - 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
推荐阅读
- ruby-on-rails - rails/roda/sinatra/... / 规范化对象键
- c++ - 多个默认可选值
- node.js - 如何向客户提供pdf?
- node.js - 某些设备上的快递验证器无效电子邮件错误
- netbeans - 如何使用 Netbeans 选择连字符分隔的单词?
- google-bigquery - 尝试获取 Apache 光束 DataFlow SideInput 时的空值
- vue.js - 如何在 Kendo UI Vue Grid (native) 中结合过滤、分组和排序
- json - -- 带有完成 URLRequest 的函数调用 - JSON
- python - 大组 x,y 坐标。找到彼此一定距离内的任何有效方法?
- python - 从句子中提取块