Interactive Brokers - 获取OPT的历史数据(MIDPOINT和TRADES)
Interactive Brokers - Obtain Historical Data of OPT (MIDPOINT and TRADES)
我正在尝试通过 Interactive Brokers API 获得 SPY 上的底层证券和期权,虽然获得当前期权(罢工权、权利等)不是问题,但我仍然坚持获取历史数据,比如从 5 个月前到现在。
代码如下:
from ib.ext.Contract import Contract
from ib.ext.ContractDetails import ContractDetails
from ib.opt import ibConnection, message
import time
import datetime
def watcher(msg):
print(msg)
def contractDetailsHandler(msg):
contracts.append(msg.contractDetails.m_summary)
def contractDetailsEndHandler(msg):
global DataWait
DataWait = False
def contractHistDetailsHandler(msg):
contracts.append(msg.contractDetails.m_summary)
con = ibConnection()
con.host = "..."
con.port = ...
con.clientId = 5
con.registerAll(watcher)
con.register(contractDetailsHandler, 'ContractDetails')
con.register(contractDetailsEndHandler, 'ContractDetailsEnd')
con.register(contractHistDetailsHandler, message.historicalData)
con.connect()
contract = Contract()
contract.m_exchange = "SMART"
contract.m_secType = "OPT"
contract.m_symbol = "SPY"
contract.m_currency = "USD"
endtime = '20170102 01:00:00'
#con.reqContractDetails(1, contract)
con.reqHistoricalData(2,contract,endtime,"5 M","1 sec","TRADES",0,1)
con.reqHistoricalData(3,contract,endtime,"5 M","1 sec","MIDPOINT",0,1)
contracts = []
DataWait = True ; i = 0
while DataWait and i < 90:
i += 1 ; print(i),
time.sleep(1)
con.disconnect()
con.close()
print(contracts)
我得到的是:
<error id=2, errorCode=321, errorMsg=Error validating request:-'yd' : cause - When the local symbol field is empty, please fill all option fields (right, strike, expiry))>
现在我知道Contract 对象不包含那些,但是如何知道权利、行使价和到期日呢?这基本上就是我所需要的(在选择期间有日期和基本变化)。是否有不同的方法?
如果您能给我一些指点,那将是非常欢迎的!或所选范围内标的和期权的替代来源(无论是否支付;uni 项目需要它)。
非常感谢您!非常感谢任何意见。
您正在注释掉合同详细信息的请求。你需要这样做,但你会得到很多(我得到 ~5000)。要缩小范围,请尝试设置一些到期日、行使价和权利。
例如。所有 230 个电话
contract.m_strike = 230
contract.m_right = "CALL"
那我只拿到30个合同
在 contractDetailsEndHandler(msg):
你会知道你已经收到了所有的合同。之后,只需使用您正在制作的 contracts[]
中的 Contract
调用 reqHistData
。它将填写所有字段。
请注意,您可以获得的历史数据量是有限制的。为每个请求估计 2000 个柱,因此每个请求你可以获得 2000 秒的 1s 柱。每 10 秒一个请求。我什至不确定期权历史数据是否可以追溯到 5 个月前。当询问过期合同的历史数据时,您需要设置 contract.m_includeExpired = True
https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm
我没有足够的声誉来评论我想对这个问题发表评论而不是提交答案但是我读过的所有内容都说你无法通过 IB 检索过期期权合约的历史数据API.
事实上,Brian 提到的 URL (https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm) 引用了以下内容:
历史数据请求仅适用于当前到期。
所以你很可能是在浪费时间。历史期权数据可能很大,所以我明白为什么。它也非常昂贵,在一天结束时足够便宜 - 你可以从 http://ivolatility.com but intraday gets expensive. I use https://datashop.cboe.com 获得它,但他们的服务速度和客户服务技能肯定是缺乏的,但可以只要求一台仪器,任何时间段和频率你想要的是我喜欢的灵活性。
我正在尝试通过 Interactive Brokers API 获得 SPY 上的底层证券和期权,虽然获得当前期权(罢工权、权利等)不是问题,但我仍然坚持获取历史数据,比如从 5 个月前到现在。
代码如下:
from ib.ext.Contract import Contract
from ib.ext.ContractDetails import ContractDetails
from ib.opt import ibConnection, message
import time
import datetime
def watcher(msg):
print(msg)
def contractDetailsHandler(msg):
contracts.append(msg.contractDetails.m_summary)
def contractDetailsEndHandler(msg):
global DataWait
DataWait = False
def contractHistDetailsHandler(msg):
contracts.append(msg.contractDetails.m_summary)
con = ibConnection()
con.host = "..."
con.port = ...
con.clientId = 5
con.registerAll(watcher)
con.register(contractDetailsHandler, 'ContractDetails')
con.register(contractDetailsEndHandler, 'ContractDetailsEnd')
con.register(contractHistDetailsHandler, message.historicalData)
con.connect()
contract = Contract()
contract.m_exchange = "SMART"
contract.m_secType = "OPT"
contract.m_symbol = "SPY"
contract.m_currency = "USD"
endtime = '20170102 01:00:00'
#con.reqContractDetails(1, contract)
con.reqHistoricalData(2,contract,endtime,"5 M","1 sec","TRADES",0,1)
con.reqHistoricalData(3,contract,endtime,"5 M","1 sec","MIDPOINT",0,1)
contracts = []
DataWait = True ; i = 0
while DataWait and i < 90:
i += 1 ; print(i),
time.sleep(1)
con.disconnect()
con.close()
print(contracts)
我得到的是:
<error id=2, errorCode=321, errorMsg=Error validating request:-'yd' : cause - When the local symbol field is empty, please fill all option fields (right, strike, expiry))>
现在我知道Contract 对象不包含那些,但是如何知道权利、行使价和到期日呢?这基本上就是我所需要的(在选择期间有日期和基本变化)。是否有不同的方法?
如果您能给我一些指点,那将是非常欢迎的!或所选范围内标的和期权的替代来源(无论是否支付;uni 项目需要它)。
非常感谢您!非常感谢任何意见。
您正在注释掉合同详细信息的请求。你需要这样做,但你会得到很多(我得到 ~5000)。要缩小范围,请尝试设置一些到期日、行使价和权利。
例如。所有 230 个电话
contract.m_strike = 230
contract.m_right = "CALL"
那我只拿到30个合同
在 contractDetailsEndHandler(msg):
你会知道你已经收到了所有的合同。之后,只需使用您正在制作的 contracts[]
中的 Contract
调用 reqHistData
。它将填写所有字段。
请注意,您可以获得的历史数据量是有限制的。为每个请求估计 2000 个柱,因此每个请求你可以获得 2000 秒的 1s 柱。每 10 秒一个请求。我什至不确定期权历史数据是否可以追溯到 5 个月前。当询问过期合同的历史数据时,您需要设置 contract.m_includeExpired = True
https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm
我没有足够的声誉来评论我想对这个问题发表评论而不是提交答案但是我读过的所有内容都说你无法通过 IB 检索过期期权合约的历史数据API.
事实上,Brian 提到的 URL (https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm) 引用了以下内容:
历史数据请求仅适用于当前到期。
所以你很可能是在浪费时间。历史期权数据可能很大,所以我明白为什么。它也非常昂贵,在一天结束时足够便宜 - 你可以从 http://ivolatility.com but intraday gets expensive. I use https://datashop.cboe.com 获得它,但他们的服务速度和客户服务技能肯定是缺乏的,但可以只要求一台仪器,任何时间段和频率你想要的是我喜欢的灵活性。