使用 ib insync (Python) 从 IB api 获取选项链

问题描述 投票:0回答:3

我有这个简单的脚本来获取 IB 中期权链的所有期权价格。我的问题是它非常慢(每个合约 11 秒)。我知道我可以使用多重处理,但似乎仍然必须有更好的方法来做到这一点。我喜欢 ib insync 的简单性,并且希望尽可能远离常规的 ib api 包。 非常感谢您的帮助

from ib_insync import *

ib = IB()
ib.connect('127.0.0.1', 4001, clientId=666, timeout = 11)


def get_multiple_expirations_strikes(exp_list,strike_list):

    for i in exp_list:
        print('Expiration: ', i)
        for x in strike_list:
            for k in ['C','P']:
                contract = Option('AAPL', i, x, k, 'SMART')
                details = ib.reqTickers(contract)
                print ('strike: ',x,' C/P: ',k," ",details[0].close)

上面的代码看起来工作正常,但速度很慢。我尝试添加多处理,但显然这对于 ib insync 来说效果不佳。下面的代码使用星图,但返回错误。

from ib_insync import *
import multiprocessing


ib = IB()
ib.connect('127.0.0.1', 4001, clientId=666, timeout=11)

def get_contract(symbol,exp,strike,kind):

    contract = Option(symbol, exp, strike, kind, 'SMART')
    details = ib.reqTickers(contract)
    print('strike: ', strike, ' C/P: ', kind, " ", details[0].close)



def get_multiple_expirations_strikes(symbol,exp_list,strike_list):

    inputs = []
    for i in exp_list:
        for x in strike_list:
            for k in ['C','P']:
                inputs.append([symbol,i,x,k])


    with multiprocessing.Pool(processes= 3) as pool:
        g = pool.starmap(get_contract,inputs)


    print(g)

get_multiple_expirations_strikes('AAPL',['20191115', '20200320'],[155.0, 160.0, 165.0, 170.0])
ib.disconnect()

错误信息: OSError:[Errno 9] 错误的文件描述符

python finance
3个回答
1
投票

这是一个旧线程,因此您的问题很可能很久以来就会得到解决。 尽管如此... 我认为问题在于你正在一份一份地获取合同。 您可以获取整个选项链,如下所示: https://nbviewer.org/github/erdewit/ib_insync/blob/master/notebooks/option_chain.ipynb


1
投票

如果有人仍然遇到此问题,请尝试以下操作:

option_contract = Option('SPY', '20230313', 390, 'C', 'SMART')
data = ib.reqTickers(option_contract)
print(data[0].marketPrice())

0
投票

如果我未来需要 ES 选项怎么办?我必须使用什么符号?此代码适用于 SPY,但不适用于 ES。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.