Coverage for src/tinycta/util.py: 100%
7 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-06 05:36 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-06 05:36 +0000
1"""Volatility adjustment and price normalization helpers (Polars expressions).
3This module provides expression-level building blocks used to standardize
4log returns by an exponentially weighted volatility estimate and to integrate
5those standardized returns into adjusted log-price series. These are designed
6for use within Polars pipelines (e.g., DataFrame.with_columns) and operate
7column-wise.
9Functions:
10- vol_adj: Standardize log returns using EWMA volatility and clip extremes.
11- adj_log_prices: Cumulative sum (integration) of standardized, clipped returns.
12"""
14import polars as pl
17def vol_adj(x: pl.Expr, vola: int, clip: float, min_samples: int = 1) -> pl.Expr:
18 """Compute clipped, volatility-adjusted log returns per column.
20 Args:
21 x: Price series to transform.
22 vola: EWMA lookback (span-equivalent) for std.
23 clip: Symmetric clipping threshold applied after standardization.
24 min_samples: Minimum samples required by EWM to yield non-null values.
26 Returns:
27 pl.Expr: Standardized and clipped log returns.
28 """
29 log_returns = x.log().diff()
30 vol = log_returns.ewm_std(com=vola - 1, adjust=True, min_samples=min_samples)
31 return (log_returns / vol).clip(-clip, clip)
34def adj_log_prices(x: pl.Expr, vola: int, clip: float, min_samples: int = 1) -> pl.Expr:
35 """Integrate clipped, volatility-adjusted log returns to adjusted log prices.
37 Uses ``vol_adj`` to standardize/clamp log returns and then integrates them
38 via cumulative sum. The resulting series behaves like a standardized price-
39 like process with roughly unit volatility.
41 Args:
42 x: Polars expression of the price series to transform.
43 vola: EWMA lookback (span-equivalent) used to estimate volatility.
44 clip: Symmetric clipping threshold applied after standardization.
45 min_samples: Minimum samples required by EWM to emit non-null values.
47 Returns:
48 pl.Expr: Adjusted-log-price series obtained by cumulative sum of
49 standardized returns.
50 """
51 return vol_adj(x, vola=vola, clip=clip, min_samples=min_samples).cum_sum()