python - 风险指数超出范围
问题描述
我看到很多帖子都处理相同的问题,但没有找到我的具体问题的答案。
我正在运行两个循环:-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
解决方案
这不是一个完整的答案,但这里有一些解决问题的建议。
请注意,错误出现在这一行:
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 = []
,这将为您提供有关错误发生原因的线索。
祝你好运!
推荐阅读
- appcelerator - Appcelerator 应用程序在装有 iOS 12 beta 11 的 iPhone X 上崩溃
- python - 不适用于数据集的转换
- python - Python 从 SQL 中检索列值
- unity3d - 当粒子第一次从 Unity 中的粒子系统发射时,有没有办法为粒子应用函数?
- office365 - 如何使用 Graph API 获取委托邮箱列表
- react-native - React Native-如何在 React Native 中显示一次启动视频?
- c# - C# Process DataReceivedEventHandler 只工作一次
- python - 如何将 3d 数组写入文本文件
- javascript - React Refs woth setState 给出了最大更新深度。
- sql - SQL 根据来自不同列的值排除具有多个值的记录