2017-02-13 9 views
2

Очень новое для QuantLib, так что угадайте, что это ошибка новобранец. Наслаждался знакомством с этой мощной библиотекой, так что спасибо авторам и вкладчикам!Использование QuantLib для расчета денежных потоков для FloatingRateBond с полом

Я могу генерировать суммы для денежных потоков для FloatingRateBond без pricer, если нет аргумента в отношении пола, поэтому я не понимаю, почему включение аргумента floor потребовало бы pricer. Я бы подумал, что добавление пола просто обеспечит минимум для каждой фиксирующей величины.

Хотел бы посмотреть, не получил ли кто-то денежный поток FloatingRateBond, работая при использовании пола. И если так, если кто-нибудь может заметить, где я сбиваюсь с пути. Заранее спасибо!

Я использую QuantLib 1.8 для окон, установленных через предварительно установленный установщик (QuantLib-Python-1.8.win-amd64-py3.5.msi).

Вот где происходит ошибка:

File "C:/src/misc/generate_cashflows.py", line 138, in generate_cashflow 
    print(cf.amount()) 
    File "C:\lib\site-packages\QuantLib\QuantLib.py", line 8844, in amount 
    return _QuantLib.CashFlow_amount(self) 
RuntimeError: pricer not set 

Конкретный код ниже:

ql_first_day, ql_first_month, ql_first_year = first_payment_date.day, first_payment_date.month, first_payment_date.year 

ql_first_date = QuantLib.Date(ql_first_day, ql_first_month, ql_first_year) 

maturity_month, maturity_day, maturity_year = maturity.month, maturity.day, maturity.year 
ql_maturity_date = QuantLib.Date(maturity_day, maturity_month, maturity_year) 



ql_issue_day, ql_issue_month, ql_issue_year = issue_date.day, issue_date.month, issue_date.year 
q1_settle_date = QuantLib.Date(ql_issue_day, ql_issue_month, ql_issue_year) 

fixing_days = 0 

calendar = QuantLib.UnitedStates() 
ql_settle_date = calendar.adjust(q1_settle_date) 
todays_date = calendar.advance(ql_settle_date, -fixing_days, QuantLib.Days) 
QuantLib.Settings.instance().evaluationDate = todays_date 

ql_schedule = QuantLib.Schedule(ql_settle_date, 
        ql_maturity_date, QuantLib.Period(ql_frequency_enum), 
        QuantLib.UnitedStates(), 
        QuantLib.Following, QuantLib.Following, 
        QuantLib.DateGeneration.Forward, False, ql_first_date) 

ql_forecast_curve = QuantLib.RelinkableYieldTermStructureHandle() 
today = datetime.datetime.today() 
calc_date = QuantLib.Date(today.day, today.month, today.year) 
QuantLib.Settings.instance().evaluationDate = calc_date 

day_count = QuantLib.Thirty360() 

# setup swaps 
calendar = QuantLib.UnitedStates() 
swFixedLegFrequency = QuantLib.Annual 
swFixedLegConvention = QuantLib.Unadjusted 
swFixedLegDayCounter = QuantLib.Thirty360() 
swFloatingLegIndex = QuantLib.USDLibor(QuantLib.Period(3, QuantLib.Months)) 

swap_raw = [ 
    (1, 0.01251), 
    (2, 0.01505), 
    (3, 0.01701), 
    (5, 0.01972), 
    (7, 0.02158) 
] 

swap_rates = [] 

for year, rate in swap_raw: 
    swap_rates.append(QuantLib.SwapRateHelper(
     QuantLib.QuoteHandle(QuantLib.SimpleQuote(rate)), 
     QuantLib.Period(year, QuantLib.Years), 
     calendar, 
     swFixedLegFrequency, 
     swFixedLegConvention, 
     swFixedLegDayCounter, 
     swFloatingLegIndex 
    )) 

swap_curve = QuantLib.PiecewiseFlatForward(calc_date, swap_rates, day_count) 

ql_forecast_curve.linkTo(swap_curve) 

ql_index = QuantLib.USDLibor(period, ql_forecast_curve) 

settlement_days = 0 
face_amount = 100 

ql_bond = QuantLib.FloatingRateBond(settlement_days, #settlementDays 
    face_amount, # faceAmount 
    ql_schedule, 
    ql_index, 
    QuantLib.Thirty360(), 
    gearings = [], 
    spreads = [libor_spread], 
    caps = [], 
    floors = [.01] 
) 

ql_discount_curve = QuantLib.RelinkableYieldTermStructureHandle() 
settlement_date = QuantLib.Date(9, 2, 2017) 
flatForward = QuantLib.FlatForward(
    settlement_date, 
    .02, 
    QuantLib.ActualActual(QuantLib.ActualActual.Bond), 
    QuantLib.Compounded, 
    QuantLib.Semiannual) 
ql_discount_curve.linkTo(flatForward) 
bondEngine = QuantLib.DiscountingBondEngine(ql_discount_curve) 
ql_bond.setPricingEngine(bondEngine) 

for cf in ql_bond.cashflows(): 
    c = QuantLib.as_floating_rate_coupon(cf) 
    print(cf.amount()) 

ответ

1

Теория первая: при определении стоимости купона с пола, вы не можете просто взять ожидаемый LIBOR от вашей кривой прогноза и взять минимум между этим и полом. Вместо этого вам нужно принять ожидаемое значение минимума между ставкой и полом, и, к сожалению, E[min(R,F)] - это не то же самое, что и min(E[R],F). Так что нет, пол не просто дает минимум; вам нужна другая формула для оценки ожидаемого выигрыша.

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

Как правило, волатильность загружается на рыночных котировках для крышек и этажей, но процедура ее создания является довольно сложной (см. these tests для примера на C++), я не уверен, что все необходимые классы экспортируются на Python, и вам будет лучше спросить об этом на QuantLib mailing list.

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

volatility = 0.10; 
vol = QuantLib.ConstantOptionletVolatility(settlement_days, 
              calendar, 
              QuantLib.ModifiedFollowing, 
              volatility, 
              day_count) 

pricer = QuantLib.BlackIborCouponPricer(
    QuantLib.OptionletVolatilityStructureHandle(vol)) 
QuantLib.setCouponPricer(ql_bond.cashflows(), pricer) 

Значение выше должно позволить вам получить результат; но, конечно же, я вытащил 15% -ную волатильность из шляпы, и она не даст вам реальных рыночных значений ...

+0

Спасибо, Луиджи, за четкое и краткое объяснение причин, почему нужен ценник и предлагающий следующий шаги. Имея много удовольствия с QuantLib, оцените всю помощь! – user402078

 Смежные вопросы

  • Нет связанных вопросов^_^