UNPKG

ta-pattern-lib

Version:

Technical Analysis and Backtesting Framework for Node.js

121 lines 4.81 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.stats_calculate_slope = exports.stats_sma = exports.compute_ema = exports.stats_min_max_scaling = exports.correlate = exports.stats_calculate_similarity = exports.stats_resample_data = exports.stats_normalize = exports.stats_standard_deviation = exports.stats_median = exports.stats_mean = void 0; const lodash_round_1 = __importDefault(require("lodash.round")); const stats_mean = (data) => { const sum = data.reduce((acc, val) => acc + val, 0); return sum / data.length; }; exports.stats_mean = stats_mean; const stats_median = (numbers) => { const sorted = Array.from(numbers).sort((a, b) => a - b); const middle = Math.floor(sorted.length / 2); if (sorted.length % 2 === 0) { return (sorted[middle - 1] + sorted[middle]) / 2; } return sorted[middle]; }; exports.stats_median = stats_median; const stats_standard_deviation = (numbers) => { const n = numbers.length; // Calculate the mean const mean = numbers.reduce((sum, num) => sum + num, 0) / n; // Calculate the sum of squared differences const squared_differences_sum = numbers.reduce((sum, num) => sum + Math.pow(num - mean, 2), 0); // Calculate the variance const variance = squared_differences_sum / n; // Calculate the standard deviation (square root of variance) return Math.sqrt(variance); }; exports.stats_standard_deviation = stats_standard_deviation; const stats_normalize = (data) => { const min = Math.min(...data); const max = Math.max(...data); return data.map((value) => (value - min) / (max - min)); }; exports.stats_normalize = stats_normalize; const stats_resample_data = (data, new_length) => { const step = (data.length - 1) / (new_length - 1); return Array.from({ length: new_length }, (_, i) => { const index = i * step; const lower_index = Math.floor(index); const upper_index = Math.ceil(index); const weight = index - lower_index; return data[lower_index] * (1 - weight) + data[upper_index] * weight; }); }; exports.stats_resample_data = stats_resample_data; const stats_calculate_similarity = (sample, pattern) => { const correlation = (0, exports.correlate)(sample, pattern); return Math.max(...correlation) / (pattern.length * (0, exports.stats_standard_deviation)(sample) * (0, exports.stats_standard_deviation)(pattern)); }; exports.stats_calculate_similarity = stats_calculate_similarity; const correlate = (a, b) => { const result = []; for (let i = 0; i <= a.length - b.length; i++) { let sum = 0; for (let j = 0; j < b.length; j++) { sum += a[i + j] * b[j]; } result.push(sum); } return result; }; exports.correlate = correlate; const stats_min_max_scaling = (array, key) => { let min_value = Number.POSITIVE_INFINITY; let max_value = Number.NEGATIVE_INFINITY; // Find the minimum and maximum values of the specified key for (const obj of array) { const value = obj[key]; if (value < min_value) { min_value = value; } if (value > max_value) { max_value = value; } } // Scale the values to the range [0, 1] const range = max_value - min_value; for (const obj of array) { const value = obj[key]; obj[key] = (0, lodash_round_1.default)((value - min_value) / range, 2); } return [...array]; }; exports.stats_min_max_scaling = stats_min_max_scaling; const compute_ema = (numbers, period, multiplier = 2) => { const ema_array = []; const multiplier_value = multiplier / (period + 1); let ema = (0, lodash_round_1.default)(numbers[0], 3); ema_array.push(ema); for (let i = 1; i < numbers.length; i++) { ema = (0, lodash_round_1.default)((numbers[i] - ema) * multiplier_value + ema, 3); if (ema !== undefined) { ema_array.push(ema); } } return ema_array; }; exports.compute_ema = compute_ema; const stats_sma = (numbers, period) => { const sma_array = []; for (let i = 0; i <= numbers.length - period; i++) { const subset = numbers.slice(i, i + period); const sum = subset.reduce((acc, num) => acc + num, 0); const sma = sum / period; if (sma !== undefined) { sma_array.push(sma); } } return sma_array; }; exports.stats_sma = stats_sma; const stats_calculate_slope = (point1, point2, distance) => { return (point2 - point1) / distance; }; exports.stats_calculate_slope = stats_calculate_slope; //# sourceMappingURL=feature_statistics.js.map