首页 > 解决方案 > 风险指数超出范围

问题描述

我看到很多帖子都处理相同的问题,但没有找到我的具体问题的答案。

我正在运行两个循环:-loop 1 获取一堆不同的股票名称并将它们添加到 yahoo Finance API URL 以获取它们的期权数据。因为每只股票都有多种期权,我正在运行循环 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

一段时间后,shell 返回:

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

标签: pythonlistindexingrangeout

解决方案


这不是一个完整的答案,但这里有一些解决问题的建议。

请注意,错误出现在这一行:

 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 = [],这将为您提供有关错误发生原因的线索。

祝你好运!


推荐阅读