0

我试图使用 xlwings 编写一个 Excel UDF,以从 Mibian 库返回财务选项计算​​。我试过下面的代码。

import xlwings as xw
import mibian

@xw.func
def BSPutOptionImpVol(underlyingPrice,strike,interestRate,expiryDays,premium):
    c = mibian.BS([underlyingPrice, strike, interestRate, expiryDays], putPrice=premium)
    return c.impliedVolatility

从 Excel 中,然后我使用以下命令调用该函数=BSPutOptionImpVol(45,32,1,127,0.95)

它返回以下错误:

“NameError:名称'norm'未定义 call = self.underlyingPrice * norm.cdf(self.d1 ) - \ File ""C:\Users...\anaconda3\lib\site-packages\mibian__init__.py"" ,第 307 行,在 _price [self.callPrice, self.putPrice] = self._price() 文件 ""C:\Users...\anaconda3\lib\site-packages\mibian__init__.py"",第 276 行,在init 估计 = eval(className)(args,volatility=mid,performance=True).putPrice File ""C:\Users...\anaconda3\lib\site-packages\mibian__init__.py"",第 29 行,隐含波动率self.class.name , args , putPrice = self.putPrice ) 文件 ""C:\Users...\anaconda3\lib\site-packages\mibian__init__.py"",第 293 行,在初始化 c = mibian.BS([underlyingPrice, strike, interestRate, expiryDays], putPrice=premium) File ""c:\users...\documents\python scripts\BSPutImVol.py"",第 6 行,在 BSPutOptionImpVol ret = func (*args) 文件 ""C:\Users...\anaconda3\lib\site-packages\xlwings\udfs.py"",第 298 行,在 call_udf res = call_udf(script, fname, args, this_workbook, FromVariant( caller)) 文件 ""C:\Users...\anaconda3\lib\site-packages\xlwings\server.py"",第 195 行,在 CallUDF return func(args) 文件 ""C:\Users...\anaconda3\lib\site-packages\win32com\server\policy.py"",第 586 行,在 _invokeex_ 中返回 S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None) 文件 ""C:\Users...\anaconda3\lib\site-packages\win32com\server\policy.py"",第 283 行,在 _invoke_ return self._invoke_(dispid, lcid , wFlags, args) 文件 ""C:\Users...\anaconda3\lib\site-packages\win32com\server\policy.py"",第 278 行,在 _Invoke_"

我也试过只调用函数而不传递参数(即输入值在python代码中),但我仍然得到同样的错误。

但是,如果我注释掉 xlwings 并从 Spyder 运行 Python 代码,如下所示,它可以工作。

#import xlwings as xw
import mibian

#@xw.func
def BSPutOptionImpVol(underlyingPrice,strike,interestRate,expiryDays,premium):
    c = mibian.BS([underlyingPrice, strike, interestRate, expiryDays], putPrice=premium)
 #   return c.impliedVolatility
    print(c.impliedVolatility)

我是 Python 的新手,所以感谢任何帮助和建议。谢谢。

4

2 回答 2

2

尝试..

from scipy.stats import norm
于 2020-12-03T22:43:08.580 回答
0

尝试添加

import scipy

到你的代码。这为我解决了“规范”问题。

于 2020-08-06T06:59:27.790 回答