YQL Options expiration - PullRequest
       9

YQL Options expiration

3 голосов
/ 25 июня 2011

Я перевожу некоторые интерфейсы 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

Ответы [ 4 ]

4 голосов
/ 02 февраля 2012

Вы можете в дальнейшем воспользоваться возможностью YQL для цепочки запросов с помощью

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

Где% s - это символ, который вы ищете, очевидно. Это приведет ко всем цепочкам опционов со всех доступных дат истечения срока действия и сэкономит вам несколько запросов.

1 голос
/ 19 августа 2012

Если вы не установите дату истечения срока действия в запросе YQL, то я думаю, что набор данных будет возвращен для контрактов, срок действия которых истекает в ближайшее время в этом месяце (но позже, чем сегодня).Это не обязательно ежемесячные опционы, срок действия которых истекает в третью пятницу.Возвращенный набор данных может быть для опций на неделю или кварталы, срок действия которых истекает в этом месяце (если они есть в вашем базовом пакете).Даже если вы выполните запрос через несколько дней после истечения месяца (3-я пятница), есть вероятность, что вы получите данные для чего-то, срок действия которого истекает в этом месяце, а не в следующем месячном месяце.

Итак, какПо предложению unutbu имеет смысл всегда выдавать запросы с указанием месяца окончания срока действия, чтобы получить дату окончания срока действия в возвращенном наборе данных, и точно знать, что вы получаете.Или, что еще лучше, с указанием срок действия .

Жаль, что запрос к таблице yahoo.finance.option_contracts не возвращает срок действия , только месяц.И это не помогает выяснить, есть ли у вашего базового актива варианты, отличные от месячных, и даты их истечения.

1 голос
/ 13 октября 2011

Чтобы получить список доступных дат контракта, используйте 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
1 голос
/ 25 июня 2011

Если вы не установите дату истечения срока в 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]

(Примечание. Приведенный выше код игнорирует праздничные дни, в этом случае датой истечения будет третий четверг ...Если вы используете этот код, обязательно проверьте, что 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"
        )
    ''')

Интересно, что при запросе данных о множественном сроке действия 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'}
...