Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 交互式经纪人-获取OPT的历史数据(中点和交易)_Python_Api_Interactive Brokers_Ibpy - Fatal编程技术网

Python 交互式经纪人-获取OPT的历史数据(中点和交易)

Python 交互式经纪人-获取OPT的历史数据(中点和交易),python,api,interactive-brokers,ibpy,Python,Api,Interactive Brokers,Ibpy,我正试图通过Interactive Brokers API获取SPY上的基础和期权,虽然获取当前期权(包括strike、right等)不是问题,但我一直在获取历史数据,比如从5个月前到现在 代码如下: from ib.ext.Contract import Contract from ib.ext.ContractDetails import ContractDetails from ib.opt import ibConnection, message import time import d

我正试图通过Interactive Brokers API获取SPY上的基础和期权,虽然获取当前期权(包括strike、right等)不是问题,但我一直在获取历史数据,比如从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)
来自ib.ext.Contract导入合同
从ib.ext.ContractDetails导入ContractDetails
从ib.opt导入ibConnection,消息
导入时间
导入日期时间
def监视程序(msg):
打印(msg)
def contractDetailsHandler(消息):
contracts.append(msg.contractDetails.m_摘要)
def contractDetailsEndHandler(消息):
全局数据等待
DataWait=False
def contractHistDetailsHandler(消息):
contracts.append(msg.contractDetails.m_摘要)
con=ibConnection()
con.host=“…”
con.port=。。。
con.clientId=5
监狱登记处(看守人)
合同登记册(合同详细资料“合同详细资料”)
con.register(contractDetailsEndHandler,'ContractDetailsEnd')
控制寄存器(contractHistDetailsHandler,message.historicalData)
con.connect()
合同
contract.m_exchange=“智能”
contract.m_secttype=“OPT”
contract.m_symbol=“间谍”
合同货币=美元
结束时间='20170102 01:00:00'
#合同详情(1,合同)
合同要求历史数据(2,合同,结束时间,“5米”,“1秒”,“交易”,0,1)
合同要求历史数据(3,合同,结束时间,“5米”,“1秒”,“中点”,0,1)
合同=[]
DataWait=True;i=0
当数据等待且i<90时:
i+=1;印刷品(i),
时间。睡眠(1)
con.disconnect()
con.close()
打印(合同)
我得到的只是:

<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项目需要)


非常感谢您的光临!非常感谢您的任何意见。

您正在对合同详细信息的请求进行注释。你需要这样做,但你会得到很多(我得到~5000)。若要缩小范围,请尝试设置一些到期日、罢工和权利

总共230个电话

contract.m_strike = 230
contract.m_right = "CALL"
那么我只得到30份合同

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

请注意,您可以获得的历史数据量存在限制。每个请求估计2000条,所以每个请求只能得到2000秒的1s条。每10秒有一个请求。我甚至不确定期权历史数据是否可以追溯到5个月前。当询问过期合同的历史数据时,您需要设置
contract.m\u includeExpired=True


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

实际上,Brian提到的URL()引用了以下内容:

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

所以你很可能是在浪费时间。历史期权数据可能非常庞大,因此我理解其中的原因。它也很贵,便宜到可以在一天结束的时候买到——你们可以在一天之内买到,但在一天之内会很贵。我用过,但他们的服务速度和客户服务技能肯定是缺乏的,但能够要求一个仪器,任何时间和频率,你想要的是灵活性,我喜欢