pub struct SimulationStats { /* private fields */ }Expand description
Running statistics over the runs of a strategy simulation.
Results are folded in one at a time through SimulationStats::update
(or SimulationStats::update_outcome for a bare PathOutcome). Each
result is projected onto its PathOutcome through the backtest
adapter, From<&SimulationResult> for PathOutcome, so the P&L of a run
is PnL::total_pnl, the
same figure crate::backtesting::results::SimulationStatsResult
reports.
The accumulator counts how each run closed (take profit, stop loss,
expiry) and by which exit policy. Every P&L and holding-period figure
(mean, median, standard deviation, best, worst, average holding period)
comes from SimulationStats::statistics, that is from
PathStatistics::from_outcomes over the stored outcomes; no second,
running copy of them is kept.
§Memory
Every outcome folded in is stored, and every result folded in through
update is stored as well, so memory grows linearly with the number of
runs. The outcomes cannot be rebuilt from the results on demand: an
outcome folded in through update_outcome has no result behind it.
Implementations§
Source§impl SimulationStats
impl SimulationStats
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new instance of SimulationStats with default values.
§Returns
A new SimulationStats instance with all counters set to zero.
Sourcepub fn update(&mut self, result: SimulationResult) -> Result<(), BacktestError>
pub fn update(&mut self, result: SimulationResult) -> Result<(), BacktestError>
Updates statistics with results from a single simulation run.
The counters are driven by the backtest adapter’s From<&SimulationResult> for PathOutcome view of the result, whose P&L is
PnL::total_pnl
(realized plus unrealized); the result itself is then stored and read
back through SimulationStats::results. A result whose P&L reports
a non-zero unrealized leg therefore counts with that leg included, as
in crate::backtesting::results::SimulationStatsResult.
§Parameters
result- The simulation result containing all metrics
§Errors
Returns BacktestError::CounterOverflow when a run counter
overflows. The accumulator is left untouched when that happens: every
fallible step is resolved before the first field is written, so a
rejected result cannot leave one counter advanced for a run the
others never saw.
Sourcepub fn update_outcome(
&mut self,
outcome: &PathOutcome,
) -> Result<(), BacktestError>
pub fn update_outcome( &mut self, outcome: &PathOutcome, ) -> Result<(), BacktestError>
Folds one generic path outcome into the counters.
This is the strategy-agnostic half of SimulationStats::update: it
advances the outcome counters and the exit-reason distribution, and
stores the outcome for SimulationStats::statistics.
§Errors
Same contract as SimulationStats::update: the accumulator is
left untouched when a counter overflows.
Sourcepub fn statistics(&self) -> Result<PathStatistics, BacktestError>
pub fn statistics(&self) -> Result<PathStatistics, BacktestError>
Aggregate statistics over every outcome folded in so far.
The figures are PathStatistics::from_outcomes over the outcomes
SimulationStats::update and SimulationStats::update_outcome
accepted, so they follow the same formulas, and for results the same
P&L, as crate::backtesting::results::SimulationStatsResult. An
outcome without a P&L counts as zero, in the mean and in the best and
worst figures alike.
§Errors
Returns BacktestError::Simulation carrying the error of
PathStatistics::from_outcomes, for example when the variance of a
P&L set far outside any traded size overflows Decimal.
Sourcepub fn total_simulations(&self) -> usize
pub fn total_simulations(&self) -> usize
Number of outcomes folded in.
Sourcepub fn profitable_closes(&self) -> usize
pub fn profitable_closes(&self) -> usize
Number of runs that closed on their take-profit condition.
Sourcepub fn loss_closes(&self) -> usize
pub fn loss_closes(&self) -> usize
Number of runs that closed on their stop-loss condition.
Sourcepub fn expired_trades(&self) -> usize
pub fn expired_trades(&self) -> usize
Number of runs that reached expiration without another exit.
Sourcepub fn total_pnl(&self) -> Result<Decimal, BacktestError>
pub fn total_pnl(&self) -> Result<Decimal, BacktestError>
Sum of the P&L of every run, in the strategy’s currency.
Summed over the stored outcomes, so it is the same P&L the
SimulationStats::statistics mean is taken over; a run without a
P&L counts as zero.
§Errors
Returns BacktestError::Decimal when the sum leaves the
representable Decimal range.
Sourcepub fn exit_reasons(&self) -> &HashMap<ExitPolicy, usize>
pub fn exit_reasons(&self) -> &HashMap<ExitPolicy, usize>
How many runs each exit policy closed.
Sourcepub fn results(&self) -> &[SimulationResult]
pub fn results(&self) -> &[SimulationResult]
The results folded in through SimulationStats::update, in
arrival order. Outcomes folded in through
SimulationStats::update_outcome alone are not stored.
Trait Implementations§
Source§impl Clone for SimulationStats
impl Clone for SimulationStats
Source§impl Debug for SimulationStats
impl Debug for SimulationStats
Auto Trait Implementations§
impl Freeze for SimulationStats
impl RefUnwindSafe for SimulationStats
impl Send for SimulationStats
impl Sync for SimulationStats
impl Unpin for SimulationStats
impl UnsafeUnpin for SimulationStats
impl UnwindSafe for SimulationStats
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.