盈透证券 - 获取OPT的历史数据(中点和交易)



我正在尝试通过盈透证券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))>

现在我知道合约对象不包含这些,但是怎么知道权利,罢工和到期?这基本上是我需要的(在选项期间有一个日期和潜在的变化)。有没有不同的方法?

如果你能给我一些指示,那将是非常受欢迎的!或者标的和期权的替代来源,带有所选范围的行使价、权利和到期日(无论是否付费;uni 项目需要它)。

事先非常感谢!任何意见都非常感谢。

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

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

历史数据请求仅适用于当前到期时间。

所以你可能会浪费你的时间。历史期权数据可能很大,所以我明白为什么。它也非常昂贵,足够便宜,可以结束一天 - 你可以从 http://ivolatility.com 买到它,但盘中会变得昂贵。我使用 https://datashop.cboe.com 但他们的服务速度和客户服务技能肯定缺乏,但能够只要求一种乐器,您想要的任何时间段和频率是我喜欢的灵活性。

您正在注释掉对 contractDetails 的请求。 你需要这样做,但你会得到很多(我得到~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

相关内容

  • 没有找到相关文章

最新更新