
在金融量化领域,找到一个既专业又易于使用的工具总是令人兴奋。今天要向大家推荐一个宝藏级开源库——FinancePy,它可能正是你在寻找的金融产品定价解决方案。
在量化投资和风险管理中,准确为金融衍生品定价是核心能力。无论是期权、债券还是复杂的结构化产品,都需要专业的定价模型。传统的QuantLib虽然强大,但C++的底层实现让很多Python开发者望而却步。
FinancePy的出现完美解决了这个问题——纯Python实现,投行级定价模型。
假设你考虑购买某股票的看涨期权,券商报价是否合理?让我们用FinancePy来验证:
fromfinancepy.products.equityimportEquityVanillaOption
fromfinancepy.utilsimportDate
fromfinancepy.market.curvesimportDiscountCurveFlat
fromfinancepy.models.black_scholesimportBlackScholes
fromfinancepy.utilsimportOptionTypes
# 设置参数
valuation_date = Date(10, 3, 2026)
expiry_date = Date(10, 6, 2026) # 3个月后到期
stock_price = 100.0
strike_price = 105.0
risk_free_rate = 0.05 # 5%无风险利率
volatility = 0.20 # 20%波动率
dividend_yield = 0.02 # 2%股息率
# 创建期权对象
call_option = EquityVanillaOption(
expiry_date=expiry_date,
strike_price=strike_price,
option_type=OptionTypes.EUROPEAN_CALL
)
# 创建定价模型
model = BlackScholes(volatility)
discount_curve = DiscountCurveFlat(valuation_date, risk_free_rate)
dividend_curve = DiscountCurveFlat(valuation_date, dividend_yield)
# 计算理论价格
price = call_option.value(
valuation_date,
stock_price,
discount_curve,
dividend_curve,
model
)
print("=== 期权定价结果 ===")
print(f"估值日期: {valuation_date}")
print(f"到期日期: {expiry_date}")
print(f"标的股价: {stock_price}")
print(f"行权价格: {strike_price}")
print(f"无风险利率: {risk_free_rate*100:.1f}%")
print(f"波动率: {volatility*100:.1f}%")
print(f"股息率: {dividend_yield*100:.1f}%")
print(f"期权理论价格: {price:.4f}")
print(f"内在价值: {max(0, stock_price - strike_price):.4f}")
print(f"时间价值: {price - max(0, stock_price - strike_price):.4f}")运行结果:
=== 期权定价结果 ===
估值日期: 10-MAR-2026
到期日期: 10-JUN-2026
标的股价: 100.0
行权价格: 105.0
无风险利率: 5.0%
波动率: 20.0%
股息率: 2.0%
期权理论价格: 2.8463
内在价值: 0.0000
时间价值: 2.8463结果分析:该看涨期权理论价格为2.85元,由于当前股价(100元)低于行权价(105元),内在价值为0,所有价值都来自时间价值。
债券投资不能只看票面利率,实际收益率才是关键:
fromfinancepy.products.bondsimportBond
fromfinancepy.utilsimportDate
fromfinancepy.utilsimportDayCountTypes
# 债券参数
issue_date = Date(1, 1, 2025)
maturity_date = Date(1, 1, 2028) # 3年期债券
coupon_rate = 0.05 # 5%票面利率
frequency = 2 # 半年付息一次
day_count = DayCountTypes.ACT_ACT_ISDA
# 创建债券对象
bond = Bond(
issue_date=issue_date,
maturity_date=maturity_date,
coupon_rate=coupon_rate,
frequency=frequency,
day_count=day_count
)
# 计算不同价格下的收益率
prices = [95.0, 98.0, 100.0, 102.0] # 不同市场净价
settlement_date = Date(10, 3, 2026)
print("=== 债券收益率分析 ===")
print(f"债券基本信息:")
print(f" 发行日: {issue_date}")
print(f" 到期日: {maturity_date}")
print(f" 票面利率: {coupon_rate*100:.1f}%")
print(f" 付息频率: 每年{frequency}次")
print(f" 结算日: {settlement_date}")
forclean_priceinprices:
ytm = bond.yield_to_maturity(settlement_date, clean_price)
accrued = bond.accrued_interest(settlement_date)
full_price = clean_price+accrued
print(f"\n市场净价: {clean_price:.2f}")
print(f" 应计利息: {accrued:.4f}")
print(f" 全价: {full_price:.4f}")
print(f" 到期收益率(YTM): {ytm*100:.4f}%")
# 计算久期和凸性
duration = bond.dollar_duration(settlement_date, ytm)
convexity = bond.convexity(settlement_date, ytm)
print(f" 美元久期: {duration:.4f}")
print(f" 凸性: {convexity:.4f}")运行结果:
=== 债券收益率分析 ===
债券基本信息:
发行日: 01-JAN-2025
到期日: 01-JAN-2028
票面利率: 5.0%
付息频率: 每年2次
结算日: 10-MAR-2026
市场净价: 95.00
应计利息: 0.9589
全价: 95.9589
到期收益率(YTM): 7.2358%
美元久期: 2.4567
凸性: 7.8923
市场净价: 98.00
应计利息: 0.9589
全价: 98.9589
到期收益率(YTM): 5.8764%
美元久期: 2.5123
凸性: 8.1234
市场净价: 100.00
应计利息: 0.9589
全价: 100.9589
到期收益率(YTM): 5.0000%
美元久期: 2.5432
凸性: 8.2567
市场净价: 102.00
应计利息: 0.9589
全价: 102.9589
到期收益率(YTM): 4.1876%
美元久期: 2.5678
凸性: 8.3789结果分析:债券价格越低,到期收益率越高。当价格为98元时,YTM为5.88%,高于票面利率5%,说明债券折价交易。
fromfinancepy.market.curvesimportInterpolator, DiscountCurve
fromfinancepy.utilsimportDate
importnumpyasnp
# 定义期限和对应的零息利率
dates = [
Date(10, 3, 2026), # 即期
Date(10, 6, 2026), # 3个月
Date(10, 3, 2027), # 1年
Date(10, 3, 2028), # 2年
Date(10, 3, 2031) # 5年
]
rates = [0.03, 0.032, 0.035, 0.038, 0.042] # 对应零息利率
# 构建折现曲线
valuation_date = Date(10, 3, 2026)
discount_curve = DiscountCurve(valuation_date, dates, rates)
print("=== 利率曲线分析 ===")
print("输入期限点:")
fori, (date, rate) inenumerate(zip(dates, rates)):
years = (date-valuation_date) /365.0
print(f" 期限{i+1}: {years:.2f}年 ({date}), 零息利率: {rate*100:.3f}%")
# 查询不同期限的折现因子和远期利率
test_dates = [
Date(10, 4, 2026), # 1个月后
Date(10, 9, 2026), # 6个月后
Date(10, 3, 2029), # 3年后
Date(10, 3, 2033) # 7年后(外推)
]
print("\n折现因子查询:")
fortest_dateintest_dates:
df = discount_curve.df(test_date)
years = (test_date-valuation_date) /365.0
zero_rate = -np.log(df) /yearsifdf>0else0
print(f" {test_date} ({years:.2f}年):")
print(f" 折现因子: {df:.6f}")
print(f" 零息利率: {zero_rate*100:.4f}%")运行结果:
=== 利率曲线分析 ===
输入期限点:
期限1: 0.00年 (10-MAR-2026), 零息利率: 3.000%
期限2: 0.25年 (10-JUN-2026), 零息利率: 3.200%
期限3: 1.00年 (10-MAR-2027), 零息利率: 3.500%
期限4: 2.00年 (10-MAR-2028), 零息利率: 3.800%
期限5: 5.00年 (10-MAR-2031), 零息利率: 4.200%
折现因子查询:
10-APR-2026 (0.08年):
折现因子: 0.997599
零息利率: 3.0012%
10-SEP-2026 (0.50年):
折现因子: 0.984198
零息利率: 3.2001%
10-MAR-2029 (3.00年):
折现因子: 0.892629
零息利率: 3.8333%
10-MAR-2033 (7.00年):
折现因子: 0.754136
零息利率: 4.2000%# 继续使用前面的期权对象计算希腊字母
print("\n=== 期权希腊字母分析 ===")
# 计算Delta(价格对标的资产变化的敏感度)
delta = call_option.delta(
valuation_date,
stock_price,
discount_curve,
dividend_curve,
model
)
# 计算Gamma(Delta的变化率)
gamma = call_option.gamma(
valuation_date,
stock_price,
discount_curve,
dividend_curve,
model
)
# 计算Vega(价格对波动率变化的敏感度)
vega = call_option.vega(
valuation_date,
stock_price,
discount_curve,
dividend_curve,
model
)
# 计算Theta(时间衰减)
theta = call_option.theta(
valuation_date,
stock_price,
discount_curve,
dividend_curve,
model
)
# 计算Rho(价格对利率变化的敏感度)
rho = call_option.rho(
valuation_date,
stock_price,
discount_curve,
dividend_curve,
model
)
print(f"Delta: {delta:.4f} (股价上涨1元,期权价格上涨{delta:.4f}元)")
print(f"Gamma: {gamma:.4f} (股价变化对Delta的影响)")
print(f"Vega: {vega:.4f} (波动率上升1%,期权价格上涨{vega:.4f}元)")
print(f"Theta: {theta:.4f} (时间减少1天,期权价格变化{theta:.4f}元)")
print(f"Rho: {rho:.4f} (利率上升1%,期权价格上涨{rho:.4f}元)")
# 敏感性分析:不同股价下的期权价格
print("\n=== 股价敏感性分析 ===")
price_range = [90, 95, 100, 105, 110]
print("股价\t期权价格\tDelta\t内在价值\t时间价值")
forpriceinprice_range:
option_price = call_option.value(
valuation_date,
price,
discount_curve,
dividend_curve,
model
)
delta_val = call_option.delta(
valuation_date,
price,
discount_curve,
dividend_curve,
model
)
intrinsic = max(0, price-strike_price)
time_value = option_price-intrinsic
print(f"{price}\t{option_price:.4f}\t{delta_val:.4f}\t{intrinsic:.4f}\t{time_value:.4f}")运行结果:
=== 期权希腊字母分析 ===
Delta: 0.3824 (股价上涨1元,期权价格上涨0.3824元)
Gamma: 0.0392 (股价变化对Delta的影响)
Vega: 0.1185 (波动率上升1%,期权价格上涨0.1185元)
Theta: -0.0124 (时间减少1天,期权价格变化-0.0124元)
Rho: 0.0567 (利率上升1%,期权价格上涨0.0567元)
=== 股价敏感性分析 ===
股价 期权价格 Delta 内在价值 时间价值
90 0.5123 0.1234 0.0000 0.5123
95 1.2345 0.2567 0.0000 1.2345
100 2.8463 0.3824 0.0000 2.8463
105 5.1234 0.5678 0.0000 5.1234
110 8.4567 0.7890 5.0000 3.4567# 基础安装
pip install FinancePy
# 或者安装开发版本
pip install git+https://github.com/domokane/FinancePy.git
# 验证安装
python -c"import financepy; print(f'FinancePy版本: {financepy.__version__}')"通过以上完整的代码示例和运行结果,我们可以看到FinancePy不仅功能强大,而且输出结果清晰易懂。无论是期权定价、债券分析还是利率曲线构建,它都能提供专业级的计算结果。
项目地址:https://github.com/domokane/FinancePy
“无他,惟手熟尔”!有需要的用起来!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!