如何为 SimpleCashFlow 定价
How to price a SimpleCashFlow
我想使用 QuantLib 为负债组合定价,这些负债组合被建模为确定性的未来现金流量。我现在将它们建模为零息票的 FixedRateBonds 条带,这似乎是一个非常不优雅的解决方案。
问题:
问题 1: 有没有办法创建一个 'Instrument',它只是一个 '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())
有几种可能的方法。如果您想使用一种工具,您可以使用 ZeroCouponBond
而不是您当前使用的固定利率工具:
bond = ZeroCouponBond(0, TARGET(), paymentamount, paymentdate)
bond.setPricingEngine(bond_engine)
print(bond.NPV())
如果折扣曲线发生变化,使用工具会给您通知并重新计算,但如果您想要单一定价,则可能有点矫枉过正。在这种情况下,您可以使用 CashFlows
class:
的方法直接处理现金流量
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
class 并直接传递现金流:
custom_bond = Bond(0, TARGET(), 100.0, Date(), Date(), cfs)
custom_bond.setPricingEngine(bond_engine)
print(custom_bond.NPV())
这可行,但有点麻烦:债券直接使用传递的现金流量,而忽略传递的面值和到期日。
我想使用 QuantLib 为负债组合定价,这些负债组合被建模为确定性的未来现金流量。我现在将它们建模为零息票的 FixedRateBonds 条带,这似乎是一个非常不优雅的解决方案。
问题:
问题 1: 有没有办法创建一个 'Instrument',它只是一个 '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())
有几种可能的方法。如果您想使用一种工具,您可以使用 ZeroCouponBond
而不是您当前使用的固定利率工具:
bond = ZeroCouponBond(0, TARGET(), paymentamount, paymentdate)
bond.setPricingEngine(bond_engine)
print(bond.NPV())
如果折扣曲线发生变化,使用工具会给您通知并重新计算,但如果您想要单一定价,则可能有点矫枉过正。在这种情况下,您可以使用 CashFlows
class:
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
class 并直接传递现金流:
custom_bond = Bond(0, TARGET(), 100.0, Date(), Date(), cfs)
custom_bond.setPricingEngine(bond_engine)
print(custom_bond.NPV())
这可行,但有点麻烦:债券直接使用传递的现金流量,而忽略传递的面值和到期日。