我试图使用 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 的新手,所以感谢任何帮助和建议。谢谢。