
在金融量化领域,找到一个既专业又易于使用的工具总是令人兴奋。今天要向大家推荐一个宝藏级开源库——FinancePy,它可能正是你在寻找的金融产品定价解决方案。
往期阅读>>>
Python 自动化管理Jenkins的15个实用脚本,提升效率
App2Docker:如何无需编写Dockerfile也可以创建容器镜像
Python 自动化识别Nginx配置并导出为excel文件,提升Nginx管理效率
在量化投资和风险管理中,准确为金融衍生品定价是核心能力。无论是期权、债券还是复杂的结构化产品,都需要专业的定价模型。传统的QuantLib虽然强大,但C++的底层实现让很多Python开发者望而却步。
FinancePy的出现完美解决了这个问题——纯Python实现,投行级定价模型。
假设你考虑购买某股票的看涨期权,券商报价是否合理?让我们用FinancePy来验证:
fromfinancepy.products.equityimportEquityVanillaOptionfromfinancepy.utilsimportDatefromfinancepy.market.curvesimportDiscountCurveFlatfromfinancepy.models.black_scholesimportBlackScholesfromfinancepy.utilsimportOptionTypes# 设置参数valuation_date = Date(10, 3, 2026)expiry_date = Date(10, 6, 2026) # 3个月后到期stock_price = 100.0strike_price = 105.0risk_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.bondsimportBondfromfinancepy.utilsimportDatefromfinancepy.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+accruedprint(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, DiscountCurvefromfinancepy.utilsimportDateimportnumpyasnp# 定义期限和对应的零息利率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.0print(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.0zero_rate = -np.log(df) /yearsifdf>0else0print(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-intrinsicprint(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.512395 1.2345 0.2567 0.0000 1.2345100 2.8463 0.3824 0.0000 2.8463105 5.1234 0.5678 0.0000 5.1234110 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
想高效学习Python?下面三本精选好书满足你的不同需求!
《流畅的Python(第2版)》——Python进阶必读!深入讲解高级特性与最佳实践,适合想精进的开发者。
《Python从新手到高手》:初学者首选,系统学习全栈技能。
《Python数据分析:从零基础入门到案例实战》——数据科学利器!手把手教你用Python处理数据,实战案例学完就能用。
三本书均支持先用后付、运费险和7天无理由退货,放心购买!点击“购买”按钮,立即开启你的Python学习之旅吧!
https://ima.qq.com/wiki/?shareId=f2628818f0874da17b71ffa0e5e8408114e7dbad46f1745bbd1cc1365277631c
