python-3.x Quantlib:从另一个函数调用RelinkableYieldTermStructureHandle()

1l5u6lss  于 2023-04-22  发布在  Python
关注(0)|答案(1)|浏览(153)

我有一个使用Quantlib引导yield term structure(yts)的函数。我试图让其他函数重用生成的term structure,但我得到错误消息:“NameError:name'yts' is not defined swap engine =ql.折扣SwapEngine(yts)
如果任何人可以帮助它将不胜感激。

def bootstrap():
    today = ql.Date.todaysDate()
    ql.Settings.instance().evaluationDate = today

    global yts
    yts = ql.RelinkableYieldTermStructureHandle()
    estr = ql.Estr()

    ###  helper rates etc     

    estr_curve_c = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(),
                                            helpers, ql.Actual365Fixed())
    estr_curve_c.enableExtrapolation()
    yts.linkTo(estr_curve_c)
 
    ### so far this works - the YieldTermStructureHandle works

def getrate(tenor, fwd):
    swapEngine = ql.DiscountingSwapEngine(yts)
    ir_swap = ql.MakeOIS(swapTenor=ql.Period(tenor, ql.Months), fwdStart=ql.Period(fwd, ql.Months),\
       overnightIndex = ql.Estr(yts), pricingEngine=swapEngine, fixedRate=2.0)
    return ir_swap.fairRate()     

####  this part does not work: NameError:name'yts' is not defined  swap engine =ql.Discounting     SwapEngine(yts)
u4vypkhs

u4vypkhs1#

这就是Python的工作方式:

>>> def init():
...     global x
...     x = 1
... 
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

init()函数需要被执行,而不仅仅是声明,以便初始化全局变量。
然而,如果我可以提出一个建议,我不认为这是一个合理的设计。与其使其成为一个全局变量,我将从bootstrap函数返回yts。您可以从getrate调用bootstrap,或者在外部调用它并将yts作为附加参数传递给getrate

相关问题