金融工具
固定收益
远期合约
远期利率协议
- class ql.ForwardRateAgreement(valueDate, maturityDate, position, strikeForward, notional, iborIndex, discountCurve=ql.YieldTermStructureHandle())
fra = ql.ForwardRateAgreement( ql.Date(15,6,2020), ql.Date(15,12,2020), ql.Position.Long, 0.01, 1e6, ql.Euribor6M(yts), yts )
- .NPV()
- .businessDayConvention()
- .calendar()
- .dayCounter()
- .discountCurve()
- .fixingDate()
- .forwardRate()
- .forwardValue()
- .impliedYield(underlyingSpotValue, forwardValue, settlementDate, compoundingConvention, dayCounter)
- .incomeDiscountCurve()
- .isExpired()
- .settlementDate()
- .spotIncome(yts)
- .spotValue()
FixedRateBondForward
- class ql.FixedRateBondForward(valueDate, maturityDate, Position::Type, strike, settlementDays, dayCounter, calendar, businessDayConvention, FixedRateBond, yieldTermStructure=ql.YieldTermStructureHandle(), incomeDiscountCurve=ql.YieldTermStructureHandle())
持仓:
ql.Position.Long
ql.Position.Short
valueDate = ql.Date(24, 6, 2020) maturityDate = ql.Date(31, 5, 2032) position = ql.Position.Long strike = 100 settlementDays = 2 dayCounter = ql.Actual360() calendar = ql.TARGET() businessDayConvention = ql.Following bond = ql.FixedRateBond(2, ql.TARGET(), 100.0, ql.Date(31, 5, 2032), ql.Date(30, 5, 2035), ql.Period('1Y'), [0.05], ql.ActualActual()) bond.setPricingEngine(engine) fwd = ql.FixedRateBondForward( valueDate, maturityDate, position, strike, settlementDays, dayCounter , calendar, businessDayConvention, bond, yts, yts)
债券
债券
赎回和到期日是根据票息数据计算的(如果有的话)。因此,传递的现金流中不得包含赎回金额。
- class ql.Bond(settlementDays, calendar, issueDate, coupons)
start = ql.Date(15,12,2019) maturity = ql.Date(15,12,2020) schedule = ql.MakeSchedule(start, maturity, ql.Period('6M')) interest = ql.FixedRateLeg(schedule, ql.Actual360(), [100.], [0.05]) bond = ql.Bond(0, ql.TARGET(), start, interest)
- .bondYield(dayCounter, compounding, frequency, accuracy=1.0e-8, maxEvaluations=100)
- .bondYield(cleanPrice, dayCounter, compounding, frequency, settlementDate=Date, accuracy=1.0e-8, maxEvaluations=100)
bond.bondYield(100, ql.Actual360(), ql.Compounded, ql.Annual)
- .dirtyPrice()
bond.dirtyPrice()
- .dirtyPrice(yield, dayCount, compounding, frequency)
bond.dirtyPrice(0.05, ql.Actual360(), ql.Compounded, ql.Annual)
零息债券
- ql.ZeroCouponBond(settlementDays, calendar, faceAmount, maturityDate)
bond = ql.ZeroCouponBond(2, ql.TARGET(), 100, ql.Date(20,6,2020))
FixedRateBond
- ql.FixedRateBond(settlementDays, calendar, faceAmount, startDate, maturityDate, tenor, coupon, paymentConvention)
- ql.FixedRateBond(settlementDays, faceAmount, schedule, coupon, paymentConvention)
bond = ql.FixedRateBond(2, ql.TARGET(), 100.0, ql.Date(15,12,2019), ql.Date(15,12,2024), ql.Period('1Y'), [0.05], ql.ActualActual(ql.ActualActual.Bond))
AmortizingFixedRateBond
- ql.AmortizingFixedRateBond(settlementDays, notionals, schedule, coupons, accrualDayCounter, paymentConvention=Following, issueDate=Date())
notionals = [100,100,100,50]
schedule = ql.MakeSchedule(ql.Date(25,1,2018), ql.Date(25,1,2022), ql.Period('1y'))
bond = ql.AmortizingFixedRateBond(0, notionals, schedule, [0.03], ql.Thirty360(ql.Thirty360.USA))
浮动利率债券
- ql.FloatingRateBond(settlementDays, faceAmount, schedule, index, dayCounter, paymentConvention)
schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2022), ql.Period('6m'))
index = ql.Euribor6M()
bond = ql.FloatingRateBond(2,100, schedule, index, ql.Actual360(), spreads=[0.01])
分期偿还浮动利率债券
- ql.FloatingRateBond(settlementDays, notionals, schedule, index, dayCounter)
notional = [100, 50]
schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2022), ql.Period('1Y'))
index = ql.Euribor6M()
bond = ql.AmortizingFloatingRateBond(2, notional, schedule, index, ql.ActualActual(ql.ActualActual.Bond))
CMS利率债券
- ql.CmsRateBond(settlementDays, faceAmount, schedule, index, dayCounter, paymentConvention, fixingDays, gearings, spreads, caps, floors)
schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2022), ql.Period('1Y'))
index = ql.EuriborSwapIsdaFixA(ql.Period('10y'))
bond = ql.CmsRateBond(2, 100, schedule, index, ql.Actual360(), ql.ModifiedFollowing, fixingDays=2, gearings=[1], spreads=[0], caps=[], floors=[])
可赎回债券
- ql.CallableFixedRateBond(settlementDays, faceAmount, schedule, coupons, accrualDayCounter, paymentConvention, redemption, issueDate, putCallSchedule)
schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2022), ql.Period('1Y'))
putCallSchedule = ql.CallabilitySchedule()
my_price = ql.BondPrice(100, ql.BondPrice.Clean)
putCallSchedule.append(
ql.Callability(my_price, ql.Callability.Call, ql.Date(15,6,2021))
)
bond = ql.CallableFixedRateBond(2, 100, schedule, [0.01], ql.Actual360(), ql.ModifiedFollowing, 100, ql.Date(15,6,2020), putCallSchedule)
可转换债券
债券函数
bond = ql.FixedRateBond(
2, ql.TARGET(), 100.0,
ql.Date(15,12,2019), ql.Date(15,12,2024), ql.Period('1Y'),
[0.05], ql.ActualActual(ql.ActualActual.Bond))
日期检查器
ql.BondFunctions.startDate(bond)
ql.BondFunctions.maturityDate(bond)
ql.BondFunctions.isTradable(bond)
现金流检查器
ql.BondFunctions.previousCashFlowDate(bond)
ql.BondFunctions.previousCashFlowDate(bond, ql.Date(15,12,2020))
ql.BondFunctions.previousCashFlowAmount(bond)
ql.BondFunctions.previousCashFlowAmount(bond, ql.Date(15,12,2020))
ql.BondFunctions.nextCashFlowDate(bond)
ql.BondFunctions.nextCashFlowDate(bond, ql.Date(15,12,2020))
ql.BondFunctions.nextCashFlowAmount(bond)
ql.BondFunctions.nextCashFlowAmount(bond, ql.Date(15,12,2020))
息票检查器
ql.BondFunctions.previousCouponRate(bond)
ql.BondFunctions.nextCouponRate(bond)
ql.BondFunctions.accrualStartDate(bond)
ql.BondFunctions.accrualEndDate(bond)
ql.BondFunctions.accrualPeriod(bond)
ql.BondFunctions.accrualDays(bond)
ql.BondFunctions.accruedPeriod(bond)
ql.BondFunctions.accruedDays(bond)
ql.BondFunctions.accruedAmount(bond)
收益率期限结构
crv = ql.FlatForward(2, ql.TARGET(), 0.04, ql.Actual360())
ql.BondFunctions.cleanPrice(bond, crv)
ql.BondFunctions.bps(bond, crv)
ql.BondFunctions.atmRate(bond, crv)
收益率(又称内部收益率,即IRR)函数
rate = ql.InterestRate(0.05, ql.Actual360(), ql.Compounded, ql.Annual)
ql.BondFunctions.cleanPrice(bond, rate)
ql.BondFunctions.bps(bond, rate)
ql.BondFunctions.duration(bond, rate)
ql.BondFunctions.convexity(bond, rate)
ql.BondFunctions.basisPointValue(bond, rate)
ql.BondFunctions.yieldValueBasisPoint(bond, rate)
Z利差函数
crv = ql.FlatForward(2, ql.TARGET(), 0.04, ql.Actual360())
ql.BondFunctions.zSpread(bond, 101, crv, ql.Actual360(), ql.Compounded, ql.Annual)
互换
VanillaSwap
- ql.VanillaSwap(type, nominal, fixedSchedule, fixedRate, fixedDayCount, floatSchedule, index, spread, floatingDayCount)
类型:
ql.VanillaSwap.Payer
ql.VanillaSwap.Receiver
calendar = ql.TARGET()
start = ql.Date(17,6,2019)
maturity = calendar.advance(start, ql.Period('5y'))
fixedSchedule = ql.MakeSchedule(start, maturity, ql.Period('1Y'))
floatSchedule = ql.MakeSchedule(start, maturity, ql.Period('6M'))
swap = ql.VanillaSwap(
ql.VanillaSwap.Payer, 100,
fixedSchedule, 0.01, ql.Thirty360(),
floatSchedule, ql.Euribor6M(), 0, ql.Actual360()
)
互换
- ql.Swap(firstLeg, secondLeg)
fixedSchedule = ql.MakeSchedule(start, maturity, ql.Period('1Y'))
fixedLeg = ql.FixedRateLeg(fixedSchedule, ql.Actual360(), [100], [0.01])
floatSchedule = ql.MakeSchedule(start, maturity, ql.Period('6M'))
floatLeg = ql.IborLeg([100], floatSchedule, ql.Euribor6M(), ql.Actual360())
swap = ql.Swap(fixedLeg, floatLeg)
创建普通利率互换
- ql.MakeVanillaSwap(tenor, index, fixedRate, forwardStart)
可选参数:
固定利率计息天数计算方式
名义金额
receiveFixed,
互换类型
结算天数
生效日期
终止日期
日期生成规则
固定期限
固定收益日历
固定利率端惯例
固定利率计息天数
浮动利率期限
浮动利率日历
浮动利率惯例
浮动利率计息天数
浮动利率利差
贴现期限结构
定价引擎
固定利率端终止日期惯例
固定期限日期生成规则
固定期限月末
固定利率端首个日期
固定利率端的倒数第二个日期,
浮动利率终止日期惯例
浮动利率计息日规则
浮动利率端月末调整
浮动利率首个计息日
浮动利率倒数第二个日期
tenor = ql.Period('5y')
index = ql.Euribor6M()
fixedRate = 0.05
forwardStart = ql.Period("2D")
swap = ql.MakeVanillaSwap(tenor, index, fixedRate, forwardStart, Nominal=100)
swap = ql.MakeVanillaSwap(tenor, index, fixedRate, forwardStart, swapType=ql.VanillaSwap.Payer)
分期偿还互换
calendar = ql.TARGET()
start = ql.Date(17,6,2019)
maturity = calendar.advance(start, ql.Period('2y'))
fixedSchedule = ql.MakeSchedule(start, maturity, ql.Period('1Y'))
fixedLeg = ql.FixedRateLeg(fixedSchedule, ql.Actual360(), [100, 50], [0.01])
floatSchedule = ql.MakeSchedule(start, maturity, ql.Period('6M'))
floatLeg = ql.IborLeg([100, 100, 50, 50], floatSchedule, ql.Euribor6M(), ql.Actual360())
swap = ql.Swap(fixedLeg, floatLeg)
浮动利率互换
ql.FloatFloatSwap(ql.VanillaSwap.Payer,
[notional] * (len(float3m)-1),
[notional] * (len(float6m)-1),
float3m,
index3m,
ql.Actual360(),
float6m,
index6m,
ql.Actual360(), False, False,
[1] * (len(float3m)-1),
[spread] * (len(float3m)-1))
资产互换
- ql.AssetSwap(payFixed, bond, cleanPrice, index, spread)
- ql.AssetSwap(payFixed, bond, cleanPrice, index, spread, schedule, dayCount, bool)
payFixedRate = True
bond = ql.FixedRateBond(2, ql.TARGET(), 100.0, ql.Date(15,12,2019), ql.Date(15,12,2024),
ql.Period('1Y'), [0.05], ql.ActualActual()
)
bondCleanPrice = 100
index = ql.Euribor6M()
spread = 0.0
ql.AssetSwap(payFixedRate, bond, bondCleanPrice, index, spread, ql.Schedule(), ql.ActualActual(), True)
隔夜指数互换
- ql.OvernightIndexedSwap(swapType, nominal, schedule, fixedRate, fixedDC, overnightIndex)
或名义金额数组
- ql.OvernightIndexedSwap(swapType, nominals, schedule, fixedRate, fixedDC, overnightIndex)
可选参数:
利差=0.0
支付延迟=0
paymentAdjustment=ql.Following()
paymentCalendar=ql.Calendar()
telescopicValueDates=false
类型:
ql.OvernightIndexedSwap.Receiver
ql.OvernightIndexedSwap.Receiver
swapType = ql.OvernightIndexedSwap.Receiver
nominal = 100
schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2021), ql.Period('1Y'), calendar=ql.TARGET())
fixedRate = 0.01
fixedDC = ql.Actual360()
overnightIndex = ql.Eonia()
ois_swap = ql.OvernightIndexedSwap(swapType, nominal, schedule, fixedRate, fixedDC, overnightIndex)
创建OIS
- ql.MakeOIS(swapTenor, overnightIndex, fixedRate)
可选参数:
fwdStart=Period(0, Days)
receiveFixed=True,
swapType=OvernightIndexedSwap.Payer
名义值=1.0
结算天数=2
effectiveDate=None
terminationDate=None
dateGenerationRule=DateGeneration.Backward
支付频率=每年
paymentAdjustmentConvention=Following
支付延迟=0
支付日历=None
endOfMonth=True
fixedLegDayCount=None
隔夜利率利差=0.0
discountingTermStructure=None
telescopicValueDates=False
定价引擎=无
swapTenor = ql.Period('1Y')
overnightIndex = ql.Eonia()
fixedRate = 0.01
ois_swap = ql.MakeOIS(swapTenor, overnightIndex, fixedRate)
非标准互换
- ql.NonstandardSwap(swapType, fixedNominal, floatingNominal, fixedSchedule, fixedRate, fixedDayCount, floatingSchedule, iborIndex, gearing, spread, floatDayCount)
可选参数:
intermediateCapitalExchange = False
finalCapitalExchange = False,
paymentConvention = None
swapType = ql.VanillaSwap.Payer
fixedNominal = [100, 100]
floatingNominal = [100] * 4
fixedSchedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2022), ql.Period('1Y'))
fixedRate = [0.02] * 2
fixedDayCount = ql.Thirty360()
floatingSchedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(15,6,2022), ql.Period('6M'))
iborIndex = ql.Euribor6M()
gearing = [1.] * 4
spread = [0.] * 4
floatDayCount = iborIndex.dayCounter()
nonstandardSwap = ql.NonstandardSwap(
swapType, fixedNominal, floatingNominal,
fixedSchedule, fixedRate, fixedDayCount,
floatingSchedule, iborIndex, gearing, spread, floatDayCount)
利率互换期权
练习
ql.EuropeanExercise(start)
ql.AmericanExercise(earliestDate, latestDate)
ql.BermudanExercise(dates)
结算类型/方法
- ql.Settlement.Cash
ql.Settlement.CollateralizedCashPrice
ql.Settlement.ParYieldCurve
- ql.Settlement.Physical
ql.Settlement.PhysicalCleared
ql.Settlement.PhysicalOTC
利率互换期权
- ql.Swaption(swap, exercise, settlementType=ql.Settlement.Physical, settlementMethod=ql.Settlement.PhysicalOTC)
calendar = ql.TARGET()
today = ql.Date().todaysDate()
exerciseDate = calendar.advance(today, ql.Period('5y'))
exercise = ql.EuropeanExercise(exerciseDate)
swap = ql.MakeVanillaSwap(ql.Period('5y'), ql.Euribor6M(), 0.05, ql.Period('5y'))
swaption = ql.Swaption(swap, exercise)
swaption = ql.Swaption(swap, exercise, ql.Settlement.Cash, ql.Settlement.ParYieldCurve)
swaption = ql.Swaption(swap, exercise, ql.Settlement.Physical, ql.Settlement.PhysicalCleared)
非标准互换期权
浮动利率互换期权
利率上限与下限
上限
- ql.Cap(floatingLeg, exerciseRates)
schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(16,6,2022), ql.Period('6M'))
ibor_leg = ql.IborLeg([100], schedule, ql.Euribor6M())
strike = 0.01
cap = ql.Cap(ibor_leg, [strike])
利率下限
- ql.Floor(floatingLeg, exerciseRates)
schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(16,6,2022), ql.Period('6M'))
ibor_leg = ql.IborLeg([100], schedule, ql.Euribor6M())
strike = 0.00
floor = ql.Floor(ibor_leg, [strike])
领子期权
- ql.Collar(floatingLeg, capRates, floorRates)
schedule = ql.MakeSchedule(ql.Date(15,6,2020), ql.Date(16,6,2022), ql.Period('6M'))
ibor_leg = ql.IborLeg([100], schedule, ql.Euribor6M())
capStrike = 0.02
floorStrike = 0.00
collar = ql.Collar(ibor_leg, [capStrike], [floorStrike])
通胀
CPI债券
- ql.CPIBond(settlementDays, notional, growthOnly, baseCPI, contractObservationLag, inflationIndex, observationInterpolation, fixedSchedule, fixedRates, fixedDayCounter, fixedPaymentConvention)
calendar = ql.UnitedKingdom()
today = ql.Date(5,3,2008)
evaluationDate = calendar.adjust(today)
issue_date = calendar.advance(evaluationDate,-1, ql.Years)
maturity_date = ql.Date(2,9,2052)
settlementDays = 3
notional = 1000000
growthOnly = False
baseCPI = 206.1
contractObservationLag = ql.Period(3, ql.Months)
inflationIndex = ql.UKRPI(False)
observationInterpolation = ql.CPI.Flat
fixedSchedule = ql.MakeSchedule(issue_date, maturity_date, ql.Period(ql.Semiannual))
fixedRates = [0.1]
fixedDayCounter = ql.Actual365Fixed()
fixedPaymentConvention = ql.ModifiedFollowing
bond = ql.CPIBond(settlementDays,
notional,
growthOnly,
baseCPI,
contractObservationLag,
inflationIndex,
observationInterpolation,
fixedSchedule,
fixedRates,
fixedDayCounter,
fixedPaymentConvention)
CPISwap
- ql.CPISwap(swapType, nominal, subtractInflationNominal, spread, floatDayCount, schedule, floatPaymentConvention, fixingDays, floatIndex, fixedRate, baseCPI, fixedDayCount, schedule, fixedPaymentConvention, contractObservationLag, fixedIndex, observationInterpolation)
swapType = ql.CPISwap.Payer
nominal = 1e6
subtractInflationNominal = True
spread = 0.0
floatDayCount = ql.Actual365Fixed()
floatPaymentConvention = ql.ModifiedFollowing
fixingDays = 0;
floatIndex = ql.GBPLibor(ql.Period('6M'))
fixedRate = 0.1;
baseCPI = 206.1;
fixedDayCount = ql.Actual365Fixed()
fixedPaymentConvention = ql.ModifiedFollowing;
fixedIndex = ql.UKRPI(False);
contractObservationLag = ql.Period('3M')
observationInterpolation = ql.CPI.Linear
startDate = ql.Date(2,10,2007)
endDate = ql.Date(2,10,2052)
schedule = ql.MakeSchedule(startDate, endDate, ql.Period('6m'))
zisV = ql.CPISwap(
swapType, nominal, subtractInflationNominal, spread,
floatDayCount, schedule, floatPaymentConvention, fixingDays, floatIndex,
fixedRate, baseCPI, fixedDayCount, schedule, fixedPaymentConvention,
contractObservationLag, fixedIndex, observationInterpolation)
零息通胀互换
- ql.ZeroCouponInflationSwap(swapType, notional, start, maturity, calendar, BusinessDayConvention, DayCounter, fixedRate, ZeroInflationIndex, observationLag)
swapType = ql.ZeroCouponInflationSwap.Payer
calendar = ql.TARGET()
nominal = 1e6
startDate = ql.Date(11,1,2022)
endDate = ql.Date(11,1,2023)
fixedRate = 0.1;
dc = ql.Actual365Fixed()
inflationIndex = ql.EUHICPXT(True)
contractObservationLag = ql.Period(3, ql.Months)
bdc = ql.ModifiedFollowing
swap = ql.ZeroCouponInflationSwap(swapType, nominal, startDate, endDate, calendar, bdc, dc, fixedRate, inflationIndex, contractObservationLag)
年度通胀互换
- ql.YearOnYearInflationSwap(swapType, nominal, fixedSchedule, fixedRate, fixedDayCounter, yoySchedule, index, lag, spread, yoyDayCounter, paymentCalendar)
swapType = ql.YearOnYearInflationSwap.Payer
nominal = 1e6
startDate = ql.Date(2,10,2007)
endDate = ql.Date(2,10,2052)
fixedSchedule = ql.MakeSchedule(startDate, endDate, ql.Period('6m'))
fixedRate = 0.1;
fixedDayCounter = ql.Actual365Fixed()
yoySchedule = ql.MakeSchedule(startDate, endDate, ql.Period('6m'))
index = ql.YYEUHICP(False)
lag = ql.Period('3m')
spread = 0.0
yoyDayCounter = ql.Actual365Fixed()
paymentCalendar = ql.TARGET()
swap = ql.YearOnYearInflationSwap(swapType, nominal, fixedSchedule, fixedRate, fixedDayCounter, yoySchedule, index, lag, spread, yoyDayCounter, paymentCalendar)
同比通胀上限
YoYInflationFloor
YoYInflationCollar
信用
信用违约互换
- ql.CreditDefaultSwap(side, nominal, spread, cdsSchedule, convention, dayCounter)
side = ql.Protection.Seller
nominal = 10e6
spread = 34.6 / 10000
cdsSchedule = ql.MakeSchedule(ql.Date(20, 12, 2019), ql.Date(20, 12, 2024), ql.Period('3M'),
ql.Quarterly, ql.TARGET(), ql.Following, ql.Unadjusted, ql.DateGeneration.TwentiethIMM)
cds = ql.CreditDefaultSwap(side, nominal, spread, cdsSchedule, ql.Following, ql.Actual360())
信用违约互换期权
- ql.CdsOption(CreditDefaultSwap, exercise, knocksOut=true)
expiry = ql.Date(15,6,2020)
exercise = ql.EuropeanExercise(expiry)
ql.CdsOption(cds, exercise, True)
期权
普通期权
- ql.VanillaOption(payoff, europeanExercise)
行权类型:
ql.EuropeanExercise(date)
ql.AmericanExercise(最早日期, 最晚日期)
ql.BermudanExercise(dates)
ql.RebatedExercise
收益:
ql.Option.Call
ql.Option.Put
strike = 100.0
maturity = ql.Date(15,6,2025)
option_type = ql.Option.Call
payoff = ql.PlainVanillaPayoff(option_type, strike)
binaryPayoff = ql.CashOrNothingPayoff(option_type, strike, 1)
europeanExercise = ql.EuropeanExercise(maturity)
europeanOption = ql.VanillaOption(payoff, europeanExercise)
americanExercise = ql.AmericanExercise(ql.Date().todaysDate(), maturity)
americanOption = ql.VanillaOption(payoff, americanExercise)
bermudanExercise = ql.BermudanExercise([ql.Date(15,6,2024), ql.Date(15,6,2025)])
bermudanOption = ql.VanillaOption(payoff, bermudanExercise)
binaryOption = ql.VanillaOption(binaryPayoff, european_exercise)
亚式期权
- ql.DiscreteAveragingAsianOption(averageType, runningAccumulator, pastFixings, fixingDates, payoff, exercise)
平均类型:
ql.ContinuousAveragingAsianOption(arithmeticAverage, vanillaPayoff, europeanExercise)
ql.DiscreteAveragingAsianOption(算术平均, 算术运行累加器, 已确定价格数量, 亚式期权未来定价日期, 普通期权收益, 欧式行权)
平均值定义:
ql.Average().Arithmetic
ql.Average().Geometric
today = ql.Date().todaysDate()
periods = [ql.Period("6M"), ql.Period("12M"), ql.Period("18M"), ql.Period("24M")]
pastFixings = 0 # Empty because this is a new contract
asianFutureFixingDates = [today + period for period in periods]
asianExpiryDate = today + periods[-1]
strike = 100
vanillaPayoff = ql.PlainVanillaPayoff(ql.Option.Call, strike)
europeanExercise = ql.EuropeanExercise(asianExpiryDate)
arithmeticAverage = ql.Average().Arithmetic
arithmeticRunningAccumulator = 0.0
discreteArithmeticAsianOption = ql.DiscreteAveragingAsianOption(arithmeticAverage, arithmeticRunningAccumulator, pastFixings, asianFutureFixingDates, vanillaPayoff, europeanExercise)
geometricAverage = ql.Average().Geometric
geometricRunningAccumulator = 1.0
discreteGeometricAsianOption = ql.DiscreteAveragingAsianOption(geometricAverage, geometricRunningAccumulator, pastFixings, asianFutureFixingDates, vanillaPayoff, europeanExercise)
continuousGeometricAsianOption = ql.ContinuousAveragingAsianOption(geometricAverage, vanillaPayoff, europeanExercise)
障碍期权
- ql.BarrierOption(barrierType, barrier, rebate, payoff, exercise)
障碍类型:
ql.Barrier.UpIn
ql.Barrier.UpOut
ql.Barrier.DownIn
ql.Barrier.DownOut
T = 1
K = 100.
barrier = 110.
rebate = 0.
barrierType = ql.Barrier.UpOut
today = ql.Date().todaysDate()
maturity = today + ql.Period(int(T*365), ql.Days)
payoff = ql.PlainVanillaPayoff(ql.Option.Call, K)
amExercise = ql.AmericanExercise(today, maturity, True)
euExercise = ql.EuropeanExercise(maturity)
barrierOption = ql.BarrierOption(barrierType, barrier, rebate, payoff, euExercise)
- ql.DoubleBarrierOption(barrierType, barrier_lo, barrier_hi, rebate, payoff, exercise)
双障碍类型:
ql.DoubleBarrier.KnockIn
ql.DoubleBarrier.KnockOut
ql.DoubleBarrier.KIKO
ql.DoubleBarrier.KOKI
T = 1
K = 100.
barrier_lo, barrier_hi = 90., 110.
rebate = 0.
barrierType = ql.DoubleBarrier.KnockOut
today = ql.Date().todaysDate()
maturity = today + ql.Period(int(T*365), ql.Days)
payoff = ql.PlainVanillaPayoff(ql.Option.Call, K)
euExercise = ql.EuropeanExercise(maturity)
doubleBarrierOption = ql.DoubleBarrierOption(barrierType, barrier_lo, barrier_hi, rebate, payoff, euExercise)
- ql.PartialTimeBarrierOption(barrierType, barrieRange, barrier, rebate, coverEventDate, payoff, exercise)
部分障碍区间类型:
ql.PartialBarrier.Start: 从期权生命周期开始监控障碍条件,直到所谓的覆盖事件发生。
ql.PartialBarrier.EndB1: 监控从覆盖事件到行权日期间的障碍水平;只有当障碍被触及或从任意方向突破时才会触发敲出,无论监控开始时标的资产的价值如何。
ql.PartialBarrier.EndB2: 监控从覆盖事件到行权日期间的障碍条件;如果在监控开始时标的资产价格处于障碍错误的一侧,则立即触发敲出。
today = ql.Date().todaysDate()
maturity = calendar.advance(today, ql.Period(360, ql.Days))
K = 110.
barrier = 125.
rebate = 0.
barrier_type = ql.Barrier.UpOut
cover_event_date = calendar.advance(today, ql.Period(180, ql.Days))
payoff = ql.PlainVanillaPayoff(ql.Option.Call, K)
exercise = ql.EuropeanExercise(maturity)
partial_time_barrier_opt = ql.PartialTimeBarrierOption(
barrier_type,
ql.PartialBarrier.EndB1, # time range for partial-time barrier option
barrier, rebate,
cover_event_date,
payoff, exercise
)
篮子期权
- ql.BasketOption(payoff, exercise)
收益类型:
ql.MinBasketPayoff(payoff)
ql.AverageBasketPayoff(payoff, numInstruments)
ql.MaxBasketPayoff(payoff)
today = ql.Date().todaysDate()
exp_date = today + ql.Period(1, ql.Years)
strike = 100
number_of_underlyings = 5
exercise = ql.EuropeanExercise(exp_date)
vanillaPayoff = ql.PlainVanillaPayoff(ql.Option.Call, strike)
payoffMin = ql.MinBasketPayoff(vanillaPayoff)
basketOptionMin = ql.BasketOption(payoffMin, exercise)
payoffAverage = ql.AverageBasketPayoff(vanillaPayoff, number_of_underlyings)
basketOptionAverage = ql.BasketOption(payoffAverage, exercise)
payoffMax = ql.MaxBasketPayoff(vanillaPayoff)
basketOptionMax = ql.BasketOption(payoffMax, exercise)
Cliquet期权
远期期权
- ql.ForwardVanillaOption(moneyness, resetDate, payoff, exercise)
today = ql.Date().todaysDate()
resetDate = today + ql.Period(1, ql.Years)
expiryDate = today + ql.Period(2, ql.Years)
moneyness, strike = 1., 100 # nb. strike is required for the payoff, but ignored in pricing
exercise = ql.EuropeanExercise(expiryDate)
vanillaPayoff = ql.PlainVanillaPayoff(ql.Option.Call, strike)
forwardStartOption = ql.ForwardVanillaOption(moneyness, resetDate, vanillaPayoff, exercise)