YQL 是否不可靠地返回正确数据 - 有什么替代方案吗?

2 投票
1 回答
1955 浏览
提问于 2025-04-17 12:49

我正在写一个应用程序,用来根据公司的市值和股息收益率来选择公司。这个程序使用Yahoo!的YQL REST API来获取这些数据。昨天看起来一切正常,但今天我发现我的程序显示其中一家公司有65.95%的收益率!没问题,这肯定是我代码里的一个bug。我本以为是这样。但当我查看YQL网址上股票的xml内容时:

http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol in ("MRO")&env=store://datatables.org/alltableswithkeys

我看到的xml内容在帖子底部。我把它完整粘贴在这里,因为周末后有人查看时内容会不同。

往下滚动到最底部,你会看到实际上显示马拉松石油公司(MRO)的股息收益率是65.95%。你可以在DividendYield标签的内容中看到这个数据。

当我查看Yahoo!的财经网站时:

http://finance.yahoo.com/q?s=mro

它显示的收益率要合理得多:

Div & Yield:    0.68 (2.10%)

那么,我是不是误解了这些数据(我希望是这样)?为什么我在他们公开网站上看到的和从查询中得到的结果不一样?难道他们不是用同一个数据库吗?

如果这些内容不可靠,请推荐我一个其他的工具。我的应用是用python写的。

如果有帮助,这里有一段简单的代码示例:

#!/usr/bin/env python 

import yql
y = yql.Public()
q = 'use "http://www.datatables.org/yahoo/finance/yahoo.finance.quotes.xml" as yahoo.finance.quotes; select * from yahoo.finance.quotes where symbol in ("MRO")'
result = y.execute(q)
print result.rows[0]['DividendYield']

输出:

65.95

谢谢!


编辑于2012年2月11日:

在我发帖的第二天,我在Yahoo!开发者网络上发现了这个:

http://developer.yahoo.com/forum/YQL/yahoo-finance-quotes-data-very-inaccurate/1313170622678-7121b5e0-317d-4a87-bd58-7a27cb8a62ce

那里很多人评论说在各种字段中获取到错误的数据。

谷歌也有一个API可以用来收集数据。这里有一个关于同一家公司(MRO)的示例:

http://www.google.com/ig/api?stock=MRO

也许这对其他人有帮助,但似乎不包含股息信息,而这对我来说是非常重要的。

有没有人写过一个应用程序,使用他们喜欢的来源来编程收集股票数据?如果有,请分享一下——我愿意换个方向。顺便说一下:我不需要实时数据。通常我会在下班后市场关闭后不频繁地运行我的应用。

谢谢。


<query yahoo:count="1" yahoo:created="2012-02-11T06:30:09Z" yahoo:lang="en-US"><results><quote symbol="MRO"><Ask/>
<AverageDailyVolume>7003410</AverageDailyVolume>
<Bid/>
<AskRealtime>36.00</AskRealtime>
<BidRealtime>32.73</BidRealtime>
<BookValue>23.79</BookValue>
<Change_PercentChange>+0.55 - +1.69%</Change_PercentChange><Change>+0.55</Change>
<Commission/>
<ChangeRealtime>+0.55</ChangeRealtime>
<AfterHoursChangeRealtime>N/A - N/A</AfterHoursChangeRealtime>
<DividendShare>21.50</DividendShare>
<LastTradeDate>2/10/2012</LastTradeDate>
<TradeDate/>
<EarningsShare>4.125</EarningsShare>
<ErrorIndicationreturnedforsymbolchangedinvalid/>
<EPSEstimateCurrentYear>3.66</EPSEstimateCurrentYear>
<EPSEstimateNextYear>4.38</EPSEstimateNextYear>
<EPSEstimateNextQuarter>0.89</EPSEstimateNextQuarter>
<DaysLow>32.04</DaysLow>
<DaysHigh>33.16</DaysHigh>
<YearLow>19.13</YearLow>
<YearHigh>54.33</YearHigh>
<HoldingsGainPercent>- - -</HoldingsGainPercent>
<AnnualizedGain/>
<HoldingsGain/>
<HoldingsGainPercentRealtime>N/A - N/A</HoldingsGainPercentRealtime>
<HoldingsGainRealtime/>
<MoreInfo>cnsprmiIed</MoreInfo>
<OrderBookRealtime/>
<MarketCapitalization>23.328B</MarketCapitalization>
<MarketCapRealtime/>
<EBITDA>6.846B</EBITDA>
<ChangeFromYearLow>+14.02</ChangeFromYearLow>
<PercentChangeFromYearLow>+73.29%</PercentChangeFromYearLow>
<LastTradeRealtimeWithTime>N/A - <b>33.15</b>
</LastTradeRealtimeWithTime>
<ChangePercentRealtime>N/A - +1.69%</ChangePercentRealtime>
<ChangeFromYearHigh>-21.18</ChangeFromYearHigh>
<PercebtChangeFromYearHigh>-38.98%</PercebtChangeFromYearHigh>
<LastTradeWithTime>Feb 10 - <b>33.15</b>
</LastTradeWithTime>
<LastTradePriceOnly>33.15</LastTradePriceOnly>
<HighLimit/>
<LowLimit/>
<DaysRange>32.04 - 33.16</DaysRange>
<DaysRangeRealtime>N/A - N/A</DaysRangeRealtime>
<FiftydayMovingAverage>31.2758</FiftydayMovingAverage>
<TwoHundreddayMovingAverage>27.2837</TwoHundreddayMovingAverage>
<ChangeFromTwoHundreddayMovingAverage>+5.8663</ChangeFromTwoHundreddayMovingAverage>
<PercentChangeFromTwoHundreddayMovingAverage>+21.50%</PercentChangeFromTwoHundreddayMovingAverage>
<ChangeFromFiftydayMovingAverage>+1.8742</ChangeFromFiftydayMovingAverage>
<PercentChangeFromFiftydayMovingAverage>+5.99%</PercentChangeFromFiftydayMovingAverage>
<Name>Marathon Oil Corp</Name>
<Notes/>
<Open>32.26</Open>
<PreviousClose>32.60</PreviousClose>
<PricePaid/>
<ChangeinPercent>+1.69%</ChangeinPercent>
<PriceSales>1.56</PriceSales>
<PriceBook>1.37</PriceBook>
<ExDividendDate>Nov 14</ExDividendDate>
<PERatio>7.90</PERatio>
<DividendPayDate>Mar 12</DividendPayDate>
<PERatioRealtime/>
<PEGRatio>0.99</PEGRatio>
<PriceEPSEstimateCurrentYear>8.91</PriceEPSEstimateCurrentYear>
<PriceEPSEstimateNextYear>7.44</PriceEPSEstimateNextYear>
<Symbol>MRO</Symbol>
<SharesOwned/>
<ShortRatio>2.60</ShortRatio>
<LastTradeTime>4:02pm</LastTradeTime>
<TickerTrend>&nbsp;++-+-=&nbsp;</TickerTrend>
<OneyrTargetPrice>37.19</OneyrTargetPrice>
<Volume>9239122</Volume>
<HoldingsValue/>
<HoldingsValueRealtime/>
<YearRange>19.13 - 54.33</YearRange>
<DaysValueChange>- - +1.69%</DaysValueChange>
<DaysValueChangeRealtime>N/A - N/A</DaysValueChangeRealtime>
<StockExchange>NYSE</StockExchange>
<DividendYield>65.95</DividendYield>
<PercentChange>+1.69%</PercentChange>
</quote>
</results>
</query>
<!-- total: 270 -->
<!-- engine5.yql.ac4.yahoo.com -->

1 个回答

7

这不是一个直接的答案,但我想给你解释一下你看到的情况:

雅虎并没有为雅虎财经提供官方的API(应用程序接口)。相反,这些YQL社区表格是从一些人反向工程得到的CSV文件中读取数据,这些文件是从雅虎财经网站提取的。这些文件会不定期更改,所以它并不是一个可靠的数据来源。我建议你不要用这些数据来开发任何“真正”的应用程序,因为这可能会违反服务条款。

如果你在YQL控制台尝试你的示例查询,你可以看到发生了什么。在输出结果中,查看<diagnostics>部分,你会发现它是从http://download.finance.yahoo.com/d/quotes.csv获取数据的。我觉得雅虎财经现在使用了完全不同的内部数据源,所以这可能就是你看到的数字不匹配的原因。

撰写回答