我正在使用本机库 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 中看到的相同的值?
代码中可能有一些问题导致希腊语值不正确:
-
缺少 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=[])
-
genericTickList 参数:
使用了
genericTickList="101"
,这表示只请求 Greeks。虽然这可以工作,但最好请求所有 tick 数据类型,以便 IBKR 服务器能够正确计算希腊语值。
解决方案:
将
genericTickList
设置为空字符串:
python
app.reqMktData(reqId=111,
contract=option_contract,
genericTickList= "", # 请求所有 tick 类型
snapshot=False,
regulatorySnapshot=False,
mktDataOptions=[])
-
时间同步问题:
虽然设置了
snapshot=False
,但仍有可能存在时间同步问题,导致看到的希腊语值与 TWS 中的值不同步。
解决方案:
-
在收到
tickOptionComputation
回调后,打印当前时间戳,以便与 TWS 中的值进行比较。 -
如果时间同步问题仍然存在,可以尝试使用
reqHistoricalData
请求历史 tick 数据,并使用这些数据计算希腊语值。 -
期权合约细节: 请确保在代码中指定的期权合约细节 (到期日、行权价等) 与在 TWS 中查看的合约完全一致。 任何差异都会导致希腊语值计算错误。
修改的代码以包含这些更改,并确保在 TWS 中查看的期权合约与在代码中请求的合约完全相同。 如果问题仍然存在,请提供更多信息,例如在 TWS 中看到的希腊语值、运行代码的时间戳以及使用的 IBKR 服务器版本。
标签:python,algorithmic-trading,interactive-brokers,ib-api From: 78769892