金融工程学 quantlib 债券

QuantLib 中债券的核心是 现金流 (CashFlow),债券是现金流的集合。 固定利率债券每期支付固定利息,到期支付本金。

示例代码:

import QuantLib as ql

# 1. 设置评估日
today = ql.Date(3, 12, 2025)
ql.Settings.instance().evaluationDate = today

# 2. 债券参数
issue_date = ql.Date(3, 12, 2020)
maturity_date = ql.Date(3, 12, 2030)
tenor = ql.Period(ql.Annual)  # 每年付息
calendar = ql.TARGET()
business_convention = ql.Following
day_count = ql.Actual360()
coupon_rate = [0.05]  # 年利率 5%
face_value = 100

# 3. 生成付息日期
schedule = ql.Schedule(issue_date, maturity_date, tenor, calendar,
                       business_convention, business_convention,
                       ql.DateGeneration.Backward, False)

# 4. 创建固定利率债券
bond = ql.FixedRateBond(0, face_value, schedule, coupon_rate, day_count)

# 5. 使用贴现曲线定价
flat_rate = ql.FlatForward(today, 0.04, day_count, ql.Compounded, ql.Annual)
discount_curve = ql.YieldTermStructureHandle(flat_rate)
bond_engine = ql.DiscountingBondEngine(discount_curve)
bond.setPricingEngine(bond_engine)

# 6. 计算价格和收益率
clean_price = bond.cleanPrice()
dirty_price = bond.dirtyPrice()

print("Clean Price:", clean_price)
print("Dirty Price:", dirty_price)

代码/类 作用
ql.Schedule 生成债券付息日期表
FixedRateBond 固定利率债券类
FlatForward 构建平坦利率曲线
DiscountingBondEngine 贴现引擎,用于债券定价
cleanPrice 不含应计利息的债券价格
dirtyPrice 含应计利息的债券价格
yieldRate 计算到期收益率 (YTM)

注意:债券价格可以分为 clean price + accrued interest = dirty price


计算现金流现值

我们也可以单独打印每笔现金流的现值:

print("cashflows:", [ _.amount() for _ in bond.cashflows()] )

example

创建一个 5 年期、每半年付息的债券,年利率 3%,本金 100,计算价格和 YTM

import QuantLib as ql

# 1. 设置评估日
today = ql.Date(4, 12, 2025)
ql.Settings.instance().evaluationDate = today # 设置评估日

# 2. 债券参数
issue_date = ql.Date(3, 12, 2020) # 发行日期
maturity_date = ql.Date(3, 12, 2030) # 到期日期
tenor = ql.Period(ql.Semiannual)  # 每半年付息
calendar = ql.TARGET() # 日历
business_convention = ql.Following # 业务约定
day_count = ql.Actual360() # 日期计数
coupon_rate = [0.03]  # 年利率 3%
face_value = 1000 # 面值

# 3. 生成付息日期
schedule = ql.Schedule(issue_date, maturity_date, tenor, calendar,
                       business_convention, business_convention,
                       ql.DateGeneration.Backward, False) # 生成付息日期

# 4. 创建固定利率债券
bond = ql.FixedRateBond(0, face_value, schedule, coupon_rate, day_count) # 创建固定利率债券

# 5. 使用贴现曲线定价
flat_rate = ql.FlatForward(today, 0.04, day_count, ql.Compounded, ql.Semiannual) # 创建贴现曲线(复利频率应与付息频率匹配)
discount_curve = ql.YieldTermStructureHandle(flat_rate) # 创建贴现曲线
bond_engine = ql.DiscountingBondEngine(discount_curve) # 创建贴现引擎
bond.setPricingEngine(bond_engine)

# 6. 计算价格和收益率
clean_price = bond.cleanPrice() # 计算不含应计利息的价格
dirty_price = bond.dirtyPrice() # 计算含应计利息的价格          

print("Clean Price:", clean_price*face_value/100) # 显示百分比价格
print("Dirty Price:", dirty_price*face_value/100)
print("cashflows:", [ _.amount() for _ in bond.cashflows()] )