如何为SimpleCashF定价

2024-09-24 22:21:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用QuantLib来为负债组合定价,这些负债组合被建模为确定性的未来现金流。我现在把它们建模成一条没有息票的固定利率债券,这似乎是一个非常不雅观的解决方案。在

问题:

问题1:是否有方法创建一种“工具”,即“简单现金流”、“赎回”等,并按照折扣曲线定价?在

问题2:是否可以从多个SimpleCashFlow中构造一个“现金流”对象或工具,并按曲线定价?在

非常感谢

代码示例:

请参阅下面的代码以获取我正在尝试执行的操作的示例。在

from QuantLib import *

# set params
calc_date = Date(30, 3, 2017)
risk_free_rate = 0.01
discount_curve = YieldTermStructureHandle(
                     FlatForward(calc_date, risk_free_rate, ActualActual()))
bond_engine = DiscountingBondEngine(discount_curve)

# characteristics of the cash-flow that I am trying to NPV
paymentdate = Date(30, 3, 2018)
paymentamount = 1000

# this works: pricing a fixed rate bond with no coupons
schedule = Schedule(paymentdate-1, paymentdate, Period(Annual),  TARGET(),
Unadjusted, Unadjusted, DateGeneration.Backward, False)
fixed_rate_bond = FixedRateBond(0, paymentamount, schedule, [0.0],ActualActual())
bond_engine = DiscountingBondEngine(discount_curve)
fixed_rate_bond.setPricingEngine(bond_engine)
print(fixed_rate_bond.NPV())

# create a simple cashflow
simple_cash_flow = SimpleCashFlow(paymentamount, paymentdate)
# Q1: how to create instrument, set pricing engine and price a SimpleCashFlow?
#wrongcode:# simple_cash_flow.setPricingEngine(bond_engine)
#wrongcode:# print(simple_cash_flow.NPV())

# Q2: can I stick multiple cashflows into a single instrument, e.g.:
# how do I construct and price a CashFlows object from multiple 'SimpleCashFlow's?
simple_cash_flow2 = SimpleCashFlow(paymentamount, Date(30, 3, 2019))
#wrongcode:# cashflows_multiple = CashFlows([simple_cash_flow, simple_cash_flow2])
#wrongcode:# cashflows_multiple.setPricingEngine(bond_engine)
#wrongcode:# print(cashflows_multiple.NPV())

Tags: ratecashmultiplesimpleflowenginefixed定价
1条回答
网友
1楼 · 发布于 2024-09-24 22:21:27

有几种可能的方法。如果您想使用一种仪器,您可以使用ZeroCouponBond,而不是当前使用的固定费率:

bond = ZeroCouponBond(0, TARGET(), paymentamount, paymentdate)
bond.setPricingEngine(bond_engine)
print(bond.NPV())

如果贴现曲线发生变化,使用工具将给您提供通知和重新计算,但如果您希望单一定价,则可能会有过多的杀伤力。在这种情况下,您可以使用CashFlows类的方法直接处理现金流:

^{pr2}$

其中,最后一个参数是True,如果你想包括今天发生的任何现金流,则为False(注意,这将给你一个与你的计算略有不同的结果;这是因为你使用的付款日期是一个目标假日,FixedRateBond构造函数将其调整到下一个工作日)。在

上述情况也适用于几种现金流:

^{3}$

最后,如果您想对工具执行相同的操作,可以使用baseBond类并直接传递现金流:

custom_bond = Bond(0, TARGET(), 100.0, Date(), Date(), cfs)
custom_bond.setPricingEngine(bond_engine)
print(custom_bond.NPV())

这是可行的,但有点混乱:债券直接使用传递的现金流,而忽略传递的票面金额和到期日。在

相关问题 更多 >