2013-03-07 7 views
5

저는 Python에서 Quantlib (v1.2) SWIG 래퍼를 사용하여 매우 기본적인 변동 금리 본드의 가격을 책정하려고합니다. 설명서에 포함 된 예제를 수정했습니다.Python을 사용하여 quantlib의 가격 책정

내 채권은 4 년 만기입니다. libor는 10 %로 설정되고 채권의 스프레드는 0입니다. 제가 10 %의 비율로 할인한다면, 채권의 PV가 왜 100이 아닌가요? 나는 99.54의 가치를 얻고있다.

감사합니다.

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() 

답변

4

사용자가 제공 한 지불 일 카운터 (30/360)와 일치하지 않습니다 (/ 360 실제 즉,) 요금은 USDLibor 일 카운터를 사용하여 고정 된 쿠폰. 당신은 쿠폰을 검사하여 그것을 볼 수 있습니다 : T 모든 쿠폰 0.25 =하지만 10 % 이상의 비율이 낮은 당신을 제공

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 ] 

합니다.

원하는 가격을 얻으려면 요금과 발생 기간을 일치시켜야합니다. 한 가지 방법은 내 컴퓨터에 100.002의 가격을 제시하는 채권 일 카운터로 Actual360()을 전달하는 것입니다. (더 조사하지는 않았지만 불일치는 LIBOR 고정에 대한 종료일 때문일 수 있습니다. USD 달력과 정확히 일치하지 않을 수 있습니다). 또 다른 방법은 내부 30/360 일 카운터를 사용하여 맞춤 LIBOR 색인을 만드는 것입니다. 나는 이것을 직접 시도하지 않았지만 IborIndex 클래스의 적절한 인스턴스를 생성하여이를 수행 할 수 있습니다.

+2

고맙습니다. 맞춤 색인을 만들었고 정확한 결과는 100.0입니다! 사용자 정의 색인은 다음과 같습니다 :'index = IborIndex ('USD Libor', 기간 (3 개월), settlement_days, USDCurrency(), NullCalendar(), 조정되지 않음, False, Thirty360(), index_term_structure)' – ducky

관련 문제