1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Per rules/global_rules.md §Error Handling, unchecked `[]` / slicing is
// banned in production code.
// Unit tests routinely index into `Vec`s they just pushed into, so the lint
// is silenced in `#[cfg(test)]` only.
// Per rules/global_rules.md §Arithmetic, an operator that overflows, divides
// by zero or breaks the `Positive` invariant aborts the caller, so every
// operation on `Decimal`, `Positive` and the integers goes through its
// checked form (#788, #808). `clippy.toml` exempts the unary minus on
// `Decimal`, which cannot overflow. Casts that truncate, wrap or drop the
// sign are denied for the same reason. Unit tests are exempt, as above.
// An error or a default built eagerly in `ok_or` / `unwrap_or` is paid on
// the success path too (#857), so it is built in a closure.
//! # optionstratlib-backtest
//!
//! Strategy backtests over simulated paths: a strategy is evaluated on every
//! path of a simulator ([`backtesting::Simulate`]), each path ends by an exit
//! policy, and the run is summarised as [`backtesting::SimulationStatsResult`]
//! with its report types and metrics. It depends on `optionstratlib-core`,
//! `optionstratlib-pricing`, `optionstratlib-simulation`,
//! `optionstratlib-analytics` and `optionstratlib-strategies`, and on no
//! option-chain I/O, plotting or async code.
//!
//! - [`backtesting`]: [`backtesting::Simulate`] and its single-leg
//! implementations, the adapters from the simulation engine's generic
//! `PathOutcome` / `PathStatistics` to the backtest results, run
//! statistics, report types and performance metrics.
//! - [`error`]: the [`error::BacktestError`] type.
//!
//! The generic engine (random walks, exit policies, path evaluation and
//! statistics) is `optionstratlib-simulation`'s; this crate adapts it to
//! strategies and owns the reports. Charts stay with the visualization layer,
//! `optionstratlib-visualization`, which the `optionstratlib` facade
//! re-exports.
//!
//! ## Imports
//!
//! There is no prelude, as in the other component crates (ADR-0001 D7): the
//! module roots re-export each capability, and the `optionstratlib` facade
//! prelude serves broad imports.
//!
//! ## Place in the workspace
//!
//! - **Depends on** `optionstratlib-core`, `optionstratlib-pricing`,
//! `optionstratlib-simulation`, `optionstratlib-analytics` and
//! `optionstratlib-strategies`.
//! - **Must not depend on** `optionstratlib-visualization`; `make check-graph`
//! enforces the layering (ADR-0001 D9).
//! - **In the facade:** `optionstratlib::backtesting` and `BacktestError` in
//! `optionstratlib::error`, under the facade feature `backtest`. The facade
//! paths are the same types as the paths here; the [ownership
//! map](https://github.com/joaquinbejar/OptionStratLib/blob/main/docs/ownership.md)
//! lists every one with its feature.
//!
//! Moving from 0.21? The [0.22 architecture and adoption
//! guide](https://github.com/joaquinbejar/OptionStratLib/blob/main/docs/migration-0.22.md)
//! maps each redesign to its replacement workflow; 0.22 keeps no
//! compatibility with 0.21.
//!
//! ## Minimal example
//!
//! ```rust
//! use optionstratlib_backtest::backtesting::SimulationStatsResult;
//!
//! // A run's statistics start empty; `Simulate::simulate` fills them from a
//! // `Simulator`'s paths (see the runnable example below).
//! let stats = SimulationStatsResult::default();
//! assert_eq!(stats.total_simulations, 0);
//! ```
//!
//! ## Runnable example
//!
//! A runnable program that depends on this crate directly, with the smallest
//! dependency set and no facade, is [`osl-example-direct-backtest`](https://github.com/joaquinbejar/OptionStratLib/tree/main/examples/direct/backtest); `make tree-example-direct-backtest`
//! asserts its resolved graph.
//!
//! ## Features
//!
//! - `schema` (off by default): derives `utoipa::ToSchema` on the backtest
//! types and enables `schema` in core, pricing, simulation, analytics and
//! strategies.
/// Strategy backtests over simulated paths: evaluation, statistics, reports
/// and metrics.
/// Errors raised by the backtest layer.
/// Version of the `optionstratlib-backtest` crate.
pub const VERSION: &str = env!;
/// Compiles the Rust examples of this crate's `README.md` as doctests, so the
/// README cannot drift from the API (#554). Exists only under `cfg(doctest)`.
;