> ## Documentation Index
> Fetch the complete documentation index at: https://docs.novosky.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Performance

> Live OOS results, performance history, and methodology. Updated after each weekly optimization run.

<Info>
  All results are out-of-sample (OOS). The OOS window is never used to fit hyperparameters — it is a blind evaluation on data the models have not seen.
</Info>

## Current results

**Phase 17.3 — May 2026**

| Metric        | Value                                        |
| ------------- | -------------------------------------------- |
| OOS period    | 37 days (2026-03-30 to 2026-05-05)           |
| Win rate      | 71.7%                                        |
| Profit factor | 5.46                                         |
| Max drawdown  | 4.3%                                         |
| Sharpe ratio  | 59.54                                        |
| Return        | +194.6%                                      |
| Trades        | 184                                          |
| Score         | **18.48**                                    |
| Config        | conf=0.65, risk=2.0%, TP=1.0×ATR, SL=1.0×ATR |

***

## Performance history

| Date       | Score     | WR    | PF   | MaxDD | Return   | Trades | Config summary                                                       |
| ---------- | --------- | ----- | ---- | ----- | -------- | ------ | -------------------------------------------------------------------- |
| 2026-05-08 | **54.47** | 71.7% | 5.46 | 4.5%  | +195.7%  | 99     | conf=0.65, risk=3.0%, TP=1.0×ATR — single-source + recency weighting |
| 2026-05-07 | 18.48     | 60.3% | 2.69 | 4.3%  | +137.3%  | 184    | conf=0.65, risk=2.0%, TP=1.0×ATR — single-source + recency weighting |
| 2026-04-29 | 35.13     | 67.6% | 2.83 | 7.3%  | +394.5%  | 179    | conf=0.65, risk=1.75%, TP=1.0×ATR                                    |
| 2026-04-24 | 46.80     | 62.8% | 2.26 | 14.5% | +1154.6% | 156    | conf=0.633, risk=3.0%, TP=1.2×ATR                                    |
| 2026-04-24 | 21.34     | 65.8% | 3.03 | 7.1%  | +390.9%  | 114    | Phase 16 fixes (RF weight, TP\<SL)                                   |
| 2026-04-24 | 7.77      | 50.3% | 1.71 | 3.6%  | +71.5%   | 344    | conf=0.633, risk=2.0%, TP=0.8×ATR                                    |
| 2026-04-24 | 6.70      | 50.7% | 1.61 | 4.1%  | +66.5%   | 343    | conf=0.633, risk=2.5%, TP=0.8×ATR                                    |
| 2026-04-20 | 21.34     | 78.5% | 2.43 | 1.8%  | +50.7%   | 274    | conf=0.6, risk=2.5%, TP=0.8×ATR                                      |
| 2026-04-19 | 4.84      | 67.4% | 1.38 | 3.7%  | +51.6%   | 717    | conf=0.6, risk=2.5%, TP=0.8×ATR                                      |
| 2026-04-18 | 4.82      | 71.2% | 1.87 | 7.6%  | +323.0%  | 483    | conf=0.6, risk=1.0%, TP=0.8×ATR                                      |

***

## Score formula

The optimizer maximizes a single composite **score** that balances return against risk:

```
score = profit_factor × sharpe × (1 - max_drawdown) × log(1 + trades)
```

A score improvement of ≥ 2% over baseline is required to commit new models. This prevents the pipeline from committing marginal or noise-driven improvements.

A new week's baseline is the score recorded at the end of the previous week's run.

***

## OOS validation methodology

<Steps>
  <Step title="Data split">
    The dataset is split into in-sample (IS) and out-of-sample (OOS) segments. The IS window is used for training and Optuna tuning. The OOS window is never touched during training.
  </Step>

  <Step title="Sweep on first 70%">
    The config sweep (`scripts/sweep.py`) runs only on the **first 70%** of the OOS window. This is the "search" OOS.
  </Step>

  <Step title="Final eval on full OOS">
    After the best config is identified, the full OOS window is backtested. The **last 30%** of OOS data — the true holdout — is never seen during the sweep.
  </Step>

  <Step title="Rollback check">
    If the full-OOS score does not beat the stored baseline by ≥ 2%, all models and configs roll back to the previous version.
  </Step>
</Steps>

<Tip>
  Always use `python backtest.py --oos-only` for realistic validation. Avoid generic lookback backtests — they are subject to in-sample contamination.
</Tip>

***

## Reading the backtest output

```bash theme={null}
python backtest.py --balance 500 --leverage 500 --spread 14.0 --oos-only --no-chart
```

Key output fields:

| Field           | What it means                                            |
| --------------- | -------------------------------------------------------- |
| `win_rate`      | % of trades closed profitably                            |
| `profit_factor` | Gross profit ÷ gross loss — above 1.5 is good            |
| `max_drawdown`  | Largest peak-to-trough equity drop during the OOS period |
| `sharpe`        | Risk-adjusted return (annualized)                        |
| `return`        | Total % return over the OOS period                       |
| `score`         | Composite score used by the optimizer                    |

***

## Hardware note

Backtest results shown here used:

* **Spread:** 14.00 pts (RoboForex BTCUSD typical)
* **Leverage:** 500
* **Starting balance:** 500 USC
* **Swap:** enabled (RoboForex applies overnight swap)

Results on other brokers or with different spread/swap will differ. Historical results through Apr 2026 were on RoboForex BTCUSD (14.59 pts spread, no swap).
