|
From: Wei Li <ttl...@gm...> - 2024-06-25 03:44:08
|
Hello Luigi,
Thank you for your kind explanation. What I am trying to do is to calculate
the theta per day for exotic options by bumping the system's evaluation
date one day later. The vol model and class I am using is the
SabrSmileSection and a customized volatility surface class. I am asking
because I discovered three small problems after bumping the date:
1) I am constructing the vol surface with fixed reference date (and fixed
forward dates when calibrating the SABR parameters) the black variance /
black vol I am getting (by calling BlackVolTermStructure::blackVariance or
BlackVolTermStructure::blackVol) still have the original Time t, not one
day shorter, after I bump the evaluation date. That's because it is using t
= timeFromReference(forwardDate) which always starts from the original
reference date. As a result, the variance is larger than expected.
2) In sabrsmilesection.hpp, the constructor takes an explicitly-passed
forward date but still sets the isFloating_ as true. That's my bad, because
I am still using the 1.23 version and I noticed the new version already
fixed this.
3) And regarding your question, right now I am using the one day later
forward price as the new spot and the discount factor from the bumped date
to the settlement date.
Cheers,
Wei
On Mon, Jun 24, 2024 at 6:00 PM Luigi Ballabio <lui...@gm...>
wrote:
> Hello Wei,
> that is a known issue but it doesn't have an easy solution. In short:
> when passing an explicit reference date to PiecewiseYieldCurve, we're
> saying that we want to discount to that date but this doesn't mean it
> should also be taken as the evaluation date; it might be spot, i.e., a
> couple of business days after the evaluation date.
>
> In turn, this means that we can't use the passed reference date to
> calculate the start and end of the swaps contained in the helpers; it must
> still be done using the evaluation date. So when the evaluation date
> changes, the reference date stays the same but the swaps underlying the
> helpers move their start and end dates.
>
> If you have to move the evaluation date, one thing that might work is
> calling freeze() on the piecewise curve after it's bootstrapped; this tells
> it not to recalculate.
>
> However, I'm not really sure of your use case here. You're moving the
> evaluation date but you want the discount factors to stay fixed? What is
> it that you're trying to model?
>
> Hope this helps,
> Luigi
>
>
>
>
>
> On Fri, Jun 21, 2024 at 3:44 AM Wei Li <ttl...@gm...> wrote:
>
>> Hello Luigi,
>>
>> I get your point, and now I have encountered a new problem (that was the
>> reason I am exploring this piece of code): I am following the example in
>> test-suite\piecewiseyieldcurve.cpp, function
>> tesetiterativeBootstrapRetries(), and I am trying to bootstrap a EUR curve
>> using a USD interpolated discount curve and the EUR/USD swap quotes (with
>> the help of FxSwapRateHelper class). From my understanding, neither USD
>> discount curve (of type InterpolatedDiscountCurve<LogLinear>) and the
>> bootstrapped EUR curve (of type PiecewiseYieldCurve<Discount, LogLinear,
>> IterativeBootstrap>) should change with respect to evaluation date (they
>> all have base class constructors with an explicitly-passed reference date).
>>
>> However, when I am trying to get the discount factors say one year from
>> now on, using both curves, before and after I bump the evaluation date by
>> one day, I see that the discount factor of USD curve remains the same after
>> the evaluation date bump, but the discount factor of bootstrapped EUR curve
>> gets changed. As a result, when I am calculating the forecast fx forward
>> rate by
>>
>> fx_fwd = fx_spot * usd_curve.discount(spot_date) /
>> usd_curve.discount(forward_date) / (eur_curve.discount(spot_date) /
>> eur_curve.discount(forward_date))
>>
>> Before and after I bump the evaluation date it gives different results
>> (not only dfs on spot_date and forward_date get changed, but
>> eur_curve.discount(spot_date) / eur_curve.discount(forward_date) also gets
>> changed) . But I am expecting the calculated fx_fwd should be the same?
>>
>> What am I missing here?
>>
>> Thank you very much for your help!
>>
>> Cheers,
>> Wei
>>
>> On Thu, Jun 20, 2024 at 4:43 PM Luigi Ballabio <lui...@gm...>
>> wrote:
>>
>>> Hello,
>>> no, InterpolatedDiscountCurve doesn't change with respect to the
>>> evaluation date. That's why it's built by explicitly specifying discount
>>> factors at given dates. If I build a curve saying, for instance,
>>>
>>> vector<Date> dates = { Date(20, Jun, 2024), Date(29, Jul, 2024),
>>> Date(31, Aug, 2024), Date(30, Sep, 2024) };
>>> vector<DiscountFactor> dfs = { 1.0000, 0.9999, 0.9993, 0.9988 };
>>> auto curve = InterpolatedDiscountCurve<LogLinear> >(dates, dfs,
>>> Actual365Fixed());
>>>
>>> that says that the discount on September 30th 2024 is 0.9988, should the
>>> discount for that date change when we move the evaluation date? And if it
>>> should change, how do we move the dates so that the discount changes? Do
>>> we shift them like we shifted the evaluation date? We might not have that
>>> information, we only get notified that the evaluation date changed.
>>>
>>> Currently, we sidestep the whole problem by keeping the curve as it was
>>> specified regardless of the evaluation date.
>>>
>>> Regards,
>>> Luigi
>>>
>>>
>>>
>>> On Thu, Jun 20, 2024 at 9:33 AM Wei Li <ttl...@gm...> wrote:
>>>
>>>> Dear all,
>>>>
>>>> We are constructing yield curves using bootstrapped date and discount
>>>> factor pairs, i.e., we use the InterpolatedDiscountCurve class. But when I
>>>> am looking at the PUBLIC constructors of this class (all three of them take
>>>> a date vector and a discount factor vector as basic form), I see that they
>>>> all internally call the base class (YieldTermStructure) constructor using
>>>> the first date in the vector (dates.at(0)) as an explicitly-passed
>>>> reference date. It means this class doesn't register with the change of
>>>> QuantLib's evaluation date.
>>>>
>>>> So when I am using these curves like this:
>>>>
>>>> Date delivery = Date (30, September, 2024);
>>>> DiscountFactor df1 = my_curve -> discount(delivery);
>>>>
>>>> Date originalEvalDate = Settings::instance().evaluationDate();
>>>> Settings::instance().evaluationDate() = originalEvalDate + 30;
>>>>
>>>> DiscountFactor df2 = my_curve -> discount(delivery);
>>>>
>>>> I would expect the df2 to be different from df1, but it is not the
>>>> case. Since the reference date of my_curve never got changed, the
>>>> timeFromReference remained the same and hence the discount factor.
>>>>
>>>> Is there some way to construct a discount curve using dates and dfs,
>>>> and the curve would reflect the change of evaluation date, or am I totally
>>>> wrong to expect it would?
>>>>
>>>> Cheers,
>>>> Wei
>>>>
>>>> _______________________________________________
>>>> QuantLib-users mailing list
>>>> Qua...@li...
>>>> https://lists.sourceforge.net/lists/listinfo/quantlib-users
>>>>
>>>
|