2013-03-07 23 views
5

Tôi đang cố gắng định giá một trái phiếu lãi suất thả nổi rất cơ bản trong python bằng cách sử dụng trình bao bọc SWIG Quantlib (v1.2). Tôi đã sửa đổi ví dụ đi kèm với tài liệu.Đặt giá một trái phiếu nổi trong quantlib bằng cách sử dụng Python

Trái phiếu của tôi có thời hạn 4 năm. Các libor được thiết lập để 10% và sự lây lan của trái phiếu là 0. Câu hỏi của tôi là nếu tôi giảm giá với tỷ lệ 10%, tại sao không phải là PV của trái phiếu 100? Tôi nhận được một giá trị 99,54.

Cảm ơn!

from QuantLib import * 

frequency_enum, settle_date = 4, Date(5, 1, 2010) 
maturity_date = Date(5, 1, 2014) 
face_amount = 100.0 
settlement_days = 0 
fixing_days = 0 

calendar = NullCalendar() 
settle_date = calendar.adjust(settle_date) 
todays_date = calendar.advance(settle_date, -fixing_days, Days) 
Settings.instance().evaluationDate = todays_date 

rate = 10.0/100.0 

flat_forward = FlatForward(settle_date, 
          rate, 
          Thirty360(), 
          Compounded, 
          frequency_enum) 

discounting_term_structure = RelinkableYieldTermStructureHandle(flat_forward) 
index_term_structure = RelinkableYieldTermStructureHandle(flat_forward) 

index = USDLibor(Period(3, Months), index_term_structure) 

schedule = Schedule(settle_date, 
        maturity_date, Period(frequency_enum), 
        NullCalendar(), 
        Unadjusted, Unadjusted, 
        DateGeneration.Forward, False) 

floating_bond = FloatingRateBond(settlement_days, 
           face_amount, 
           schedule, 
           index, 
           Thirty360(), 
           Unadjusted, 
           fixing_days, 
           [], # Gearings 
           [0], # Spreads 
           [],  # Caps 
           [],  # Floors 
           False, # Fixing in arrears 
           face_amount, 
           settle_date) 

bond_engine = DiscountingBondEngine(discounting_term_structure) 
floating_bond.setPricingEngine(bond_engine) 

# coupon pricers 
pricer = BlackIborCouponPricer() 

volatility = 0.0 
vol = ConstantOptionletVolatility(settlement_days, 
            calendar, 
            Unadjusted, 
            volatility, 
            Thirty360()) 

pricer.setCapletVolatility(OptionletVolatilityStructureHandle(vol)) 
setCouponPricer(floating_bond.cashflows(), pricer) 

print floating_bond.NPV(), floating_bond.cleanPrice(), floating_bond.dirtyPrice() 

Trả lời

4

Tỷ lệ phiếu thưởng được cố định bằng bộ đếm USDLibor ngày (có nghĩa là, Thực tế/360) không khớp với bộ đếm ngày thanh toán bạn đã cung cấp (30/360). Bạn có thể xem nó bằng cách kiểm tra các phiếu giảm giá:

cfs = floating_bond.cashflows() 
coupons = [ as_coupon(c) for c in cfs[:-1] ] # the last one is the redemption 
print [ (c.rate(), c.accrualPeriod()) for c in coupons ] 

cung cấp cho bạn T = 0,25 cho tất cả phiếu giảm giá nhưng tỷ lệ thấp hơn 10%.

Để nhận được mức giá bạn muốn, bạn phải khớp với tỷ lệ và thời gian tích lũy. Một cách là vượt qua Actual360() làm bộ đếm ngày trái phiếu, với giá 100.002 trên máy của tôi (tôi chưa điều tra thêm, nhưng sự khác biệt có thể là do ngày kết thúc cho việc sửa LIBOR, được xác định bằng cách sử dụng lịch USD và có thể không khớp chính xác với phần cuối của phiếu thưởng). Một cách khác là tạo chỉ mục LIBOR tùy chỉnh với bộ đếm ngày 30/360 bên trong; Tôi đã không thử bản thân mình, nhưng bạn có thể làm điều đó bằng cách tạo ra một thể hiện thích hợp của lớp IborIndex.

+2

Cảm ơn rất nhiều. Tôi đã tạo chỉ mục tùy chỉnh và tôi nhận được kết quả chính xác là 100.0! Chỉ mục tùy chỉnh là: 'index = IborIndex ('USD Libor', Period (3, Months), settlement_days, USDCurrency(), NullCalendar(), Unadjusted, False, Thirty360(), index_term_structure)' – ducky

Các vấn đề liên quan