首页 > 编程问答 >使用 reqMktData 请求数据时出现错误的希腊语(delta、vega...)结果

使用 reqMktData 请求数据时出现错误的希腊语(delta、vega...)结果

时间:2024-07-26 14:13:58浏览次数:14  
标签:python algorithmic-trading interactive-brokers ib-api

我正在使用本机库 ibapi(Interactive Brokers)。我有以下代码:

    from ibapi.client import EClient
    from ibapi.wrapper import EWrapper
    from ibapi.contract import Contract
    import threading
    import time

    class TradingApp(EWrapper, EClient):
        def __init__(self):
            EClient.__init__(self, wrapper=self)
            self.nextOrderId = None
            self.option_params_received = False

        def error(self, reqId, errorCode, errorString, advancedOrderRejectJson=None):
            print("Error {} {} {}".format(reqId, errorCode, errorString))

        def tickOptionComputation(self, reqId, tickType, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta, undPrice, pvDividend2):
        
            if tickType == 13:  # This is the type for option computation
                print(f"Greeks for reqId {reqId}: Delta={delta}, Gamma={gamma}, Vega={vega}, Theta={theta}")

    def websocket_con():
        app.run()

    # Create an instance of the TradingApp class and connect to the server.
    app = TradingApp()
    print("Attempting to connect...")
    app.connect("127.0.0.1", 7497, clientId=7)

    # Create a thread to connect to the websocket.
    con_thread = threading.Thread(target=websocket_con)
    con_thread.start()

    # Give some lag time for connection
    time.sleep(2)

    # Create a simple put options contract on AAPL
    option_contract = Contract()
    option_contract.symbol = "AAPL"  # Added symbol for the underlying
    option_contract.secType = "OPT"
    option_contract.currency = "USD"
    option_contract.exchange = "SMART"
    option_contract.lastTradeDateOrContractMonth = "20240802"
    option_contract.strike = 195
    option_contract.tradingClass = 'AAPL'
    option_contract.right = "P"  # Put option

    app.reqMktData(reqId=111, 
               contract=option_contract, 
               genericTickList= "101",
               snapshot=False, 
               regulatorySnapshot=False,
               mktDataOptions=[])

    time.sleep(5)

    app.cancelMktData(111)

我遇到的问题是,从我在交易平台中看到的结果来看,所有希腊人的结果都是错误的。我使用的是实时数据,没有快照。我看到并行的值(没有时间问题),并且详细描述了期权合约。尽管我发送了看跌期权请求,但 Delta 的结果甚至是正值。我在代码中是否忘记了什么来接收与我在 TWS 中看到的相同的值?


代码中可能有一些问题导致希腊语值不正确:

  1. 缺少 Underlying 数据请求: 只请求了期权合约的市场数据 ( reqMktData ),但没有请求标的资产 (AAPL) 的市场数据。希腊语值的计算需要标的资产的实时价格。

解决方案: 在请求期权合约的 reqMktData 之前,添加一行代码请求 AAPL 的市场数据: python app.reqMktData(reqId=110, # 使用不同的 reqId contract=Contract(symbol="AAPL", secType="STK", exchange="SMART", currency="USD"), genericTickList="", snapshot=False, regulatorySnapshot=False, mktDataOptions=[])

  1. genericTickList 参数: 使用了 genericTickList="101" ,这表示只请求 Greeks。虽然这可以工作,但最好请求所有 tick 数据类型,以便 IBKR 服务器能够正确计算希腊语值。

解决方案: genericTickList 设置为空字符串: python app.reqMktData(reqId=111, contract=option_contract, genericTickList= "", # 请求所有 tick 类型 snapshot=False, regulatorySnapshot=False, mktDataOptions=[])

  1. 时间同步问题: 虽然设置了 snapshot=False ,但仍有可能存在时间同步问题,导致看到的希腊语值与 TWS 中的值不同步。

解决方案:

  • 在收到 tickOptionComputation 回调后,打印当前时间戳,以便与 TWS 中的值进行比较。
  • 如果时间同步问题仍然存在,可以尝试使用 reqHistoricalData 请求历史 tick 数据,并使用这些数据计算希腊语值。

  • 期权合约细节: 请确保在代码中指定的期权合约细节 (到期日、行权价等) 与在 TWS 中查看的合约完全一致。 任何差异都会导致希腊语值计算错误。

修改的代码以包含这些更改,并确保在 TWS 中查看的期权合约与在代码中请求的合约完全相同。 如果问题仍然存在,请提供更多信息,例如在 TWS 中看到的希腊语值、运行代码的时间戳以及使用的 IBKR 服务器版本。

标签:python,algorithmic-trading,interactive-brokers,ib-api
From: 78769892

相关文章

  • 使用 Python 进行数据分析:入门指南
    使用Python进行数据分析:入门指南1.简介本指南将介绍如何使用Python进行数据分析,涵盖从数据加载到可视化分析的各个方面。2.必要的库NumPy:用于数值计算和数组操作。Pandas:用于数据处理和分析,提供DataFrame结构。Matplotlib:用于数据可视化,创建各种图表。Seab......
  • IT实战课堂计算机毕业设计源码精品基于Python的高校教育教材采购出入库进销存储信息管
    项目功能简介:《[含文档+PPT+源码等]精品基于Python的高校教育教材信息管理系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开发工具:开......
  • 为什么我的 Python 脚本失败并出现 TypeError?
    我正在编写一个Python脚本,该脚本应该计算数字列表的总和。但是,当我运行代码时遇到TypeError这是一个最小的例子:numbers=[1,2,3,'4']total=sum(numbers)print(total)Theerrormessageis:TypeError:unsupportedoperandtype(s)for+:'int'and'str......
  • 如何通过socks代理传递所有Python的流量?
    有如何通过http代理传递所有Python的流量?但是,它不处理sock代理。我想使用sock代理,我们可以通过ssh隧道轻松获得它。ssh-D5005user@server你可以使用socks库,让你的Python代码通过SOCKS代理传递所有流量。这个库可以让你在套接字级别上指定代......
  • 如何在streamlit python中流式传输由LLM生成的输出
    代码:fromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchainimportPromptTemplatefromlangchain_community.llmsimportLlamaCppfromlangchain.chainsimportRetrievalQAimports......
  • python mysql操作
    pipinstallmysql-connector-pythonimportmysql.connector#配置数据库连接参数config={'user':'your_username','password':'your_password','host':'your_host','database'......
  • Python 中的面向对象编程
    一.介绍在本文中,我们将使用Python中的类和对象来探索基本的OOP概念。面向对象编程(OOP)是一种强大的方法,可帮助开发人员组织代码,使其易于理解、重用和维护。Python是一种灵活的语言,可以很好地支持OOP概念。1.类和对象类是创建对象的蓝图。它定义了该类的对象将......
  • 学习资源系列之《Python深度学习基于PyTorch》
     前言近期应部分读者朋友的强烈邀请,希望推荐一本python深度学习实操的书籍。呐,今天为大家推荐小编偶然发现的这一本珍藏好书:《Python深度学习基于PyTorch》,文末附电子版获取方式《Python深度学习基于PyTorch》BriefIntroduction前言面对众多的深......
  • 如何使用Python实现语音转文字/字幕
    文章目录......
  • Python 教程(三):字符串特性大全
    目录专栏列表前言1.字符串基础2.字符串方法字符串查询字符串修改字符串切片3.字符串格式化旧式格式化(`%`操作符)`str.format()`方法f-string(Python3.6+)4.字符串编码5.Unicode和ASCII6.正则表达式7.字符串比较8.字符串连接9.字符串不可变性10.字符串的内......