2011-06-25 41 views
3

我正在遷移一些Yahoo Finance CSV/screen-scraping接口以使用YQL,並且正在使用yahoo.finance.options表格掙扎。如果我查詢給定符號的所有選項,我沒有找到與選項關聯的到期日期。如果我查詢符號和到期日,那麼我會發現與該鏈有關的到期日期,但不是其中的選項。雖然我熟悉期權到期週期,並可以從給定的日期啓動它,但這是一個糟糕的解決方案;一方面,它會產生更多的查詢。我更喜歡從數據中反思它,因爲它應該是可用的(它可以被屏幕刮掉)。任何人都知道如何在YQL中做到這一點,還是我運氣不好?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 

回答

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'} 
+0

這就是我害怕的,但我最初的懷疑是我錯過了一些東西,而不是表數據模型有一個明顯的缺陷(使過期日期爲可選輸入,但不返回查詢結果中的任何地方)。 – csingley

+0

感謝unutbu,這很有幫助。這是有道理的,到期將默認爲前一個月。然而,如果這個接口每次到期需要一個單獨的查詢,並且它需要一個發現帶外可用過期(例如LEAPS是否可用於後幾年),那麼我想我會堅持屏幕刮擦他們!財務選項頁面暫時。 – csingley

+0

你對這個選項數據的看法如何?不僅是到期。它可以被使用嗎? – Merlin

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 
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

如果您沒有在YQL查詢中設置到期日期,那麼我認爲該數據集將返回本月即將到期的合約(但晚於今天)。這些不一定是月度期權,將在第三個星期五到期。返回的數據集可能用於本週到期的週期或季度期權(如果您的基礎有一個)。 即使您在月份(第3個星期五)到期後幾天發出查詢,您也有可能獲得本月到期的數據而非下個月月份的數據。

因此,正如unutbu建議的那樣,在返回的數據集中指定接收到期日期的指定過期月份的查詢是有意義的,並且確切知道您得到的是什麼。或者更好,用指定有效期限

太糟糕了,查詢yahoo.finance.option_contracts表不會返回到期日期,只是月份。而且它無助於發現您的基礎是否有月份以外的選項以及期限。