Banner

QuantLib

1天前

QuantLib 上手教程

QuantLib 上手建议从 Python 版 QuantLib-Python 开始:先装库,再理解“日期/曲线/工具/定价引擎”这套固定组合,然后跑通一个债券定价和一个期权定价例子。

1. 安装

pip install QuantLib-Python

验证:

import QuantLib as ql
print(ql.__version__)

如果 pip 安装失败,可以尝试 conda:

conda install -c conda-forge quantlib

Windows 用户如果从源码编译,可能需要 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. 推荐练习路线

  1. 用 FlatForward 做一条简单收益率曲线;
  2. 定价一只固定利率债券;
  3. 计算债券的 clean price、dirty price、YTM;
  4. 定价欧式期权并输出 Greeks;
  5. 换成美式期权,尝试 BinomialVanillaEngine;
  6. 再进阶到利率互换、收益率曲线引导和波动率曲面。
4