UNPKG

quantitivecalc

Version:

A TypeScript library providing advanced quantitative finance functions for risk analysis, performance metrics, and technical indicators. (Currently in development)

111 lines (110 loc) 4.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const calculateDailyReturns_1 = require("./calculateDailyReturns"); describe('calculateDailyReturns', () => { it('calculates daily returns for a simple price series', () => { const data = [ { price: 100 }, { price: 110 }, { price: 121 }, { price: 115.5 }, ]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'price', 'dailyReturn', null); expect(result[0].dailyReturn).toBeNull(); expect(result[1].dailyReturn).toBeCloseTo(0.1, 5); // (110-100)/100 expect(result[2].dailyReturn).toBeCloseTo(0.1, 5); // (121-110)/110 expect(result[3].dailyReturn).toBeCloseTo(-0.045454545, 6); // (115.5-121)/121 }); it('handles missing or invalid values', () => { const data = [ { price: 100 }, { price: null }, { price: 110 }, { price: 'bad' }, { price: 120 }, ]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'price', 'dailyReturn', null); expect(result[0].dailyReturn).toBeNull(); expect(result[1].dailyReturn).toBeNull(); expect(result[2].dailyReturn).toBeNull(); // Can't calculate from null previous expect(result[3].dailyReturn).toBeNull(); // Invalid 'bad' value expect(result[4].dailyReturn).toBeNull(); // Can't calculate from invalid previous value }); it('returns empty array for empty input', () => { expect((0, calculateDailyReturns_1.calculateDailyReturns)([], 'price', 'dailyReturn')).toEqual([]); }); it('uses initialValue for the first row', () => { const data = [ { price: 100 }, { price: 110 }, ]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'price', 'dailyReturn', 0); expect(result[0].dailyReturn).toBe(0); expect(result[1].dailyReturn).toBeCloseTo(0.1, 5); }); // Additional test cases for better coverage it('handles zero prices correctly', () => { const data = [ { price: 100 }, { price: 0 }, { price: 50 }, ]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'price', 'dailyReturn', null); expect(result[0].dailyReturn).toBeNull(); expect(result[1].dailyReturn).toBeCloseTo(-1, 5); // (0-100)/100 = -1 (100% loss) expect(result[2].dailyReturn).toBeNull(); // Division by zero should be handled }); it('handles negative prices', () => { const data = [ { price: 100 }, { price: -50 }, { price: -25 }, ]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'price', 'dailyReturn', null); expect(result[0].dailyReturn).toBeNull(); expect(result[1].dailyReturn).toBeCloseTo(-1.5, 5); // (-50-100)/100 expect(result[2].dailyReturn).toBeCloseTo(-0.5, 5); // (-25-(-50))/(-50) = 25/(-50) = -0.5 }); it('preserves original data structure', () => { const data = [ { price: 100, symbol: 'AAPL', date: '2024-01-01' }, { price: 110, symbol: 'AAPL', date: '2024-01-02' }, ]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'price', 'return', null); expect(result[0]).toEqual({ price: 100, symbol: 'AAPL', date: '2024-01-01', return: null }); expect(result[1]).toEqual({ price: 110, symbol: 'AAPL', date: '2024-01-02', return: 0.1 }); }); it('handles single data point', () => { const data = [{ price: 100 }]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'price', 'dailyReturn', null); expect(result).toHaveLength(1); expect(result[0].dailyReturn).toBeNull(); }); it('handles custom field names', () => { const data = [ { value: 50 }, { value: 75 }, ]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'value', 'change', null); expect(result[0].change).toBeNull(); expect(result[1].change).toBeCloseTo(0.5, 5); // (75-50)/50 }); it('handles very small price changes with precision', () => { const data = [ { price: 1000000.123456 }, { price: 1000000.234567 }, ]; const result = (0, calculateDailyReturns_1.calculateDailyReturns)(data, 'price', 'dailyReturn', null); expect(result[1].dailyReturn).toBeCloseTo(0.000000111111, 10); }); });