Quantlib Облигация с плавающей ставкой с известным первым денежным потоком и прогнозируемыми денежными потоками, равными

Я пытаюсь оценить облигацию с плавающей ставкой, и у меня уже есть кривая дисконта, построенная с помощью Quantlib на C ++. Теперь я хотел бы использовать класс FloatingRateBond и создать набор денежных потоков, в которых известен первый денежный поток (учитывая, что индекс, связанный с этим денежным потоком, был известен на последнюю дату сброса) и прогнозировать оставшиеся денежные средства. потоки с использованием текущего индекса.

Чтобы сделать его более наглядным, предположим, что ежегодные платежи и что индекс на последнюю дату сброса был 1%, а маржа сброса — 1%. Тогда первый денежный поток будет примерно 2%. Теперь предположим, что сегодняшний индекс равен 2%, тогда я хочу, чтобы все оставшиеся денежные потоки составляли 3% (с соответствующими корректировками из соглашения по количеству дней и соглашения о рабочих днях).

Как я могу создать такую ​​структуру денежного потока для экземпляра класса FloatingRateBond?

0

Решение

Сначала я быстро пройдусь по созданию связи, скопировав некоторый код из примера связей в выпуске QuantLib (также, отказ от ответственности: я не пытался скомпилировать код ниже). Для получения более подробной информации о задействованных классах см. Документацию QuantLib.

Давайте предположим, ежегодные платежи, как вы сказали:

Schedule schedule(startDate, maturityDate, Period(Annual),
calendar, convention, convention,
DateGeneration::Backward, true);

и для иллюстрации предположим, что мы будем использовать индекс доллара США Libor. Его будущее исправление — прогноз, основанный на структуре сроков процентной ставки, которую мы установим позже.

RelinkableHandle<YieldTermStructure> liborTermStructure;
boost::shared_ptr<IborIndex> libor(
new USDLibor(Period(1,Years),liborTermStructure));

Теперь создайте облигацию, добавив маржу в качестве спреда по ставке LIBOR:

FloatingRateBond bond(settlementDays, faceAmount,
schedule, libor, dayCounter,
convention, fixingDays,
// gearings
std::vector<Real>(1, 1.0),
// spreads
std::vector<Rate>(1, 0.001));

Теперь, чтобы получить купоны, которые вы хотите, вы просто установите соответствующие рыночные данные. Чтобы установить ставку первого денежного потока, сохраните прошедшую фиксацию индекса Libor:

libor->addFixing(resetDate, 0.01);

И чтобы установить будущие денежные потоки, создайте плоскую кривую процентных ставок с желаемой ставкой (учитывая соглашения, чтобы они соответствовали таковым из индекса Libor):

boost::shared_ptr<YieldTermStructure> flatRate(
new FlatForward(today, 0.01, dayCounter, Simple, Annual));
liborTermStructure.linkTo(flatRate);

(Вы не обязательно ограничены фиксированной ставкой; если вы можете запустить кривую Либора, вы можете использовать ее для получения реалистичных оценок будущих купонов.)

На этом этапе вы сможете извлечь купоны на облигации и убедиться, что они соответствуют ожиданиям:

std::vector<boost::shared_ptr<CashFlow> > cashflows = bond.cashflows();
for (std::size_t i=0; i < cashflows.size(); ++i)
std::cout << cashflows[i]->date() << "    "<< cashflows[i]->amount() << "\n";

Если вы также хотите вызвать методы, такие как bond.cleanPrice()Вам необходимо сообщить облигации, как дисконтировать денежные потоки:

RelinkableHandle<YieldTermStructure> discountingTermStructure;
boost::shared_ptr<PricingEngine> bondEngine(
new DiscountingBondEngine(discountingTermStructure));
bond.setPricingEngine(bondEngine);

Вы можете использовать для дисконтирования ту же кривую, которую вы используете для прогнозирования …

discountingTermStructure.linkTo(flatRate);

…или создайте и используйте другой.

2

Другие решения


По вопросам рекламы [email protected]