2017-02-13 6 views
2

これはルーキーミスであると推測されるQuantLibの新機能です。この強力なライブラリを知ることを楽しんだので、著者と貢献者に感謝します!FloatingRateBond for FloorのQuantLibを使用してFloorRateBondを計算する

Floorの引数がない場合、私はFloatingRateBondの金額を生成することができません。なぜ、Floorの引数が含まれていれば、値札を必要とするのか分かりません。私は、フロアの追加は固定値ごとに分を提供するに過ぎないと思います。

FloatingRateBondキャッシュフローがフロアを使用している間に動作しているかどうかを確認したいと考えました。もしそうなら、誰かが私が迷子になっている場所に気づくことができれば。前もって感謝します!

Iは、あらかじめパッケージインストーラ(QuantLib-のPython-1.8.win-AMD64-py3.5.msi)を介してインストールされたWindows上でQuantLib 1.8を使用しています。エラーが発生したのはここ

です:

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クラスのコンストラクタを参照してください。

通常、キャップとフロアの市場価格ではボラティリティがブートストラップされていますが、その作成手順は複雑です(C++の例ではthese testsを参照)。必要なクラスがすべてエクスポートされているかどうかはわかりません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

おかげで、ルイージ、pricerが必要な理由のための明確かつ簡潔な背景説明のために、次の示唆しますステップ。 QuantLibで多くの楽しみを持っているので、すべての助けに感謝します! – user402078

関連する問題