为什么QuantLib会引入Handle类?

时间:2017-03-19 17:44:59

标签: quantlib

我检查了这个slides,但仍然没有得到:

head(DF)

> Date
  01.01.2014
  02.01.2014
  03.01.2014
  01.02.2014

DF[,"Company"] <- companylist

从源代码中,我无法得到任何线索:

1) what problem does Handle sovled?

2) what is the benefit to add the Handle class?

有人可以提供更好的例子吗?

感谢。

1 个答案:

答案 0 :(得分:7)

简短回答:Handle类是指向指针的智能指针。

有什么好处?例如,采用诸如Euribor6M之类的利率指数的实例。现在,它的构造函数处理一个收益期限结构,从中预测其未来的定价。如果我们使用shared_ptr代替什么会改变?

让我们看一个用例。警告:我正在简化以避免编写太多代码,但这是我们拥有的合法用例。假设我们用一条平曲线初始化索引:

shared_ptr<SimpleQuote> r = make_shared<SimpleQuote>(0.01);
shared_ptr<YieldTermStructure> curve =
    make_shared<FlatForward>(today, r, Actual360());

shared_ptr<InterestRateIndex> index = make_shared<Euribor6M>(curve);

(在实际用例中,curve将是一组引用率引用的Euribor曲线)。 index的构造函数获取传递的shared_ptr<YieldTermStructure>的副本,并将其副本存储为数据成员。在它建成之后,我们会将指数传递给其他工具(掉期,浮动利率债券等)。

如果利率发生变化,并且我们仍然持有r报价,我们的客户代码可以写

r->setValue(0.015);

由于rcurve是共享指针,这也会改变索引内曲线副本的速率(因为curve及其副本{{1}指向同一个对象)。因此,索引定价和相关工具值也将发生变化。

但是,假设我们想要开始使用另一条曲线。在这种情况下,我们可能希望切换到插值曲线而不是平曲线:

index

(在实际情况下,我们可能想要在不同的报价集上引导曲线或使用其他方式来模拟汇率)。

我们如何告诉vector<Date> dates = ... ; vector<Rate> rates = ... ; shared_ptr<YieldTermStructure> curve2 = make_shared<ZeroCurve>(dates, rates, Actual360()); 它应该开始使用index?使用curve2,我们不能。即使我们说:

shared_ptr

这会导致curve = curve2; 指向插值曲线,但curve内的curve副本将继续指向旧的。index。这不是shared_ptr的问题,而是一般的指针。你是如何解决的?通过添加另一层间接。如果你使用原始指针,你将开始使用指针指针。在我们的代码中,Handle执行相同的操作:它“指向”shared_ptr,并且已实现,以便同一句柄的两个副本指向同一个shared_ptr。这样,如果你写:

shared_ptr<SimpleQuote> r = make_shared<SimpleQuote>(0.01);
shared_ptr<YieldTermStructure> curve =
    make_shared<FlatForward>(today, r, Actual360());
RelinkableHandle<YieldTermStructure> h(curve);

shared_ptr<InterestRateIndex> index = make_shared<Euribor6M>(h);

你以后可以写:

h.linkTo(curve2);

您持有的句柄及其在index内的副本都将指向新曲线。

至于RelinkableHandleHandle之间的区别:您只能在前者上调用linkTo。我们的想法是您实例化RelinkableHandle,将副本传递为Handle,因此您确保除了您之外没有人可以更改它指向的内容(使用const无效,因为constness可以通过简单的副本丢弃。)