|
From: David D. <nh...@gm...> - 2020-10-09 08:19:18
|
Hi,
You can either clear the fixings or use the optional boolean third
parameter on the addFixing method to explicitly overwrite the existing
value:
index.addFixing(ql.Date(6,ql.March,2019), 0.003, True)
On the other question, the parameter for the index is a
YieldTermStructureHandle and you can create one and then link to whichever
curve you wish to use.
Maybe this simple example will help you understand:
yts = ql.RelinkableYieldTermStructureHandle()
index = ql.Euribor6M(yts)
crv1 = ql.FlatForward(2, ql.TARGET(), 0.05, ql.Actual360())
yts.linkTo(crv1)
print(index.fixing(ql.Date(15,12,2020)))
crv2 = ql.FlatForward(2, ql.TARGET(), 0.02, ql.Actual360())
yts.linkTo(crv2)
print(index.fixing(ql.Date(15,12,2020)))
On Fri, 9 Oct 2020 at 08:38, isilay erol <ero...@gm...> wrote:
> As you said "index.clearFixings ()" command worked. Thank you very much.
>
> Well, there is one more basic point that I cannot understand. How can I
> link the index directly to my index curve?
>
> In all the examples I saw on the internet like in the following ones,
>
> "index = ql.Euribor6M ()"
>
> "index = ql.Euribor3M ()"
>
> or I saw the Libor version of this.
>
>
>
> Actually, my zero coupon should be an index curve, right?
>
>
>
> In my query how can I create the bridge between my index and index curve
> zCurve?
>
>
>
> (the part I would like to change: index = ql.Euribor6M(yts))
>
>
>
> Thank you very much for your help,
>
>
>
>
>
> import QuantLib as ql
>
> from pandas import DataFrame
>
>
>
>
>
> dates = [
>
> '07-05-2019', '11-11-2019', '09-12-2019', '09-01-2020', '10-02-2020',
>
> '09-03-2020', '09-04-2020', '11-05-2020', '09-06-2020',
>
> '09-07-2020', '10-08-2020', '09-09-2020', '09-10-2020', '09-11-2020',
>
> '10-05-2021', '09-05-2022', '09-05-2023', '09-05-2024']
>
>
>
> zeros = [
>
> 0.000000, 0.001185, 0.001352, 0.001561, 0.001766, 0.001941, 0.002146,
>
> 0.002355, 0.002534,
>
> 0.002712, 0.002897, 0.003069, 0.003232, 0.003395, 0.004146, 0.004549,
>
> 0.003148, 0.004040]
>
>
>
> ql.Settings.instance().evaluationDate = ql.Date(7,5,2019)
>
> qlDates = [ql.Date(dt, '%d-%m-%Y') for dt in dates]
>
> dayCounter = ql.Actual360()
>
>
>
>
>
> zCurve = ql.ZeroCurve(qlDates, zeros, ql.ActualActual(), ql.TARGET())
>
>
>
>
>
>
>
> #To get the forward rates, you can use the "forwardRate" method from the
> curve:
>
>
>
> forwardStart = ql.Date(15,6,2020)
>
> forwardEnd = ql.Date(15,12,2020)
>
> fwd = zCurve.forwardRate(forwardStart, forwardEnd, dayCounter,
>
> ql.Compounded, ql.Annual).rate()
>
> print(fwd)
>
>
>
> #or build the floating rate bond object and inspect the rate on the
> cashflows:
>
>
>
> yts = ql.YieldTermStructureHandle(zCurve)
>
> schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2021),
>
> ql.Period('6m'))
>
> index = ql.Euribor6M(yts)
>
> index.clearFixings()
>
> index.addFixing(ql.Date(6,ql.August,2014), 0.05)
>
> bond = ql.FloatingRateBond(2,100, schedule, ql.Euribor6M(yts),
>
> ql.Actual360())
>
>
> On 9 Oct 2020 Fri at 10:11 Francois Botha <ig...@gm...> wrote:
>
>> So the error message states that you have already added the fixing.
>>
>> I'm unsure whether the Python interface for index.addFixing provides a
>> parameter to optionally overwrite any existing indices. If so, try that.
>> Alternatively, there should be something like index.clearFixings() which
>> you can call first before adding new fixings.
>>
>> regards
>>
>> Francois Botha
>>
>>
>> On Fri, 9 Oct 2020 at 08:58, isilay erol <ero...@gm...> wrote:
>>
>>> Hello again,
>>>
>>> I want to ask one more question;
>>>
>>> I want set a past fixing for the current latest coupon (which, having
>>> fixed in the past, can’t be forecast).
>>>
>>> The forecasting of floating bond cashflow should be start generate from
>>> this latest repring coupon rate.
>>>
>>> That’s why I heve added the following querry only to see what will
>>> happen;
>>>
>>>
>>>
>>>
>>>
>>> “index.addFixing(ql.Date(6,ql.March,2019), 0.003)”
>>>
>>>
>>>
>>> Bu I have the folowing error message;
>>>
>>> Am I thinking wrongly?
>>>
>>>
>>>
>>> import QuantLib as ql
>>>
>>> from pandas import DataFrame
>>>
>>>
>>>
>>> dates = [
>>>
>>> '07-05-2019', '11-11-2019', '09-12-2019', '09-01-2020', '10-02-2020',
>>>
>>> '09-03-2020', '09-04-2020', '11-05-2020', '09-06-2020',
>>>
>>> '09-07-2020', '10-08-2020', '09-09-2020', '09-10-2020', '09-11-2020',
>>>
>>> '10-05-2021', '09-05-2022', '09-05-2023', '09-05-2024']
>>>
>>>
>>>
>>> zeros = [
>>>
>>> 0.000000, 0.001185, 0.001352, 0.001561, 0.001766, 0.001941, 0.002146,
>>>
>>> 0.002355, 0.002534,
>>>
>>> 0.002712, 0.002897, 0.003069, 0.003232, 0.003395, 0.004146, 0.004549,
>>>
>>> 0.003148, 0.004040]
>>>
>>>
>>>
>>> ql.Settings.instance().evaluationDate = ql.Date(7,5,2019)
>>>
>>> qlDates = [ql.Date(dt, '%d-%m-%Y') for dt in dates]
>>>
>>> dayCounter = ql.Actual360()
>>>
>>>
>>>
>>>
>>>
>>> zCurve = ql.ZeroCurve(qlDates, zeros, ql.ActualActual(), ql.TARGET())
>>>
>>>
>>>
>>> forwardStart = ql.Date(15,6,2020)
>>>
>>> forwardEnd = ql.Date(15,12,2020)
>>>
>>> fwd = zCurve.forwardRate(forwardStart, forwardEnd, dayCounter,
>>>
>>> ql.Compounded, ql.Annual).rate()
>>>
>>> print(fwd)
>>>
>>> 0.005623856615195155
>>>
>>>
>>>
>>> yts = ql.YieldTermStructureHandle(zCurve)
>>>
>>> schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2021),
>>>
>>> ql.Period('6m'))
>>>
>>> index = ql.Euribor6M(yts)
>>>
>>> index.addFixing(ql.Date(6,ql.March,2019), 0.003)
>>>
>>> bond = ql.FloatingRateBond(2,100, schedule, ql.Euribor6M(yts),
>>>
>>> ql.Actual360())
>>>
>>>
>>>
>>> Traceback (most recent call last):
>>>
>>>
>>>
>>> File "<ipython-input-61-ec28b13dc284>", line 5, in <module>
>>>
>>> index.addFixing(ql.Date(6,ql.March,2019), 0.003)
>>>
>>>
>>>
>>> File "C:\Anaconda3\lib\site-packages\QuantLib\QuantLib.py", line 5475,
>>> in addFixing
>>>
>>> return _QuantLib.Index_addFixing(self, fixingDate, fixing,
>>> forceOverwrite)
>>>
>>>
>>>
>>> RuntimeError: At least one duplicated fixing provided: March 6th, 2019,
>>> 0.003 while 0.002 value is already present
>>>
>>>
>>> Best regards,
>>>
>>> On 8 Oct 2020 Thu at 17:20 isilay erol <ero...@gm...> wrote:
>>>
>>>> Thank you very much Luigi an David.
>>>>
>>>> On 8 Oct 2020 Thu at 16:32 Luigi Ballabio <lui...@gm...>
>>>> wrote:
>>>>
>>>>> If you use ql.ZeroCurve instead of ql.DiscountCurve you can input zero
>>>>> rates directly and get a curve that you can use in the exact same way.
>>>>>
>>>>> Luigi
>>>>>
>>>>>
>>>>> On Thu, Oct 8, 2020 at 3:13 PM isilay erol <ero...@gm...>
>>>>> wrote:
>>>>>
>>>>>> Dear David,
>>>>>>
>>>>>> You are right, the discount factors are increasing,
>>>>>>
>>>>>> this indicates that the curve is negative.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Your sample helped me a lot, thank you very much.
>>>>>>
>>>>>> I need to make my calculation from the zero coupon yield curve itself,
>>>>>>
>>>>>> not the discount factor. At this point,
>>>>>>
>>>>>> I will try to move forward using the formula of the discount factor
>>>>>> calculation from zero coupon.
>>>>>>
>>>>>> If you already have a Python example of this conversion, I would be
>>>>>> very happy if you could share it with me.
>>>>>>
>>>>>> If not, I will try to derive it.
>>>>>>
>>>>>> Thanks again
>>>>>>
>>>>>> Best regards,
>>>>>>
>>>>>>
>>>>>> On 8 Oct 2020 Thu at 15:39 David Duarte <nh...@gm...> wrote:
>>>>>>
>>>>>>> That is correct. The rates in EUR are negative.
>>>>>>> Notice the discount factors are above 1
>>>>>>>
>>>>>>> On Thu, 8 Oct 2020, 13:10 isilay erol, <ero...@gm...>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Dear David,
>>>>>>>> I'm working on Anaconda Python,
>>>>>>>> Thank you for your help,
>>>>>>>> When I ran your query,
>>>>>>>> I got negative fwd rates and negative fwd cash flows, am I missing
>>>>>>>> something?
>>>>>>>>
>>>>>>>> You can see my results in the following:
>>>>>>>>
>>>>>>>> import QuantLib as ql
>>>>>>>>
>>>>>>>> from pandas import DataFrame
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> dates = [
>>>>>>>>
>>>>>>>> '07-05-2019', '11-11-2019', '09-12-2019', '09-01-2020',
>>>>>>>> '10-02-2020',
>>>>>>>>
>>>>>>>> '09-03-2020', '09-04-2020', '11-05-2020', '09-06-2020',
>>>>>>>>
>>>>>>>> '09-07-2020', '10-08-2020', '09-09-2020', '09-10-2020',
>>>>>>>> '09-11-2020',
>>>>>>>>
>>>>>>>> '10-05-2021', '09-05-2022', '09-05-2023', '09-05-2024']
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> dfs = [
>>>>>>>>
>>>>>>>> 1.000000, 1.001185, 1.001352, 1.001561, 1.001766, 1.001941,
>>>>>>>> 1.002146,
>>>>>>>>
>>>>>>>> 1.002355, 1.002534,
>>>>>>>>
>>>>>>>> 1.002712, 1.002897, 1.003069, 1.003232, 1.003395, 1.004146,
>>>>>>>> 1.004549,
>>>>>>>>
>>>>>>>> 1.003148, 0.999840]
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> ql.Settings.instance().evaluationDate = ql.Date(7,5,2019)
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> qlDates = [ql.Date(dt, '%d-%m-%Y') for dt in dates]
>>>>>>>>
>>>>>>>> dayCounter = ql.Actual360()
>>>>>>>>
>>>>>>>> curve = ql.DiscountCurve(qlDates, dfs, dayCounter,
>>>>>>>> ql.NullCalendar())
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> forwardStart = ql.Date(15,6,2020)
>>>>>>>>
>>>>>>>> forwardEnd = ql.Date(15,12,2020)
>>>>>>>>
>>>>>>>> fwd = curve.forwardRate(forwardStart, forwardEnd, dayCounter,
>>>>>>>>
>>>>>>>> ql.Compounded, ql.Annual).rate()
>>>>>>>>
>>>>>>>> print(fwd)
>>>>>>>>
>>>>>>>> -0.0019082224391586688
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> yts = ql.YieldTermStructureHandle(curve)
>>>>>>>>
>>>>>>>> schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2021),
>>>>>>>>
>>>>>>>> ql.Period('6m'))
>>>>>>>>
>>>>>>>> index = ql.Euribor6M(yts)
>>>>>>>>
>>>>>>>> bond = ql.FloatingRateBond(2,100, schedule, ql.Euribor6M(yts),
>>>>>>>>
>>>>>>>> ql.Actual360())
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> for dt in schedule:
>>>>>>>>
>>>>>>>> print(dt, index.fixing(dt))
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> June 15th, 2020 -0.00190201607110241
>>>>>>>>
>>>>>>>> December 15th, 2020 -0.001253382120767248
>>>>>>>>
>>>>>>>> June 15th, 2021 -0.00039680612008295636
>>>>>>>>
>>>>>>>> On 8 Oct 2020 Thu at 12:21 David Duarte <nh...@gm...> wrote:
>>>>>>>>
>>>>>>>>> Are you using c++, python or excel?
>>>>>>>>>
>>>>>>>>> Since you already have a yield curve, you can build the object by
>>>>>>>>> inputting spot rates (ZeroCurve class) or discount factors (DiscountCurve).
>>>>>>>>>
>>>>>>>>> Here is an example using python:
>>>>>>>>>
>>>>>>>>> dates = [
>>>>>>>>> '07-05-2019', '11-11-2019', '09-12-2019', '09-01-2020',
>>>>>>>>> '10-02-2020', '09-03-2020', '09-04-2020', '11-05-2020', '09-06-2020',
>>>>>>>>> '09-07-2020', '10-08-2020', '09-09-2020', '09-10-2020',
>>>>>>>>> '09-11-2020', '10-05-2021', '09-05-2022', '09-05-2023', '09-05-2024']
>>>>>>>>>
>>>>>>>>> dfs = [
>>>>>>>>> 1.000000, 1.001185, 1.001352, 1.001561, 1.001766, 1.001941,
>>>>>>>>> 1.002146, 1.002355, 1.002534,
>>>>>>>>> 1.002712, 1.002897, 1.003069, 1.003232, 1.003395, 1.004146,
>>>>>>>>> 1.004549, 1.003148, 0.999840]
>>>>>>>>>
>>>>>>>>> ql.Settings.instance().evaluationDate = ql.Date(7,5,2019)
>>>>>>>>> qlDates = [ql.Date(dt, '%d-%m-%Y') for dt in dates]
>>>>>>>>> dayCounter = ql.Actual360()
>>>>>>>>> curve = ql.DiscountCurve(qlDates, dfs, dayCounter,
>>>>>>>>> ql.NullCalendar())
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> To get the forward rates, you can use the "forwardRate" method
>>>>>>>>> from the curve:
>>>>>>>>>
>>>>>>>>> forwardStart = ql.Date(15,6,2020)
>>>>>>>>> forwardEnd = ql.Date(15,12,2020)
>>>>>>>>> fwd = curve.forwardRate(forwardStart, forwardEnd, dayCounter,
>>>>>>>>> ql.Compounded, ql.Annual).rate()
>>>>>>>>> print(fwd)
>>>>>>>>>
>>>>>>>>> or build the floating rate bond object and inspect the rate on the
>>>>>>>>> cashflows:
>>>>>>>>>
>>>>>>>>> yts = ql.YieldTermStructureHandle(curve)
>>>>>>>>> schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2021),
>>>>>>>>> ql.Period('6m'))
>>>>>>>>> index = ql.Euribor6M(yts)
>>>>>>>>> bond = ql.FloatingRateBond(2,100, schedule, ql.Euribor6M(yts),
>>>>>>>>> ql.Actual360())
>>>>>>>>>
>>>>>>>>> for cf in map(ql.as_coupon, bond.cashflows()):
>>>>>>>>> if cf:
>>>>>>>>> print(cf.accrualStartDate().ISO(),
>>>>>>>>> cf.accrualStartDate().ISO(), f"{cf.rate():.3%}")
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> or even get the rate from the index for given set of dates:
>>>>>>>>>
>>>>>>>>> for dt in schedule:
>>>>>>>>> print(dt, index.fixing(dt))
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Thu, 8 Oct 2020 at 06:39, isilay erol <ero...@gm...>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Dear Luigi,
>>>>>>>>>>
>>>>>>>>>> I just met with quantlib.
>>>>>>>>>>
>>>>>>>>>> I try to understand from the examples how cash flows of floating
>>>>>>>>>> rate bonds are created.
>>>>>>>>>>
>>>>>>>>>> But in the examples, I always see that yield curves are
>>>>>>>>>> established from scratch.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I want to calculate forward rates and forward rate coupons with
>>>>>>>>>> the yield curve which I already have.
>>>>>>>>>>
>>>>>>>>>> (I don't want to construct a yield curve from scratch again - I
>>>>>>>>>> have a zero coupon yield curve)
>>>>>>>>>>
>>>>>>>>>> And this way I want to create the cash flows of the floating
>>>>>>>>>> bond. But I could not understand how I could do this.
>>>>>>>>>>
>>>>>>>>>> Can you help me on this issue?
>>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> QuantLib-users mailing list
>>>>>>>>>> Qua...@li...
>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/quantlib-users
>>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>> QuantLib-users mailing list
>>>>>> Qua...@li...
>>>>>> https://lists.sourceforge.net/lists/listinfo/quantlib-users
>>>>>>
>>>>> _______________________________________________
>>> QuantLib-users mailing list
>>> Qua...@li...
>>> https://lists.sourceforge.net/lists/listinfo/quantlib-users
>>>
>> _______________________________________________
> QuantLib-users mailing list
> Qua...@li...
> https://lists.sourceforge.net/lists/listinfo/quantlib-users
>
|