Source code for spd_trading.utils.smoothing

import numpy as np
import scipy.interpolate as interpolate  # B-Spline


[docs]def bspline(x, y, sections, degree=3): idx = np.linspace(0, len(x) - 1, sections + 1, endpoint=True).round(0).astype("int") x = x[idx] y = y[idx] t, c, k = interpolate.splrep(x, y, s=0, k=degree) spline = interpolate.BSpline(t, c, k, extrapolate=True) pars = {"t": t, "c": c, "deg": k} points = {"x": x, "y": y} return pars, spline, points
[docs]def interpolate_to_same_interval(curve_1, curve_2, interval=[0.5, 1.5]): """Interpolates curve_1 and curve_2 to the same interval, especially same interval values! Args: curve_1 (dict): dict of np.arrays "x" and "y" curve_2 (dict): dict of np.arrays "x" and "y" interval (list, optional): Interval in which the functions are interpolated. Defaults to [0.5, 1.5]. Returns: tuple of np.arrays: Interpolated curves curve_1 and curve_2 to new interval. """ _, spline1, _ = bspline(curve_1["x"], curve_1["y"], sections=15, degree=2) _, spline2, _ = bspline(curve_2["x"], curve_2["y"], sections=15, degree=2) X = np.linspace(interval[0], interval[1], 100) new_curve_1 = {"x": X, "y": spline1(X)} new_curve_2 = {"x": X, "y": spline2(X)} return new_curve_1, new_curve_2
[docs]def remove_tails(base, other, cut_tail_percent): """Cuts the tails of y_base if they are having a value, less than `cut_tail_percent`. Important: base and other need to have same domain values! Also adjusts y_other and X to the new length of y_base. Args: base (dict): The reference function. The tails, that are smaller than `cut_tail_percent` will be cut off other (dict): Another function that will be cut at the same places as the reference function. cut_tail_percent (float): Percent threshold of when to cut off tails. Returns: tuple of np.arrays: The shortened arrays in the same order as input. """ mask = base["y"] > base["y"].max() * cut_tail_percent new_base = {"x": base["x"][mask], "y": base["y"][mask]} new_other = {"x": other["x"][mask], "y": other["y"][mask]} return new_base, new_other