Цены свопций в QuantLib - PullRequest
       17

Цены свопций в QuantLib

3 голосов
/ 16 января 2012

Я также опубликовал это на Уилмотте, не был уверен, что получит больше ответа.

Я относительно новичок в мире Quantlib (и C ++ ...), так что, возможно, это совершенно очевидно. Я пытаюсь выяснить, может ли Quantlib оценить форвардные ванильные свопинги премиум-класса (дисконтирование OIS, кривая 3 мл для оценки). Все, что я вижу в Quantlib в файлах Swaption, это входные данные для одной структуры терминов для дисконтирования. Использует ли он это также для оценки? Или есть способ переопределить его, чтобы я мог ввести две кривые.

Буду очень признателен за любую помощь, примеры и т. Д. (И это сэкономит мне много времени, глядя на одни и те же файлы в надежде, что что-то выскакивает на меня ...)!

Большое спасибо

1 Ответ

8 голосов
/ 17 января 2012

Это зависит.Если вы хотите оценить бермудские свопции, вам не повезло;QuantLib может оценивать их только на дереве, и нет никакой возможности использовать две кривые.

Если вы хотите оценить европейские свопсии, вы можете использовать две кривые в формуле Блэка, хотя я согласен, что это не очевидночтобы выяснить это, посмотрев на код.Как вы, наверное, уже видели, вам нужно создать экземпляр как инструмента (класс Swaption), так и соответствующего движка (класс BlackSwaptionEngine).Конструктор BlackSwaptionEngine принимает кривую скидок помимо других аргументов, поэтому здесь вы пройдете кривую OIS.С другой стороны, конструктор Swaption принимает своп, лежащий в основе опции, в качестве экземпляра VanillaSwap.В свою очередь, конструктор VanillaSwap берет экземпляр IborIndex, представляющий индекс с плавающей ставкой, подлежащий оплате;и наконец, конструктор IborIndex берет кривую, которая будет использоваться для прогнозирования его фиксаций, так что это то место, где вы можете пройти кривую 3 мл.Подводя итог:

shared_ptr<IborIndex> libor(new GBPLibor(3*Months, forecastCurve));
shared_ptr<VanillaSwap> swap(new VanillaSwap(..., libor, ...));
shared_ptr<Instrument> swaption(new Swaption(swap, ...));
shared_ptr<PricingEngine> engine(new BlackSwaptionEngine(discountCurve, ...));
swaption->setPricingEngine(engine);
double price = swaption->NPV();

Также обратите внимание, что в текущей выпущенной версии (QuantLib 1.1) есть ошибка, которая заставляет его использовать неправильную кривую в некоторой точке во время вычислений.Вы захотите использовать версию 1.2, которая еще не выпущена, но может быть извлечена из хранилища Subversion по адресу https://quantlib.svn.sourceforge.net/svnroot/quantlib/branches/R01020x-branch/QuantLib.

...