如何为SimpleCashFlow定价

时间:2017-03-30 10:23:38

标签: python quantlib

我想使用QuantLib为负债组合定价,这些负债被建模为确定性的未来现金流。我现在将它们建模为带有零优惠券的FixedRateBonds条带,这似乎是一个非常不优雅的解决方案。

问题:

问题1:有没有办法创建一个“工具”,只是一个'SimpleCashFlow','Redemption'等,并在折扣曲线上定价?

问题2:是否可以从多个SimpleCashFlow构建'CashFlows'对象或工具并在曲线上定价?

非常感谢提前

代码示例:

请参阅下面的代码,了解我要做的事情。

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())

1 个答案:

答案 0 :(得分:3)

有几种可能的方法。如果您想使用乐器,可以使用ZeroCouponBond代替您当前使用的固定费率:

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

如果要更改折扣曲线,使用工具会为您提供通知和重新计算,但如果您想要单一定价,则可能过度。在这种情况下,您可以使用CashFlows类的方法直接使用现金流:

cf = SimpleCashFlow(paymentamount, paymentdate)
print(CashFlows.npv([cf], discount_curve, True))

如果您希望在今天的日期包含任何现金流,则最后一个参数为True,否则为False(请注意,这会给您的结果与您的计算略有不同;这是因为您使用的付款日期是一个TARGET假期,FixedRateBond构造函数将其调整到下一个工作日。)

以上也适用于几种现金流:

cfs = [SimpleCashFlow(paymentamount, paymentdate),
       SimpleCashFlow(paymentamount*0.5, paymentdate+180),
       SimpleCashFlow(paymentamount*2, paymentdate+360)]
print(CashFlows.npv(cfs, discount_curve, True))

最后,如果你想对乐器做同样的事情,你可以使用基础Bond类并直接传递现金流:

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

这是有效的,但是有点像kludge:债券直接使用通过的现金流量而忽略了通过的面额和到期日。