【问题标题】:How to make yahoo finance YQL query more than 1 year stock data?如何让yahoo Finance YQL查询超过1年的股票数据?
【发布时间】:2016-11-24 02:12:38
【问题描述】:

我正在使用 Tableau Web 连接器来下载股票价格。源代码如下:

<html>
<meta http-equiv="Cache-Control" content="no-store" />
<head>
  <title>Stock Quote Connector-Tutorial</title>
  <script src="https://connectors.tableau.com/libs/tableauwdc-1.1.1.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>

  <script type="text/javascript">
  (function() {

    function buildUri(tickerSymbol, startDate, endDate) {
      var startDateStr = getFormattedDate(startDate);
      var endDateStr   = getFormattedDate(endDate);
      var queryStatement = 'select * from yahoo.finance.historicaldata where symbol = "' +
                            tickerSymbol +
                           '" and startDate = "' + startDateStr +
                           '" and endDate = "' + endDateStr + '"';
      var uri = 'http://query.yahooapis.com/v1/public/yql?q=' +
                encodeURIComponent(queryStatement) +
                "&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json";
      return uri;
    }

    function getFormattedDate(date) {
        // Return a date in the format YYYY-MM-DD
        return date.getUTCFullYear()  +
               '-' +
               makeTwoDigits(date.getUTCMonth() + 1) +
               '-' +
               makeTwoDigits(date.getUTCDate());
    }

    function makeTwoDigits(num) {
       // Pad a digit to be two digits with leading zero
       return num <= 9 ? "0" + num.toString() : num.toString();
    }

    var myConnector = tableau.makeConnector();

    myConnector.getColumnHeaders = function() {
        var fieldNames = ['Ticker', 'Day', 'Close'];
        var fieldTypes = ['string', 'date', 'float'];
        tableau.headersCallback(fieldNames, fieldTypes);
    }

    myConnector.getTableData = function(lastRecordToken) {
        var dataToReturn = [];
        var hasMoreData = false;

        // Get parameter values and build YQL query
        var ticker = tableau.connectionData;
        var endDate = new Date();
        var startDate = new Date();
        startDate.setYear(endDate.getFullYear() - 1);
        //startDate.setYear(startDate.getFullYear() - 1);
        //startDate.setYear(startDate.getFullYear() - 1);
        //startDate.setYear(startDate.getFullYear() - 1);
        var connectionUri = buildUri(ticker, startDate, endDate);

        var xhr = $.ajax({
          url: connectionUri,
          dataType: 'json',
          success: function (data) {
              if (data.query.results) {
                var quotes = data.query.results.quote;
                var ii;
                for (ii = 0; ii < quotes.length; ++ii) {
                    var entry = {'Ticker': quotes[ii].Symbol,
                                 'Day': quotes[ii].Date,
                                 'Close': quotes[ii].Close};
                    dataToReturn.push(entry);
                }
                tableau.dataCallback(dataToReturn, lastRecordToken, false);
              }
              else {
                  tableau.abortWithError("No results found for ticker symbol: " + ticker);
              }
          },
          error: function (xhr, ajaxOptions, thrownError) {
              tableau.log("Connection error: " + xhr.responseText + "\n" + thrownError);
              tableau.abortWithError("Error while trying to connect to the Yahoo stock data source.");
          }
        });
      }
      tableau.registerConnector(myConnector);
  })();

  $(document).ready(function() {
    $("#submitButton").click(function() {
      var tickerSymbol = $('#ticker').val().trim();
      if (tickerSymbol) {
        tableau.connectionName = "Stock Data for " + tickerSymbol;
        tableau.connectionData = tickerSymbol;
        tableau.submit();
      }
    });
  });
</script>
</head>
<body>
  <p>Enter a stock ticker symbol: <input type="text" id="ticker" /></p>
  <p><button type="button" id="submitButton">Get the Data</button></p>
  </body>
</html>

当我们只想下载1年的数据时,该代码是可行的,但是如果我们将时间更改为超过1年(enddate.year - startdate.year &gt; 1),则无法使用。 调试代码后发现问题出在YQL查询:

http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.historicaldata where symbol = "AAPL" and startDate = "2014-08-24" and endDate = "2016-11-23"&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json

startDate = "2014-08-24" and endDate = "2016-11-23" 超过 15 个月时,YQL 将返回 null。我正在尝试解决这个问题。如果是python或者java,问题不难,先检查duration是否超过1年,如果是,得到1年结果,其余n-1年也一样。但是这个画面代码让我坚持下去。我必须使代码可以与 tableau 一起使用,这使我由于缺乏对 js 和 tableau 的了解而无法继续。

有人可以就这个问题提出建议吗?我的目标是让代码在 10 年内适用于像 AAPL 这样的股票代码。

提前致谢。

【问题讨论】:

    标签: javascript html tableau-api yql yahoo-finance


    【解决方案1】:

    我不认为 YQL 支持超过 15 个月左右的查询。在使用 API 时,此类限制相当普遍。从 Web 数据连接器的角度来看,您想要做的是实现分页。

    高级想法是,WDC 的 getTableData 函数将执行多次,每次都会收集一页数据,然后将其传递给 Tableau。例如,您可以在示例中获取多年的数据:

    myConnector.getTableData = function(lastRecordToken) {
        var dataToReturn = [];
        var hasMoreData = false;
    
        // Get parameter values and build YQL query
        var ticker = tableau.connectionData;
        var endDate = new Date();
        var startDate = new Date();
    
        var maxYear = 5;        
        var yearOffset = lastRecordToken || 0;
        endDate.setYear(endDate.getFullYear() - (yearOffset));
        startDate.setYear(endDate.getFullYear() - 1);
    
        var connectionUri = buildUri(ticker, startDate, endDate);
    
        var xhr = $.ajax({
          url: connectionUri,
          dataType: 'json',
          success: function (data) {
              if (data.query.results) {
                var quotes = data.query.results.quote;
                var ii;
                for (ii = 0; ii < quotes.length; ++ii) {
                    var entry = {'Ticker': quotes[ii].Symbol,
                                 'Day': quotes[ii].Date,
                                 'Close': quotes[ii].Close};
                    dataToReturn.push(entry);
                }
    
                var hasMoreData = !(yearOffset == maxYear);
                tableau.dataCallback(dataToReturn, yearOffset + 1, hasMoreData)
              }
              else {
                  tableau.abortWithError("No results found for ticker symbol: " + ticker);
              }
          },
          error: function (xhr, ajaxOptions, thrownError) {
              tableau.log("Connection error: " + xhr.responseText + "\n" + thrownError);
              tableau.abortWithError("Error while trying to connect to the Yahoo stock data source.");
          }
        });
      }
      tableau.registerConnector(myConnector);
      })();
    

    本示例使用 dataCallback 函数的两个额外参数来实现分页。 Web 数据连接器 API v1 中的分页文档可在此处找到:http://onlinehelp.tableau.com/current/api/wdc/en-us/help.htm#WDC/wdc_paging.htm%3FTocPath%3DAdditional%2520Concepts%7C_____2

    此外,如果您能够使用v2 of the WDC API(可在 Tableau 10 及更高版本中使用),我强烈推荐它。 V2 中的分页模型更灵活,更易于使用。

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      相关资源
      最近更新 更多