首页 > 编程问答 >使用 Python 进行 QuantLib Vanilla 掉期定价 - 错误

使用 Python 进行 QuantLib Vanilla 掉期定价 - 错误

时间:2024-07-30 04:57:29浏览次数:12  
标签:python swap finance derivative quantlib

我真的需要帮助...我有一个使用 QuantLib 构建自己的 Vanilla Swap Pricer 的项目。我想根据 ois 掉期的市场价格进行计算以进行贴现,并根据 Euribor 6M 掉期 + FRA 进行预测固定。总而言之,我的目标是尽可能接近彭博社对标准 Euribor 6M 掉期的定价(贴现 ois) - fwd Euribor 6M)。

很容易开始,我得到了 QuantLib 的文档,但是当完全遵循这段代码时,我遇到了错误...

https://quantlib-python-docs.readthedocs.io /en/latest/examples/fixedvenue/vanillaswap.html

错误如下:

TypeError: MakeVanillaSwap() 有一个意外的关键字参数“Nominal”

我非常感谢您的帮助,因为我陷入了困境我项目的第一步....

谢谢!

我尝试删除标称值,因此它使用的是 1 默认值,但我不知道应该在哪里输入标称值。

I tried to remove the nominal, so it's working with a 1 default value I think but I don't know where should I input the nominal.


当然,我可以帮助你解决这个问题。你遇到的错误“TypeError: MakeVanillaSwap() got an unexpected keyword argument 'Nominal'”是因为 ql.MakeVanillaSwap 函数中没有“Nominal”参数。

以下是如何在 QuantLib 中对普通掉期进行定价的方法,以及如何更正你的代码:

import QuantLib as ql

# -------- 市场数据 --------
calculation_date = ql.Date(15, 12, 2022)
ql.Settings.instance().setEvaluationDate(calculation_date)

# OIS 曲线用于折现
ois_helpers = [
    ql.OISRateHelper(ql.Period(1, ql.Days), ql.QuoteHandle(ql.SimpleQuote(rate / 100)), ql.Euribor6M()),
    # 添加更多 OIS 报价...
]
ois_curve = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), ois_helpers, ql.ActualActual())

# Euribor 6M 曲线用于预测
euribor6m_helpers = [
    ql.SwapRateHelper(ql.QuoteHandle(ql.SimpleQuote(rate / 100)), ql.Period(tenor), ql.TARGET(), ql.ModifiedFollowing, ql.TARGET(), ql.Euribor6M(), ql.QuoteHandle(), ql.Period(6, ql.Months)),
    # 添加更多 Euribor 6M 报价...
]
euribor6m_curve = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), euribor6m_helpers, ql.ActualActual())

# 设置 Euribor 6M 指数
euribor6m_index = ql.Euribor6M(ql.QuoteHandle(ql.SimpleQuote(0.02)))  # 虚拟初始值

# -------- 掉期详细信息 --------
nominal = 1000000  # 标称本金
maturity = ql.Period(5, ql.Years)
fixed_rate = 0.03  # 固定利率
fixed_leg_tenor = ql.Period(1, ql.Years)
fixed_leg_daycount = ql.Thirty3_60()
floating_leg_daycount = ql.Actual360()

# -------- 构建掉期 --------
fixed_leg_schedule = ql.Schedule(calculation_date, calculation_date + maturity, fixed_leg_tenor, ql.ModifiedFollowing, ql.TARGET(), ql.ModifiedFollowing, ql.DateGeneration.Forward, False)
floating_leg_schedule = ql.Schedule(calculation_date, calculation_date + maturity, ql.Period(6, ql.Months), ql.ModifiedFollowing, ql.TARGET(), ql.ModifiedFollowing, ql.DateGeneration.Forward, False)

# 使用构建器函数
swap = ql.MakeVanillaSwap(maturity, euribor6m_index, fixed_rate, fixed_leg_tenor, fixed_leg_daycount, floating_leg_daycount, ql.ModifiedFollowing, nominal, ql.TARGET())

# -------- 定价引擎 --------
swap.setPricingEngine(ql.DiscountingSwapEngine(ois_curve))

# -------- 结果 --------
print("NPV:", swap.NPV())
print("公平利率:", swap.fairRate())
print("固定支腿 NPV:", swap.fixedLegNPV())
print("浮动支腿 NPV:", swap.floatingLegNPV())

说明:

  1. 导入 QuantLib: 导入必要的 QuantLib 库。
  2. 市场数据:
  3. 设置计算日期。
  4. 创建 OIS 帮助程序列表。这些将用于构建用于折现的 OIS 曲线。请确保用实际的 OIS 市场报价替换占位符。
  5. 使用 OIS 帮助程序创建 OIS 曲线。
  6. 创建 Euribor 6M 帮助程序列表。这些将用于构建用于预测浮动支腿的 Euribor 6M 曲线。请确保用实际的 Euribor 6M 市场报价替换占位符。
  7. 使用 Euribor 6M 帮助程序创建 Euribor 6M 曲线。
  8. 实例化 Euribor 6M 指数并为其分配虚拟初始值。这将在构建掉期时更新。
  9. 掉期详细信息:
  10. 定义掉期的标称值、期限、固定利率、固定支腿期限、固定支腿日计数惯例和浮动支腿日计数惯例。
  11. 构建掉期:
  12. 为固定支腿和浮动支腿生成支付时间表。
  13. 使用 ql.MakeVanillaSwap 函数创建普通掉期。在此函数中,你需要指定掉期的参数,例如期限、指数、固定利率、期限等。
  14. 定价引擎:
  15. 创建一个 DiscountingSwapEngine ,并为其提供 OIS 曲线进行折现。
  16. 使用此引擎设置掉期的定价引擎。
  17. 结果:
  18. 打印掉期的 NPV、公平利率、固定支腿 NPV 和浮动支腿 NPV。

更正代码中的其他注意事项:

  • 确保用实际的市场数据(如 OIS 和 Euribor 6M 报价)替换占位符。
  • 根据你的特定需求调整掉期详细信息和市场数据。

通过进行这些更改,你应该能够对你的普通掉期进行定价并解决你遇到的错误。

标签:python,swap,finance,derivative,quantlib
From: 78808874

相关文章

  • 我正在制作一个可以打开wav文件的python程序,我想知道wav文件的格式是什么
    因此,我已经通过此网站的研究编写了验证并读取wav标头的代码。但我想知道,data段中的数据是如何存储的?它们位于16位部分中,彼此相邻放置。我认为在Audacity中制作440hz正弦波,然后导出它,会显示一些结果,并且字节确实看起来更整齐,但仍然像废话一样接缝。相信我,我已经......
  • python - 面板库 - PasswordInput 不会对回车做出反应
    我试图避免需要提交按钮。以下代码当前正在远程jupyter实验室运行。仅当光标焦点从密码小部件中移除后,才会打印该消息。我想要回车来触发消息打印。有什么线索吗?frompanel.widgetsimportPasswordInput,TextInputpn.extension()defon_enter(event=None):message_p......
  • 即使安装了软件包,也找不到 python 模块句子转换器
    对于我的python脚本(如下所示),我使用句子转换器包,其中包含SBERT模型。即使在执行“piplist”时明确列出该软件包,并且还安装了torch,所有内容都更新到最新版本,但仍然找不到该模块。脚本:importnumpyasnpimportpandasaspdfromsentence_transformersimportSenten......
  • 有没有办法在 python 中返回类实例的布尔属性?
    我想组织我玩的游戏中的汽车数据。为此,我创建了一个“Car”类。我希望将此类实例的一些属性作为布尔值,这样我就可以将此类的所有实例放入列表中并过滤它们。我当前的解决方案不起作用,因为,我收到以下错误消息:TypeError:__repr__returnednon-string(typeCar)我使用......
  • python 正则表达式匹配一行中的多个单词而不转到下一行
    我正在编写一个解析器来解析以下输出:admin@str-s6000-on-5:~$showinterfacestatusEthernet4InterfaceLanesSpeedMTUAliasVlanOperAdminTypeAsymPFC------------------------------------------......
  • 使用 Python 平滑和对称不规则形状和曲线
    我需要完成三项任务:正则化曲线曲线的对称性完成不完整的曲线例如,这里是输入和预期的输出图像:输入输出|||在一般设置中,形状可以由任何SVG曲线基元(贝塞尔曲线、直线、弧线)表示。为了统一表示,示例包含曲线的折线近似。这些折线保存为......
  • 在Python中通过绝对路径引用数据文件夹
    我有一个大型python项目,其中数据太大,无法每次都以相同的方式共享。不同的人可能会使用网络位置或将某些内容复制到本地驱动器。该路径由不同子文件夹中的脚本和笔记本使用。例如,我将创建一个config.py来定义数据文件夹的路径。importsyssys.path.append('../'......
  • python三天速成记(看完你就会)day3 满满干货~
    续上文啦~EXCEL表的操作上一篇文章讲了怎么读取和操作txt和csv文档,但其实我们生活中还有一个常用的文本格式那就是excel文件,特别是在对大量数据进行处理的时候。excel文件的用处和广泛。其实在python中有很多库可以处理excel文件,但是本文主要介绍使用最实用最广泛的库pan......
  • Python输入验证改进的其他方式
    题目[题目来源:Python编程快速上手——让繁琐工作自动化(第二版)第三章实践项目,下面的解答程序为我自己完成的,仅供参考。]编写一个名为collatz()的函数,他有一个名为number的参数。如果参数是偶数,那么collatz()就输出number//2,并返回该值。如果参数是奇数,那么collatz()就......
  • Python的PyInputPlus模块
    PyInputPlus模块简介PyInputPlus模块的功能:PyInputPlus模块是一个Python第三方模块,需要自己对它进行安装。包含与input()函数类似的、用于多种数据(如日期、数字、电子邮箱地址等)的函数。如果,用户输入了无效的内容,例如格式错误的日期或超过预期范围的数字,那么PyInputPlus模......