Yahoo-Finance Query Speed

В настоящее время я работаю над проектом, который включает в себя запросы финансирования yahoo для множества различных символов тикеров. Узким местом является получение данных от Yahoo, поэтому мне было интересно, есть ли способ, которым я мог бы ускорить это.

Если бы я использовал несколько машин для запроса, а затем агрегировал данные, это помогло бы? У меня только одна физическая машина; как я могу сделать это?

Спасибо!

РЕДАКТИРОВАТЬ: В настоящее время я использую Node.js, Yahoo-финансы и Q. Deferred, чтобы попросить Yahoo для исторических данных. Затем, когда все обещания выполнены (для каждого тикера), я делаю Q.all(), чтобы сохранить данные.

    var data = [];
    tickers = ["goog", "aapl", ...];
    ...
    Q.all(_.map(tickers, function(symbol) { 
        return getYahooPromise(symbol);
     }))
    .done( function() { persistData(data) });

getYahooPromise извлекает данные для символа тикера и помещает их в массив данных. Как только все обещания будут решены, данные сохраняются в базе данных MySQL.

ВТОРОЙ РЕДАКТИРОВАТЬ: больше код:

var sequentialCalls = [];

for ( var i = 0; i < tickers.length / chunkSize; i++ ) {
    sequentialCalls.push( persistYahooChunk );
}
sequentialCalls.push( function(callback) { 
    connection.end(); 
    callback();
});

async.series( sequentialCalls )



exports.persistYahooChunk = function(callback) {
console.log("Starting yahoo query");
var currentTickers = tickers.slice(currentTickerIndex,currentTickerIndex + chunkSize);


return yahooFinance.historical( {
    symbols: currentTickers,
    from: "2015-01-28",
    to: "2015-02-05"
}).then( function(result) {
    console.log("Query " + currentTickerIndex +  "/" + tickers.length + "completed");
    currentTickerIndex += chunkSize;
    //add valid data
    var toPersist = _.map(result, function(quotes, symbol) {
            return [symbol, quotes.length != 0 ];
    });


    var query = "INSERT INTO `ticker` (`symbol`, `valid`) VALUES ?";
    connection.query(query, [toPersist], function(err, result) {
        if (err) {
            console.log (err);
        }
        //console.log(result);

        callback();
    });
});

}

1 ответ

Решение

Узкое место связано с тем, что вы выполняете один запрос на тикер.

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

Вот пример, если вам нужно получить все текущие цены для списка тикеров, с помощью одного запроса:

http://finance.yahoo.com/webservice/v1/symbols/A,B,C,D,E/quote?format=json

Другие вопросы по тегам