Индекс риска вне диапазона - PullRequest
0 голосов
/ 25 октября 2018

Я видел много постов, посвященных одному и тому же вопросу, но не нашел ответа на мой конкретный вопрос.

Я запускаю два цикла: -loop 1 берет несколько различных названий акций и добавляет их в URL API финансов Yahoo, чтобы получить данные опций.Поскольку каждая акция имеет множество опционов, я запускаю цикл 2, в котором цикл i находится в диапазоне (len (цены опционов из Интернета)), чтобы получить доступ к каждой цене каждого опциона для каждой акции.Все это работает примерно для 15 акций, затем останавливается с сообщением об ошибке «индекс списка вне диапазона»

Кто-нибудь имеет представление о том, что я делаю неправильно?Заранее спасибо.

код:

stock_list = ['TREE', 'TSLA', ...]

y = len(stock_list)
while True:
    for x in range(0,y):
        link =("https://query2.finance.yahoo.com/v7/finance/options/" + stock_list[x])
        try:
            optionchain = requests.get(link).json()
        except:
            optionchain = 0

        L = len(optionchain['optionChain']['result'][0]['options'][0]['calls'])
        while True:
            for i in range (L+1):
                try:
                    arbitrage =  optionchain['optionChain']['result'][0]['options'][0]['calls'][i]['lastPrice'] - (optionchain['optionChain']['result'][0]['options'][0]['calls'][i]['strike'] + optionchain['optionChain']['result'][0]['options'][0]['calls'][i]['ask'])
                except:
                    arbitrage = 0
                if arbitrage > 0:
                    print(stock_list[x])
                    print('pay: ')
                    print(100*optionchain['optionChain']['result'][0]['options'][0]['calls'][i]['ask'])
                    print('for a risk free profit of: ')
                    print(100*arbitrage)
                    print('info:')
                    print(optionchain['optionChain']['result'][0]['options'][0]['calls'][i])
                    print(' ')
                else:
                    print(stock_list[x], i, ' No arbitrage')
            break

через некоторое время оболочка возвращает:

LOXO 13  No arbitrage
LOXO 14  No arbitrage
Traceback (most recent call last):
  File "/Users/owner/Desktop/arbitrage option.py", line 18, in <module>
    L = len(optionchain['optionChain']['result'][0]['options'][0]['calls'])
IndexError: list index out of range

1 Ответ

0 голосов
/ 27 октября 2018

Это не полный ответ, но вот несколько советов по подходу к вашей проблеме.

Обратите внимание, что в этой строке появляется ошибка:

 L = len(optionchain['optionChain']['result'][0]['options'][0]['calls'])

Это дает вам подсказку окакой список и какой индекс может быть проблемой.

Теперь я вижу два места в этой строке, где вы получаете доступ к списку:

L = len(optionchain['optionChain']['result'][0]['options'][0]['calls'])
                                             ^             ^
                                             |             |
                                             Here          Here

Итак, одна из них должна быть проблемой.Но какой?

Чтобы выяснить это, попробуйте разбить длинную строку на две более короткие строки:

part_1 = optionchain['optionChain']['result'][0]
L = len(part_1['options'][0]['calls'])

Теперь, когда вы запустите его, вы получите более конкретный номер строки дляваша ошибка.

Допустим, например, что ошибка происходит в первой строке (part_1 =).

Почему происходит ошибка?

В одну сторонуузнать больше - распечатать список прямо перед тем, как вы к нему получите доступ:

list_1 = optionchain['optionChain']['result']
print('list_1 = ', list_1)
part_1 = list_1[0]
L = len(part_1['options'][0]['calls'])

Теперь, если вы увидите это list_1 = [], это даст вам подсказку о том, почему происходит ошибка.

Удачи!

...