Skip to main content

SimulationStats

Struct SimulationStats 

Source
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

Source

pub fn new() -> Self

Creates a new instance of SimulationStats with default values.

§Returns

A new SimulationStats instance with all counters set to zero.

Source

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.

Source

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.

Source

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.

Source

pub fn total_simulations(&self) -> usize

Number of outcomes folded in.

Source

pub fn profitable_closes(&self) -> usize

Number of runs that closed on their take-profit condition.

Source

pub fn loss_closes(&self) -> usize

Number of runs that closed on their stop-loss condition.

Source

pub fn expired_trades(&self) -> usize

Number of runs that reached expiration without another exit.

Source

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.

Source

pub fn exit_reasons(&self) -> &HashMap<ExitPolicy, usize>

How many runs each exit policy closed.

Source

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

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SimulationStats

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SimulationStats

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more