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
JavaScript
;
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);
});
});