2015-11-19 40 views
0

由于某些未知原因,当我运行下面的脚本时,以下错误与所需的输出一起返回。出于某种原因,昨天晚上这个工作没有任何错误。 API输出每分钟都会改变,但我不希望返回KeyError。我只是不能准确判断这个错误是来自:Python JSON KeyError for non missing key

[u'@AAPL 151204C00128000'] <----- What I want to see printed 

Traceback (most recent call last): 

File "Options_testing.py", line 60, in <module> 
main() 
File "Options_testing.py", line 56, in main 
    if quotes[x]['greeks']['impvol'] > 0: #change this for different greek vals 

KeyError: 'impvol' 

下面是数据的一个小片段:

{"results":{"optionchain":{"expire":"all","excode":"oprac","equityinfo":{"longname":"Apple Inc","shortname":"AAPL"},"money":"at","callput":"all","key":{"symbol":["AAPL"],"exLgName":"Nasdaq Global Select","exShName":"NGS","exchange":"NGS"},"symbolstring":"AAPL"},"quote":[{"delaymin":15,"contract":{"strike":108,"openinterest":3516,"contracthigh":6.16,"contractlow":0.02,"callput":"Put","type":"WEEK","expirydate":"2015-11-13"},"root":{"equityinfo":{"longname":"Apple Inc","shortname":"AAPL"},"key":{"symbol":["AAPL"],"exLgName":"Nasdaq Global Select","exShName":"NGS","exchange":"NGS"}},"greeks":{"vega":0,"theta":0,"gamma":0,"delta":0,"impvol":0,"rho":0} 

代码:

#Options screener using Quotemedia's API 
import json 
import requests 
#import csv   

def main():   


    url_auth= "https://app.quotemedia.com/user/g/authenticate/v0/102368/XXXXX/XXXXX" 
    decode_auth = requests.get(url_auth)   

    #print decode_auth.json() 
    #print(type(decode_auth))   

    auth_data = json.dumps(decode_auth.json())   

    #Parse decode_auth, grab 'sid'   

    sid_parsed = json.loads(auth_data)["sid"] 
    #print sid_parsed   

    #Pass sid into qm_options 
    #Construct URL   

    symbol = 'AAPL' 
    SID = sid_parsed 
    url_raw = 'http://app.quotemedia.com/data/getOptionQuotes.json?webmasterId=102368' 


    url_data = url_raw + '&symbol=' + symbol + '&greeks=true' + '&SID=' + SID   

    #print url_data   

    response = requests.get(url_data) 
    #print response 
    data = json.dumps(response.json()) 
    #print data   

    #save data to a file    

    with open('AAPL_20151118.json', 'w') as outfile: 
     json.dumps (data, outfile)   

    #Turn into json object 
    obj = json.loads(data)   

    #slim the object 
    quotes = obj['results']['quote']   

    #find the number of options contracts 
    range_count = obj['results']['symbolcount']   

    #print all contracts with an implied vol > 0 
    for x in range(0,range_count): 
     if quotes[x]['greeks']['impvol'] > 0: #change this for different greek vals 
      print quotes[x]['key']['symbol']   

if __name__ == '__main__': 
    main() 

我可以提供,如果样本数据必要。

+1

请你为什么要使用'response.json()格式化数据片断是代码视图以及 – mmenschig

+0

'只是'数据= json.dumps(response.json())'和那么'obj = json.loads(data)'又一次? –

+0

该数据片段不完整。至少,“报价”列表永远不会终止。 –

回答

1
for x in range(0,range_count): 
    if quotes[x]['greeks']['impvol'] > 0: #change this for different greek vals 
     print quotes[x]['key']['symbol'] 

这个循环通过量多报价,因此也许有甚至只是一个不具有impvol财产。

您应该添加一些错误处理,以便您了解何时发生。事情是这样的:

# no need to iterate over indexes, just iterate over the items 
for quote in quotes: 
    if 'greeks' not in quote: 
     print('Quote does not contain `greeks`:', quote) 
    elif 'impvol' not in quote['greeks']: 
     print('Quote does not contain `impvol`:', quote) 

    elif quote['greeks']['impvol'] > 0: 
     print quote['key']['symbol'] 
+0

我没有想到这一点。这可能解释了收市后和现在收益之间的差异。让我试试看看会发生什么。谢谢。 – user2578013

+0

你说得对。这就是发生了什么事。有一些选择合同没有impvol。我猜我假设太多了。非常感谢 :) – user2578013