盈透经纪人 - 获取OPT的历史数据(MIDPOINT和TRADES)

时间:2017-01-06 17:25:33

标签: python api interactive-brokers ibpy

我试图通过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对象不包含那些,但是怎么能知道权利,罢工和到期?这基本上就是我所需要的(在选项期间有日期和潜在的变化)。那有不同的方法吗?

如果你能给我一些指示,那将是最受欢迎的!或者是所选范围的基础和期权的替代来源,包括罢工,权利和到期(无论是否支付;需要它用于单项目)。

非常感谢您!任何意见都非常感谢。

2 个答案:

答案 0 :(得分:2)

您正在评论对contractDetails的请求。你需要这样做,但你会得到很多(我得到〜5000)。为了缩小范围,尝试设置一些到期,罢工和正确。

例如。所有230个电话

contract.m_strike = 230
contract.m_right = "CALL"

然后我只得到30份合同。

contractDetailsEndHandler(msg):你知道你收到了所有合同。之后,只需使用您正在制作的reqHistData中的Contract来致电contracts[]。它将填写所有字段。

请注意,您可以获得的历史数据量有限制。估计每个请求的2000个条形,因此每个请求可以获得2000秒的1s条形。每10秒就有一个请求。我甚至不确定选项历史数据可以追溯到5个月。在询问过期合同的历史数据时,您需要设置contract.m_includeExpired = True

https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm

答案 1 :(得分:1)

我没有足够的声誉在这个问题上发表评论而不是提交答案,但我读过的所有内容都表明你无法通过IB API检索过期期权合约的历史数据。

事实上,Brian提到的网址(https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm)引用了以下内容:

历史数据请求仅适用于当前的到期日期。

所以你可能会浪费你的时间。历史选项数据可能很大,所以我理解为什么。这也是非常昂贵的,足够便宜的一天结束 - 你可以从http://ivolatility.com得到它,但在日内变得昂贵。我使用https://datashop.cboe.com但他们的服务速度和客户服务技能当然缺乏,但能够只需要一台仪器,您想要的任何时间和频率都是我喜欢的灵活性。