QuantLib
QuantLib 上手教程
QuantLib 上手建议从 Python 版 QuantLib-Python 开始:先装库,再理解“日期/曲线/工具/定价引擎”这套固定组合,然后跑通一个债券定价和一个期权定价例子。
1. 安装
pip install QuantLib-Python验证:
import QuantLib as ql
print(ql.__version__)如果 pip 安装失败,可以尝试 conda:
conda install -c conda-forge quantlibWindows 用户如果从源码编译,可能需要 Visual Studio C++ 编译工具和 Boost;普通用户优先用预编译包。
2. 必须先理解 4 个概念
| 概念 | 作用 |
|---|---|
| Date / Calendar | 处理金融日期、节假日、到期日 |
| YieldTermStructure | 收益率曲线,用于折现 |
| Instrument | 债券、期权、互换等金融工具 |
| PricingEngine | 给工具指定定价模型 |
QuantLib 的日期不是 Python 的 datetime,要用 ql.Date。
3. 示例:固定利率债券定价
import QuantLib as ql
today = ql.Date(19, 10, 2026)
ql.Settings.instance().evaluationDate = today
schedule = ql.Schedule(
ql.Date(19, 10, 2024),
ql.Date(19, 10, 2029),
ql.Period(ql.Semiannual),
ql.UnitedStates(ql.UnitedStates.NYSE),
ql.Unadjusted,
ql.Unadjusted,
ql.DateGeneration.Backward,
False,
)
bond = ql.FixedRateBond(
0,
100.0,
schedule,
[0.05],
ql.ActualActual(ql.ActualActual.ISMA),
ql.Unadjusted,
100.0,
ql.Date(),
)
curve = ql.YieldTermStructureHandle(
ql.FlatForward(today, 0.04, ql.Actual365Fixed())
)
bond.setPricingEngine(ql.DiscountingBondEngine(curve))
print("Clean price:", bond.cleanPrice())
print("Dirty price:", bond.dirtyPrice())
print("Accrued:", bond.accruedAmount())这里债券现金流由 Schedule 决定,定价由 DiscountingBondEngine 完成;换一条曲线,价格会自动变化。
4. 示例:欧式期权定价
import QuantLib as ql
today = ql.Date(19, 10, 2026)
ql.Settings.instance().evaluationDate = today
spot = ql.QuoteHandle(ql.SimpleQuote(100.0))
rate = ql.YieldTermStructureHandle(ql.FlatForward(today, 0.05, ql.Actual365Fixed()))
vol = ql.BlackVolTermStructureHandle(
ql.BlackConstantVol(today, ql.NullCalendar(), 0.20, ql.Actual365Fixed())
)
process = ql.BlackScholesProcess(spot, rate, vol)
payoff = ql.PlainVanillaPayoff(ql.Option.Call, 100.0)
exercise = ql.EuropeanExercise(ql.Date(19, 4, 2027))
option = ql.VanillaOption(payoff, exercise)
option.setPricingEngine(ql.AnalyticEuropeanEngine(process))
print("Price:", option.NPV())
print("Delta:", option.delta())
print("Gamma:", option.gamma())
print("Vega:", option.vega())
print("Theta/day:", option.thetaPerDay())这是典型的 Black-Scholes 欧式期权定价流程。
5. 常见坑
- 日期写错:
ql.Date(day, month, year),不是年/月/日。 - 忘记设置评估日:不设置
evaluationDate,定价结果可能不符合预期。 - 曲线和日历不一致:计息基准、节假日规则会影响债券和利率产品。
- 美式期权 Greeks 不全:部分数值方法不会提供全部 Greeks,例如
vega()、rho()可能报错。 - 不要直接拿示例参数上实盘:真实定价需要市场曲线、波动率曲面和合约细节。
6. 推荐练习路线
- 用
FlatForward做一条简单收益率曲线; - 定价一只固定利率债券;
- 计算债券的 clean price、dirty price、YTM;
- 定价欧式期权并输出 Greeks;
- 换成美式期权,尝试
BinomialVanillaEngine; - 再进阶到利率互换、收益率曲线引导和波动率曲面。