turingtrader.js
Version:
A backtesting engine for Node.js
95 lines (83 loc) • 3.68 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.loadAssetFromYahoo = void 0;
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
//==============================================================================
// Name: data/yahoo
// Project: TuringTrader.js
// Description: data source for Yahoo! finance.
// History: FUB, 2021v02, created
//==============================================================================
var loadAssetFromYahoo = function loadAssetFromYahoo(sim, name) {
// TODO: we might need to do some mapping here
var ticker = name; // NOTE: JS has epochs in milliseconds, Yahoo expects seconds
var day = 24 * 60 * 60;
var period1 = Math.trunc(sim.startDate.getTime() / 1000) - 5 * day;
var period2 = Math.trunc(sim.endDate.getTime() / 1000) + 5 * day;
var url = "http://query1.finance.yahoo.com/v8/finance/chart/".concat(ticker, "?interval=1d&period1=").concat(period1, "&period2=").concat(period2); // see https://developers.google.com/web/updates/2015/03/introduction-to-fetch
var status = function status(response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response);
} else {
return Promise.reject(new Error(response.statusText));
}
};
var json = function json(response) {
return response.json();
};
var promise = (0, _nodeFetch["default"])(url).then(status).then(json).then(function (response) {
// deconstruct response from Yahoo!
var meta = response.chart.result[0].meta;
var rawTimestamps = response.chart.result[0].timestamp;
var rawOpen = response.chart.result[0].indicators.quote[0].open;
var rawHigh = response.chart.result[0].indicators.quote[0].high;
var rawLow = response.chart.result[0].indicators.quote[0].low;
var rawClose = response.chart.result[0].indicators.quote[0].close;
var rawVolume = response.chart.result[0].indicators.quote[0].volume;
var adjustedClose = response.chart.result[0].indicators.adjclose[0].adjclose; // calculate adjusted prices
var adjustFactor = adjustedClose.map(function (element, index) {
return element / rawClose[index];
});
var adjustedOpen = rawOpen.map(function (element, index) {
return element * adjustFactor[index];
});
var adjustedHigh = rawHigh.map(function (element, index) {
return element * adjustFactor[index];
});
var adjustedLow = rawLow.map(function (element, index) {
return element * adjustFactor[index];
});
var adjustedVolume = rawVolume.map(function (element, index) {
return element / adjustFactor[index];
}); // convert timestamps
// NOTE: Yahoo! timestamps are at the open (9:30 am),
// TuringTrader.js timestamps are at the close (4:00 pm).
// this is not an issue, because the simulator will align
// the timestamps with the trading calendar upon load.
var timestamps = rawTimestamps.map(function (element) {
return new Date(element * 1000);
});
return {
meta: {
ticker: ticker,
firstT: timestamps[0],
lastT: timestamps[timestamps.length - 1]
},
t: timestamps,
o: adjustedOpen,
h: adjustedHigh,
l: adjustedLow,
c: adjustedClose,
v: adjustedVolume
};
}) // FIXME: what are we doing here?
["catch"](function (err) {
return sim.info(err);
});
return promise;
}; //==============================================================================
// end of file
exports.loadAssetFromYahoo = loadAssetFromYahoo;