46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
from backtesting import engine, statistics
|
|
|
|
|
|
def test_moving_block_bootstrap_is_deterministic_and_handles_constant_series():
|
|
first = statistics.moving_block_bootstrap_ci(
|
|
[12.5] * 120,
|
|
block_size=15,
|
|
n_resamples=200,
|
|
seed=7,
|
|
)
|
|
second = statistics.moving_block_bootstrap_ci(
|
|
[12.5] * 120,
|
|
block_size=15,
|
|
n_resamples=200,
|
|
seed=7,
|
|
)
|
|
|
|
assert first == second
|
|
assert first == {"estimate": 12.5, "ci_low": 12.5, "ci_high": 12.5, "n": 120}
|
|
|
|
|
|
def test_summarize_returns_reports_observations_and_block_bootstrap_interval():
|
|
summary = statistics.summarize_returns(
|
|
[10.0, -5.0, 20.0, -10.0],
|
|
block_size=2,
|
|
n_resamples=200,
|
|
seed=3,
|
|
)
|
|
|
|
assert summary["n"] == 4
|
|
assert summary["mean"] == 3.75
|
|
assert summary["median"] == 2.5
|
|
assert summary["win_rate"] == 50.0
|
|
assert summary["mean_ci_low"] <= summary["mean"] <= summary["mean_ci_high"]
|
|
|
|
|
|
def test_backtest_brackets_publish_bootstrap_confidence_intervals():
|
|
stats = {}
|
|
|
|
engine._add_return_statistics(stats, "90d", [10.0, -5.0, 20.0, -10.0])
|
|
|
|
assert stats["avg_90d"] == 3.75
|
|
assert stats["median_90d"] == 2.5
|
|
assert stats["win_rate_90d"] == 50.0
|
|
assert stats["avg_90d_ci_low"] <= stats["avg_90d"] <= stats["avg_90d_ci_high"]
|