Получение цепочки опций из IB api с использованием ib insync (Python) - PullRequest
0 голосов
/ 29 октября 2019

У меня есть этот простой скрипт, чтобы получить все цены опционов для цепочки опционов в 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. Код ниже использует starmap, но возвращает сообщение об ошибке.

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] Неверный дескриптор файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...