v1 0.0.1

Scalar mathematical library for neural networks.
Documentation
// libs/v1/src/finance/trend.rs
//
//! # Трендовые фильтры (Moving Averages)
//!
//! Модуль содержит скалярные функции для расчета скользящих средних,
//! используемых для сглаживания временных рядов и определения трендов.

/// # Обновление простого скользящего среднего (SMA Update)
///
/// Вычисляет новое значение SMA на основе его предыдущего значения,
/// новой пришедшей цены и цены, которая выходит из скользящего окна.
///
/// ### Примеры
/// ```
/// use v1::finance::trend::sma_update;
///
/// let prev_sma = 100.0;
/// let new_price = 105.0;
/// let old_price = 95.0;
/// let period = 5;
///
/// let next_sma = sma_update(prev_sma, new_price, old_price, period);
/// // 100.0 + (105.0 - 95.0) / 5.0 = 102.0
/// assert_eq!(next_sma, 102.0);
/// ```
pub fn sma_update(prev_sma: f32, new_price: f32, old_price: f32, period: usize) -> f32 {
    if period == 0 {
        return new_price;
    }

    prev_sma + (new_price - old_price) / period as f32
}

/// # Экспоненциальное скользящее среднее (EMA Update)
///
/// Рассчитывает новое значение EMA. Придает больший вес свежим данным,
/// из-за чего реагирует на изменения тренда быстрее, чем SMA.
///
/// ### Формула
/// ```text
/// alpha = 2 / (period + 1)
/// EMA = alpha * new_price + (1 - alpha) * prev_ema
/// ```
///
/// ### Примеры
/// ```
/// use v1::finance::trend::ema_update;
///
/// let prev_ema = 100.0;
/// let new_price = 110.0;
/// let period = 9; // alpha = 2 / (9 + 1) = 0.2
///
/// let next_ema = ema_update(prev_ema, new_price, period);
/// // 0.2 * 110.0 + 0.8 * 100.0 = 22.0 + 80.0 = 102.0
/// assert!((next_ema - 102.0).abs() < 1e-6);
/// ```
pub fn ema_update(prev_ema: f32, new_price: f32, period: usize) -> f32 {
    if period == 0 {
        return new_price;
    }
    let alpha = 2.0 / (period as f32 + 1.0);
    alpha * new_price + (1.0 - alpha) * prev_ema
}