stock-indicator-mapper
Version:
A function given to map on an array of objects containing daily stock EOD data.
185 lines (168 loc) • 7.6 kB
JavaScript
import { Map, List } from 'immutable';
import { expect } from 'chai';
import Papa from 'babyparse';
import round from 'lodash/round';
import dataSetup from '../../app/utils/dataSetup.js';
import emaCalculation from '../../app/indicators/emaIndicator.js';
import atrCaluclation from '../../app/indicators/atrIndicator.js';
import slopeCaluclation from '../../app/indicators/slopeIndicator.js';
import rocCaluclation from '../../app/indicators/rocIndicator.js';
import adxIndicator from '../../app/indicators/adxIndicator.js';
import highChannelIndicator from '../../app/indicators/highChannelIndicator.js';
import fullWeekIndicators from '../../app/indicators/fullWeekIndicators.js';
const parseConfig = {
header: true,
};
const parsed = Papa.parseFiles('./data/MMM-daily-2006-2009.csv', parseConfig);
const rawData = parsed.data;
const dailyData = dataSetup(rawData);
const parsed2 = Papa.parseFiles('./data/MMM-daily-2003-2009.csv', parseConfig);
const rawData2 = parsed2.data;
const dailyData2 = dataSetup(rawData2);
const weeklyParsed = Papa.parseFiles('./data/MMM-weekly-2000-2009.csv', parseConfig);
const weeklyRawData = weeklyParsed.data;
const weeklyData = dataSetup(weeklyRawData);
const weeklyParsed2 = Papa.parseFiles('./data/AAPL-weekly-2000-2009.csv', parseConfig);
const weeklyRawData2 = weeklyParsed2.data;
const weeklyData2 = dataSetup(weeklyRawData2);
describe('EMACalculation function.', () => {
it('Should return an array of EMA values', () => {
const mapperFunction = emaCalculation(13, 'Fast');
const actual = weeklyData.map(mapperFunction);
// console.log(actual);
expect(actual).to.be.an.instanceof(List);
expect(actual.first()).to.be.an.instanceof(Map);
expect(actual.first()).to.include.keys('emaFast', 'date');
// Testing against EMA-Spreadsheet-MMM-weekly-2000-2009-EMA13.xls
const week13 = actual.get(12); // 29.61
const week21 = actual.get(20); // 28.93
const week132 = actual.get(131); // 43.04
const week455 = actual.get(454); // 56.92
expect(week13.get('emaFast')).to.equal(29.61);
expect(week21.get('emaFast')).to.equal(28.93);
expect(week132.get('emaFast')).to.equal(43.04);
expect(week455.get('emaFast')).to.equal(56.92);
// console.log(actual[389]);
});
});
describe('ATR function', () => {
it('Should return an array of ATR values', () => {
const mapperFunction = atrCaluclation(23);
const actual = dailyData.map(mapperFunction);
// console.log(actual);
expect(actual).to.be.an.instanceof(List);
expect(actual.first()).to.be.an.instanceof(Map);
expect(actual.first()).to.include.keys('atr', 'date');
// testing against MMM-daily-2006-2009.xls
const day23 = actual.get(22); // 0.924
const day136 = actual.get(135); // 1.122
const day281 = actual.get(280); // 0.81
const day802 = actual.get(801); // 1.69
const day1000 = actual.get(999); // 1.14
const last = actual.get(1006); // 1.05
expect(day23.get('atr')).to.equal(0.92);
expect(day136.get('atr')).to.equal(1.12);
expect(day281.get('atr')).to.equal(0.81);
expect(day802.get('atr')).to.equal(1.69);
expect(day1000.get('atr')).to.equal(1.14);
expect(last.get('atr')).to.equal(1.05);
});
});
describe('Slope function', () => {
it('Should return an array of values which are the slope of the linear regression for the time period', () => {
const mapperFunction = slopeCaluclation(13);
const actual = weeklyData.map(mapperFunction);
// console.log(actual);
expect(actual).to.be.an.instanceof(List);
expect(actual.first()).to.be.an.instanceof(Map);
// expect(actual.first()).to.have.ownProperty('date');
expect(actual.first()).to.include.keys('slope', 'date');
});
});
describe('Rate of Change function', () => {
it('Should return an array of values which are the rate of change for the given time period', () => {
const mapperFunction = rocCaluclation(13);
const actual = weeklyData.map(mapperFunction);
// console.log(actual);
expect(actual).to.be.an.instanceof(List);
expect(actual.first()).to.be.an.instanceof(Map);
expect(actual.first()).to.include.keys('roc', 'date');
// Testing against ROC-Spreadsheet.xls
const week14 = actual.get(13); // -10.25
const week142 = actual.get(141); // -3.2
const week323 = actual.get(322); // -6.53
const week500 = actual.get(499); // 22.9
expect(round(week14.get('roc'), 1)).to.equal(-10.2);
expect(round(week142.get('roc'), 1)).to.equal(-3.2);
expect(round(week323.get('roc'), 1)).to.equal(-6.5);
expect(round(week500.get('roc'), 1)).to.equal(22.9);
// console.log(actual[390]);
});
});
describe('ADX-13 indicator', () => {
it('Should return an array of objects with properties: date, and adx', () => {
const mapperFunction = adxIndicator(13);
const actual = weeklyData.map(mapperFunction);
// console.log(actual);
expect(actual).to.be.an.instanceof(List);
expect(actual.first()).to.be.an.instanceof(Map);
expect(actual.first()).to.include.keys('adx', 'date');
// Testing against ADX-Spredsheet_MMM-weekly-2000-2009-data.xls
const week26 = actual.get(25); // 8.92
const week33 = actual.get(32); // 14.76
const week347 = actual.get(346); // 28.24
const week508 = actual.get(507); // 30.65
expect(week26.get('adx')).to.equal(8.92);
expect(week33.get('adx')).to.equal(14.76);
expect(week347.get('adx')).to.equal(28.24);
expect(week508.get('adx')).to.equal(30.65);
// console.log(actual[388]);
// console.log(actual[389]);
// console.log(actual[390]);
});
});
// with ADX 14 on APPL data
describe('ADX-14 indicator', () => {
it('Should return an array of objects with properties: date, and adx', () => {
const mapperFunction = adxIndicator(14);
const actual = weeklyData2.map(mapperFunction);
// console.log(actual);
expect(actual).to.be.an.instanceof(List);
expect(actual.first()).to.be.an.instanceof(Map);
expect(actual.first()).to.include.keys('adx', 'date');
// Testing against ADX14-Spredsheet_AAPL-weekly-2000-2009-data.xls
const week107 = actual.get(106); // 18.57
const week254 = actual.get(253); // 60.28
const week404 = actual.get(403); // 42.32
const week445 = actual.get(444); // 18
expect(week107.get('adx')).to.equal(18.57);
expect(week254.get('adx')).to.equal(60.28);
expect(week404.get('adx')).to.equal(42.32);
expect(week445.get('adx')).to.equal(18);
});
});
describe('HighChannel indicator', () => {
it('Shouuld return a List of Maps with properties: data, and highChannel', () => {
const mapperFunction = highChannelIndicator(50);
const actual = dailyData.map(mapperFunction);
expect(actual).to.be.an.instanceof(List);
expect(actual.first()).to.be.an.instanceof(Map);
expect(actual.first()).to.include.keys('highChannel', 'date');
expect(actual.first().get('highChannel')).to.equal(58.98);
expect(actual.getIn([1, 'highChannel'])).to.equal(59.08);
// console.log(actual.get(1));
// console.log(dailyData.get(0))
// console.log(dailyData.get(1))
});
});
// Full Indicator Test
describe('Full Day of indicator calculations', () => {
it('Should return an array of object to represent each of the indicator calculations.', () => {
const mapperFunction = fullWeekIndicators();
const actual = weeklyData.map(mapperFunction);
// console.log(actual);
expect(actual).to.be.an.instanceof(List);
// expect(actual.first()).to.be.a('object');
// console.log(actual[50]);
});
});