data-forge-from-yahoo
Version:
Data-Forge plugin for pulling data from the Yahoo financial API.
110 lines (88 loc) • 2.65 kB
JavaScript
;
module.exports = function (dataForge, globalOptions) {
var Enumerable = require('linq');
var moment = require('moment');
globalOptions = globalOptions || {};
var defaultBaseUrl = globalOptions.baseUrl || 'http://ichart.yahoo.com/table.csv';
var request = require('request-promise');
//
// Create the URL for pulling data from Yahoo.
//
var formatYahooUrl = function (code, options) {
options = options || {};
var baseUrl = options.baseUrl || defaultBaseUrl;
var url = baseUrl + '?s=' + code.toUpperCase();
if (options.fromDate) {
url += '&a=' + options.fromDate.getMonth(); // Month. Yahoo expects 0-based month.
url += '&b=' + options.fromDate.getDate(); // Date.
url += '&c=' + options.fromDate.getFullYear(); // Year.
}
if (options.toDate) {
url += '&d=' + options.toDate.getMonth(); // Month. Yahoo expects 0-based month.
url += '&e=' + options.toDate.getDate(); // Date.
url += '&f=' + options.toDate.getFullYear(); // Year.
}
if (options.interval) {
// Time interval.
// https://code.google.com/p/yahoo-finance-managed/wiki/enumHistQuotesInterval
var intervalCode;
if (options.interval === 'daily') {
intervalCode = 'd';
}
else if (options.interval === 'weekly') {
intervalCode = 'w';
}
else if (options.interval === 'monthly') {
intervalCode = 'm';
}
else {
observer.onError(new Error("Invalid interval: " + options.interval + ", should be one of daily, weekly or monthly."));
}
url += '&g=' + intervalCode;
}
url += '&ignore=.csv'; // Docs say to add this.
return url;
};
//
// Load CSV data from Yahoo.
//
var loadYahooData = function (code, options) {
options = options || {};
var url = formatYahooUrl(code, options);
var proxyUrl = options.proxyUrl || globalOptions.proxyUrl;
if (proxyUrl) {
var encodeUrlForProxy = options.encodeUrlForProxy || globalOptions.encodeUrlForProxy;
if (encodeUrlForProxy) {
url = proxyUrl + encodeURIComponent(url);
}
else {
url = proxyUrl + url;
}
}
return request({
type: 'GET',
uri: url,
dataType: 'text',
})
.then(function (data) {
return dataForge.fromCSV(data, {
skipEmptyLines: true,
});
})
.then(function (dataFrame) {
return dataFrame.parseDates("Date")
.parseFloats([
"Adj Close",
"Close",
"High",
"Low",
"Open",
"Volume",
])
.bake(); // Bake it all into memory.
});
};
dataForge.fromYahoo = function (code, options) {
return loadYahooData(code, options);
};
};