From ec6233ce2cc6dc5b125ea74d12dc53b633e23aa7 Mon Sep 17 00:00:00 2001 From: devam <56464719+devam2001@users.noreply.github.com> Date: Thu, 15 Oct 2026 22:02:56 +1100 Subject: [PATCH] Release 0.1.1: point-in-time tuning fix, re-tuning overfit result --- Crypto Trading Bot Case Study.pdf | Bin 441702 -> 441700 bytes docs/OPERATIONS.md | 2 +- docs/releases/v0.1.1.md | 29 +++++++++++++++++++++++++++++ pyproject.toml | 2 +- ridgeline/__init__.py | 2 +- 5 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 docs/releases/v0.1.1.md diff --git a/Crypto Trading Bot Case Study.pdf b/Crypto Trading Bot Case Study.pdf index 08a38ec6f6133054364fc075d534c6d19e6fb0e9..9ba5f7d34754a5c3147363c2817be9ceb2f1a214 100644 GIT binary patch delta 39583 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 B`=S5< delta 35017 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 diff --git a/docs/OPERATIONS.md b/docs/OPERATIONS.md index 24cbe00..0d01ed7 100644 --- a/docs/OPERATIONS.md +++ b/docs/OPERATIONS.md @@ -113,7 +113,7 @@ docker compose ps # bot should become "healthy" withi The image contains the code. Only `user_data/` is mounted from the host: config, strategies, data, databases, logs and the audit trail. To pin a -release, set `RIDGELINE_VERSION=0.1.0` (in `.env` or the shell). The default +release, set `RIDGELINE_VERSION=0.1.1` (in `.env` or the shell). The default is `latest`. Data and the strategy's pair list (see the README's Data section) can be diff --git a/docs/releases/v0.1.1.md b/docs/releases/v0.1.1.md new file mode 100644 index 0000000..116dedf --- /dev/null +++ b/docs/releases/v0.1.1.md @@ -0,0 +1,29 @@ +A research fix and an overfitting check. The app behaves the same as 0.1.0; upgrading keeps your `user_data`. + +**Paper money only.** The panel runs Freqtrade in dry-run mode and cannot start a live bot. No strategy is eligible for real money yet. + +## Install + +- **Windows:** download `Ridgeline-Setup-0.1.1.exe` below and run it. + - Installing over 0.1.0 keeps your private config, paper sessions, data and audit trail. + - The installer isn't code-signed, so SmartScreen may warn: choose *More info → Run anyway*. +- **Docker:** `RIDGELINE_VERSION=0.1.1 docker compose pull && docker compose up -d`. +- **From source:** `pip install -r requirements.txt`. + +## What changed + +- **Fixed: tuning leaked hindsight.** `research.py hyperopt` was tuning on `config.json`'s live pair list (today's top coins). It now tunes on the point-in-time pairs at the start of the in-sample period, like every backtest does. +- **New candidate, and a negative result.** `TrendRider4hPIT` is TrendRider4h re-tuned that way (300 trials, in-sample only). It overfits: + + | | In-sample | Out-of-sample | Profit factor | Walk-forward | Gates | + |---|---|---|---|---|---| + | TrendRider4h | +5.6% | **+17.3%** | **1.43** | **64%** | **8 / 9** | + | TrendRider4hPIT | +45.6% | +13.8% | 1.33 | 50% | 7 / 9 | + + The in-sample gain didn't carry over to new data, so TrendRider4h keeps its original parameters and stays the lead candidate. +- **Updated research:** + - Gates re-run for all five strategies at 1,000 and 65 USDT (≈100 AUD). + - `RESEARCH.md` updated. + - The case study (attached) has a new section 5.7 and covers five strategies. + +Backtests are not a promise of future results. This is software, not financial advice. diff --git a/pyproject.toml b/pyproject.toml index 3fd3010..e68dd0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ridgeline" -version = "0.1.0" +version = "0.1.1" description = "Freqtrade crypto bot with paper trading, point-in-time research gates, risk controls and reporting" requires-python = ">=3.11" diff --git a/ridgeline/__init__.py b/ridgeline/__init__.py index e62c9b8..05f87eb 100644 --- a/ridgeline/__init__.py +++ b/ridgeline/__init__.py @@ -3,7 +3,7 @@ from pathlib import Path # Keep in step with pyproject.toml; release tags are v. -__version__ = "0.1.0" +__version__ = "0.1.1" ROOT = Path(__file__).resolve().parent.parent USERDIR = ROOT / "user_data"