From bd0ad7a23a16c355e2a04baca8e377af71e33179 Mon Sep 17 00:00:00 2001 From: parlorsky <69785001+parlorsky@users.noreply.github.com> Date: Wed, 7 Oct 2026 21:13:19 +0300 Subject: [PATCH] BUG: Handle sequence inputs consistently in quantile rank --- backtesting/lib.py | 5 +++-- backtesting/test/_test.py | 17 +++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/backtesting/lib.py b/backtesting/lib.py index 3bbef0ed..856a25e7 100644 --- a/backtesting/lib.py +++ b/backtesting/lib.py @@ -162,9 +162,10 @@ def quantile(series: Sequence, quantile: Union[None, float] = None): 0.13 """ if quantile is None: + values = np.asarray(series) try: - last, series = series[-1], series[:-1] - return np.mean(series < last) + last, values = values[-1], values[:-1] + return np.mean(values < last) except IndexError: return np.nan assert 0 <= quantile <= 1, "quantile must be within [0, 1]" diff --git a/backtesting/test/_test.py b/backtesting/test/_test.py index d74fde9f..238e5286 100644 --- a/backtesting/test/_test.py +++ b/backtesting/test/_test.py @@ -952,8 +952,21 @@ def test_crossover(self): self.assertFalse(crossover([0], [1])) def test_quantile(self): - self.assertEqual(quantile(np.r_[1, 3, 2], .5), 2) - self.assertEqual(quantile(np.r_[1, 3, 2]), .5) + for series in ( + np.r_[1, 3, 2], + [1, 3, 2], + (1, 3, 2), + pd.Series([1, 3, 2]), + pd.Series([1, 3, 2], index=[-1, 0, 1]), + pd.Series([1, 3, 2], index=pd.date_range('2020', periods=3))): + with self.subTest(series=series): + self.assertEqual(quantile(series, .5), 2) + self.assertEqual(quantile(series), .5) + + def test_quantile_empty(self): + for series in (np.array([]), [], (), pd.Series(dtype=float)): + with self.subTest(series=series): + self.assertTrue(np.isnan(quantile(series))) def test_resample_apply(self): res = resample_apply('D', SMA, EURUSD.Close, 10)