Обеспечить детерминизм бэктеста #6

Open
opened 2026-04-29 17:33:00 +00:00 by derfenix · 0 comments
Owner

Описание

Сейчас два прогона backtest.Run с одинаковыми параметрами могут дать слегка разный результат из-за:

  • map iteration order (в ensemble, regime detector и т.д.)
  • goroutine scheduling
  • отсутствие seed для random в симуляции исполнения

Для оптимизатора это шум: генетический алгоритм не может отличить улучшение от артефакта недетерминизма. Особенно критично при сравнении геномов с близким фитнесом.

Предлагаемое решение

Добавить pkg/backtest.Options.RNGSeed *int64:

type Options struct {
    // ...

    // RNGSeed, если не nil, фиксирует seed для всех random-источников
    // внутри бэктеста (симуляция исполнения, случайные выборки).
    // Если nil — поведение как сейчас.
    RNGSeed *int64
}

Конкретные источники недетерминизма:

  1. internal/environment/simulated_stops.go — random для slippage
  2. core/application/ensemble/ — map iteration (можно заменить на ordered map или сортировку ключей)
  3. core/application/regime/ — те же проблемы с map

Затрагиваемые файлы

  • pkg/backtest/run.go — передача seed
  • core/application/ensemble/ — ordered iteration
  • core/application/regime/ — ordered iteration
  • internal/environment/simulated_stops.go — seeded random

Связи

  • Оптимизатор: strategy-optimizer сможет передавать seed для воспроизводимости
  • Повышает надёжность сравнения геномов
## Описание Сейчас два прогона `backtest.Run` с одинаковыми параметрами могут дать слегка разный результат из-за: - map iteration order (в ensemble, regime detector и т.д.) - goroutine scheduling - отсутствие seed для random в симуляции исполнения Для оптимизатора это шум: генетический алгоритм не может отличить улучшение от артефакта недетерминизма. Особенно критично при сравнении геномов с близким фитнесом. ## Предлагаемое решение Добавить `pkg/backtest.Options.RNGSeed *int64`: ```go type Options struct { // ... // RNGSeed, если не nil, фиксирует seed для всех random-источников // внутри бэктеста (симуляция исполнения, случайные выборки). // Если nil — поведение как сейчас. RNGSeed *int64 } ``` Конкретные источники недетерминизма: 1. `internal/environment/simulated_stops.go` — random для slippage 2. `core/application/ensemble/` — map iteration (можно заменить на ordered map или сортировку ключей) 3. `core/application/regime/` — те же проблемы с map ## Затрагиваемые файлы - `pkg/backtest/run.go` — передача seed - `core/application/ensemble/` — ordered iteration - `core/application/regime/` — ordered iteration - `internal/environment/simulated_stops.go` — seeded random ## Связи - Оптимизатор: `strategy-optimizer` сможет передавать seed для воспроизводимости - Повышает надёжность сравнения геномов
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
trading/tradebot-ng#6
No description provided.