【问题标题】:YQL Options expirationYQL 期权到期
【发布时间】:2011-09-22 13:58:38
【问题描述】:

我正在迁移一些 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

【问题讨论】:

    标签: python options yql


    【解决方案1】:

    您可以进一步利用 YQL 链接查询的能力

    SELECT * FROM yahoo.finance.options WHERE symbol="%s" AND expiration in (SELECT contract FROM yahoo.finance.option_contracts WHERE symbol="%s")
    

    显然,%s 是您正在寻找的符号。这将从所有可用的到期日期中提取所有期权链,并为您节省几个查询。

    【讨论】:

      【解决方案2】:

      如果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'}
      

      【讨论】:

      • 这就是我害怕的,但我最初的怀疑是我遗漏了一些东西,而不是表数据模型有明显的缺陷(使到期日期成为可选输入,但没有返回它查询结果中的任何位置)。
      • 感谢 unutbu,这很有帮助。到期将默认为前一个月是有道理的。但是,如果此接口需要对每个到期时间进行单独的查询,并且需要发现带外可用的到期时间(例如,过去几年是否可以使用 LEAPS),那么我想我会坚持使用屏幕抓取他们!暂时的财务选项页面。
      • 您如何处理选项数据。不仅是过期。可以用吗?
      【解决方案3】:

      要获取可用合同日期列表,请使用 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
      

      【讨论】:

        【解决方案4】:

        如果您没有在 YQL 查询中设置到期日期,那么我认为将返回本月到期最快(但比今天晚)的合约的数据集。这些不一定是每月选项,在第三个星期五到期。返回的数据集可能是本月到期的每周或每季度期权(如果您的底层证券有)。 即使您在每月(第三个星期五)到期后几天发出查询,您也有可能获得本月到期的数据,而不是下个月的数据。

        因此,正如 unutbu 建议的那样,始终发出指定到期月份的查询以在返回的数据集中接收到期日期并确切知道您得到什么是有意义的。或者甚至更好,指定到期日期

        太糟糕了,查询 yahoo.finance.option_contracts 表没有返回到期日期,只是月份。而且它也无助于查明您的底层证券是否有除月度外的期权以及它们的到期日。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-23
          • 2013-10-18
          • 1970-01-01
          • 2016-05-23
          • 1970-01-01
          相关资源
          最近更新 更多