问题描述
|
我正在迁移一些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
解决方法
您可以进一步利用YQL的链接查询功能
SELECT * FROM yahoo.finance.options WHERE symbol=\"%s\" AND expiration in (SELECT contract FROM yahoo.finance.option_contracts WHERE symbol=\"%s\")
显然,%s是您要查找的符号。这将从所有可用的到期日期中提取所有期权链,并为您节省几个查询。
, 如果您没有在YQL查询中设置到期日期,那么我认为数据集的到期日期将是该月的下一个第三个星期五。使用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]
(请注意:上面的代码会忽略假期,在这种情况下,到期日期将是第三个星期四。...如果您使用此代码,请确保还检查当当前日期是Google的第三个星期五时Yahoo决定返回的内容。月-我不确定到期日期是当前日期还是下个月的第三个星期五。)
要查看特定到期年/月(即将到来的第三个星期五除外)的期权链,您可以使用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\"
)
\'\'\')
有趣的是,当请求多个到期数据时,,5ѭ确实包含一个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\'}
, 为了获取可用合同日期的列表,请使用yahoo.finance.option_contracts。要继续您的代码(我非常感谢),您可以打印所有可能的put选项,如下所示:
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
, 如果您未在YQL查询中设置到期日期,那么我认为该月(最快于今天)到期的合同将返回数据集。这些不一定是每月的选择,于第三星期五到期。返回的数据集可能是本月到期的每周或四次选择权(如果您的基础有一个)。
即使您在每个月到期的几天后(第3个星期五)发出查询,也有可能会获得本月到期的数据,而不是下个月的每月数据。
因此,正如unutbu所建议的那样,总是发出具有指定的到期月份的查询是有意义的,以便在返回的数据集中接收到期日期,并确切地知道您得到了什么。甚至更好,并指定了到期日期。
糟糕的是,查询yahoo.finance.option_contracts表不会返回到期日期,而仅返回月份。而且,这无助于找出您的底层证券是否具有除月度之外的其他选项以及它们的到期日期。