我正在迁移一些Yahoo Finance CSV /屏幕抓取界面以使用YQL,并且正在努力使用yahoo.finance.options表。如果我查询给定符号的所有选项,我找不到与选项关联的到期日期。如果我查询符号和到期,那么我找到与链相关的到期日期,但不是其中的选项。虽然我熟悉期权到期的周期并且可以从给定日期开始引导它,但这是一个糟糕的解决方案;首先,它会产生更多的查询。我更倾向于从数据中反省它,因为它应该可用(它可以被屏幕删除)。有人知道怎么用YQL来解决这个问题,还是我运气不好?
这是我正在使用的一些python代码:
from xml.etree.ElementTree import ElementTree
import urllib, urllib2
class YQL(object):
url = 'http://query.yahooapis.com/v1/public/yql'
env = 'store://datatables.org/alltableswithkeys'
format = 'xml'
@classmethod
def query(cls, string):
q = urllib.quote(string)
url = cls.url + '&'.join(('?q=%s' % q, 'env=%s' % cls.env,
'format=%s' % cls.format))
resp = urllib2.urlopen(url)
return ElementTree(file=resp).getroot().find('results')[:]
chain = YQL.query('select * from yahoo.finance.options where symbol="WFC"')[0]
chain.attrib
option = chain[0]
option.attrib
for attr in option:
print attr.tag, attr.text
答案 0 :(得分:4)
您可以进一步利用YQL使用
链接查询的功能SELECT * FROM yahoo.finance.options WHERE symbol="%s" AND expiration in (SELECT contract FROM yahoo.finance.option_contracts WHERE symbol="%s")
显然,%s是你正在寻找的符号。这将从所有可用的到期日期中提取所有选项链,并为您节省多个查询。
答案 1 :(得分:1)
如果您没有在YQL查询中设置过期日期,那么我认为数据集的到期日期将是该月的即将到来的third Friday。使用dateutil,您可以使用以下命令在Python中定义此日期:
import dateutil.relativedelta as relativedelta
import dateutil.rrule as rrule
import datetime as dt
expiration=rrule.rrule(
rrule.MONTHLY,
byweekday=(relativedelta.FR(3)), dtstart=dt.datetime.now())[0]
(注意:上面的代码忽略了假期,在这种情况下,到期日期将是第三个星期四....如果您使用此代码,请务必同时检查雅虎在当天是第三天时决定返回的内容本月周五 - 我不确定到期日期是当前日期还是下个月的第三个星期五。)
要查看特定到期年/月的选项链(除了即将到来的第三个星期五),您可以使用YQL查询,例如:
chain = YQL.query('''
select * from yahoo.finance.options
where symbol="WFC" and expiration="2011-08"''')[0]
可以在一个YQL查询中获取有关多个过期的数据:
chains = YQL.query('''
select * from yahoo.finance.options
where symbol="WFC" and (
expiration="2011-08" or
expiration="2011-10" or
expiration="2012-01"
)
''')
有趣的是,当请求多个过期的数据时,chain.attrib
确实包含expiration
密钥:
for chain in chains:
print(chain.attrib)
# for option in chain:
# print(option.attrib)
# for attr in option:
# print attr.tag, attr.text
# print('-'*80)
产量
{'symbol': 'WFC', 'expiration': '2011-08-19'}
{'symbol': 'WFC', 'expiration': '2011-10-21'}
{'symbol': 'WFC', 'expiration': '2012-01-20'}
答案 2 :(得分:1)
要获取可用合约日期列表,请使用yahoo.finance.option_contracts。要继续你的代码(我赞赏),你可以打印所有可能的看跌期权,如下所示:
xml_dates = YQL.query('select * from yahoo.finance.option_contracts where ' +
'symbol="HYG"')[0]
dates = []
for attr in xml_dates:
print attr.tag, attr.text
dates.append(attr.text)
for expiration in dates:
xml_contracts = YQL.query('select * from yahoo.finance.options where '
+'symbol="HYG" AND expiration="' + expiration +'"')
for option in xml_contracts[0]:
if (option.attrib['type']=='P'):
print 'Put: strike=' + option.findtext('strikePrice')+ ', lowball '
+ 'ask=' + option.findtext('ask') + ', date='+ expiration
答案 3 :(得分:1)
如果您没有在YQL查询中设置过期日期,那么我认为将在本月最快到期的合同(但比今天晚些时候)返回合同数据集。这些不一定是每月选项,在第三个星期五到期。返回的数据集可以是本月到期的周报或四分之一选项(如果你的底层有的)。 即使您在月份到期后的几天(周五第3天)发出查询,您也有可能获得本月到期而非下个月月份的数据。
因此,正如unutbu建议的那样,总是发出指定到期月份的查询以在返回的数据集中接收到期日期,并且确切地知道你得到了什么。甚至更好,指定到期日期。
太糟糕了,查询yahoo.finance.option_contracts表不会返回到期日期,只是月份。并且它无助于查明您的底层证券是否具有月份以外的期权及其到期日期。