qs-backtest 0.4.0

Backtesting engine — strategy and signal replay over historical market data
Documentation
//! `qs-backtest` — Backtesting engine for the quant-system workspace.
//!
//! This crate provides tools for replaying historical market data through the
//! [`qs_core::TradeEngine`] to evaluate trading strategies and predefined
//! signal sets.
//!
//! # Two modes of operation
//!
//! 1. **Strategy-driven** — implement the [`Strategy`] trait; the runner feeds
//!    market data tick-by-tick and your strategy decides when to act.
//! 2. **Signal replay** - provide strict timestamped [`RawSignal`] values; the runner injects them at the correct moments while replaying price data.
//!
//! # Key types
//!
//! | Type | Purpose |
//! |------|---------|
//! | [`BacktestRunner`] | Orchestrates the backtest loop (both modes) |
//! | [`BacktestExecutor`] | Tracks simulated fills, positions, and P&L |
//! | [`BacktestResult`] | Final report with P&L, drawdown, and execution artifacts |
//! | [`DataFeed`] | Trait for sequential market event sources |
//! | [`Strategy`] | Trait for strategy-driven backtests |

pub mod artifacts;
pub mod currency;
pub mod data_feed;
pub mod economic_support;
pub mod evaluation;
pub mod executor;
pub mod future_executor;
pub mod ledger;
pub mod mtm;
pub mod portfolio;
pub mod profile;
pub mod report;
pub mod runner;
pub mod sizing;
pub mod strategy;

// ── Convenience re-exports ──────────────────────────────────────────────────

pub use artifacts::{
    CloseEvent, CompletedPosition, CostEvent, ExecutionMetadata, FutureBacktestArtifacts,
    InstrumentSizingArtifact, MarketEntrySizingAudit, MarketEntrySizingBasis, NetPnlOutcome,
    OpenPositionSnapshot, PendingOrderLifecycleEvent, PendingOrderLifecycleState,
    PendingOrderSnapshot, RecordedFill, ReplayInstrumentArtifact, ReplayInstrumentManifest,
    RiskBasisStatus, RiskTranche,
};
pub use qs_core::{
    CommissionModel, CostBasis, CostCharge, CostKind, CostValidationError, InstrumentCosts,
    SwapAmount, SwapSchedule,
};

pub use currency::{
    ConversionError, ConversionLeg, ConversionLegAudit, ConversionPriceSide, ConversionQuoteBook,
    ConversionResult, ConversionRoute, FxPair, FxPairDirection, QuoteValidationError,
    RunCurrencyPlan, RunCurrencyPlanError, resolve_conversion_route, resolve_fx_pair,
};
pub use data_feed::BarExecutionPrices;
pub use data_feed::{DataFeed, MarketEvent, VecFeed};
pub use economic_support::{
    EconomicSupportError, LEGACY_ECONOMIC_GUARD_ID, LegacyEconomicModel, SupportedLegacyEconomics,
    guarded_instrument_spec, resolve_legacy_economics,
};
pub use evaluation::{
    BootstrapConfig, BreakdownDimension, EvaluationContext, EvaluationOptions, EvaluationReport,
    EvaluationSection, GroupFilter, PositionFilter, PositionSide,
};
pub use executor::BacktestExecutor;
pub use future_executor::FutureExecutor;
pub use mtm::{
    DEFAULT_MTM_MAX_POINTS, MAX_MTM_MAX_POINTS, MIN_MTM_MAX_POINTS, MtmCurveCollector,
    MtmOutputPolicy, MtmOutputPolicyError, MtmOutputSummary,
};
pub use profile::{
    EntryGeometryPolicy, EntryLevelResolution, EntryProfileRoutingError, EntryResolutionContext,
    GeneratedTargetResolution, ManagementProfile, PositionRef, PositionResolver,
    PreparedEntryProfiles, PriceGridSource, ProfileApplicationError, ProfileError, ProfileRegistry,
    ProfileRegistryError, ProfileValidationError, RawSignal, ResolvedEntry, RuleConfigDef,
    StoplossMode, TargetResolution, TargetResolutionSource, TargetSelection, TargetSource,
    allocate_target_units, resolve_signal, resolve_unprofiled_entry,
};
pub use report::{
    BacktestResult, CloseReasonStats, DurationStats, MonthlyReturn, PositionSummary, RiskMetrics,
    StreakStats, SubsetStats, TradeResult,
};
pub use runner::{
    BacktestRunner, FutureQuoteConfig, ReplayCancelled, ReplayProgress, StreamingReplayError,
};
pub use strategy::{
    AnalysisBoundary, AnalysisBoundaryOutput, AnalysisContext, AnalysisError, AnalysisPipeline,
    AnnotationError, AnnotationId, AnnotationLimits, AnnotationTimeline, AnnotationUse,
    BacktestConfiguredStrategyAdapter, BarSeriesSpec, BarWindow, CalendarAdmissionLimits,
    CalendarBar, CalendarError, CalendarFeatureKind, CalendarFeatureProjector, CalendarInputSpec,
    CalendarTimeBasis, ClosedBar, ConfiguredCalendarFeatureProjector, ConfiguredCalendarInput,
    ConfiguredEntryProfileError, ConfiguredHistoricalBindings, ConfiguredNamedInputBinding,
    ConfiguredSourceBinding, ConfiguredStrategyAdapterBuildError, ConfiguredStrategyAdapterError,
    ConfiguredStrategyAdapterPreflightError, ConfiguredTradingCalendar, ConfirmedPivotAnalyzer,
    ConfirmedSwingFactKind, ConfirmedSwingFactProjector, DEFAULT_CALENDAR_SESSION_ID,
    FixedUtcSessionError, FixedUtcSessionProjector, HistoricalAnalyzer,
    HistoricalNamedInputProjector, HistoricalObservationView, HistoricalSeriesView,
    HistoricalStrategy, HistoricalVolumeProjection, IanaTradingCalendar, JournalKind,
    LocalMarketIntervalSpec, MAX_ANALYZERS, MAX_ANNOTATION_ID_BYTES, MAX_ANNOTATION_NOTE_BYTES,
    MAX_ANNOTATIONS, MAX_CHART_REF_BYTES, MAX_DECISION_LATENCY_MS, MAX_DECISION_RECORDS,
    MAX_EXPERIMENT_LABEL_BYTES, MAX_INSTRUMENT_BYTES, MAX_JOURNAL_PER_CALLBACK,
    MAX_JOURNAL_REASON_BYTES, MAX_JOURNAL_RECORDS, MAX_JOURNAL_VALUE_KEY_BYTES, MAX_JOURNAL_VALUES,
    MAX_OBSERVATION_SOURCE_SERIES, MAX_OBSERVATIONS_PER_BOUNDARY, MAX_PIVOT_SIDE_BARS,
    MAX_REASON_BYTES, MAX_RETAINED_BARS, MAX_RETAINED_OBSERVATIONS, MAX_SERIES_ID_BYTES,
    MAX_SESSION_WINDOWS, MAX_SIGNALS_PER_CALLBACK, MAX_STRATEGY_ID_BYTES,
    MAX_STRATEGY_REVISION_BYTES, MAX_STRATEGY_TITLE_BYTES, MAX_TRADE_ID_BYTES, MAX_WARMUP_BARS,
    MAX_ZONE_ID_BYTES, MarketScheduleSpec, MissingIntervalPolicy, MomentumState,
    MultiTimeframeSeries, NamedInputProjectionContext, NamedInputProjectionError, NamedSessionSpec,
    ObservationOrigin, ObservationSelection, ObservationStore, ObservationStoreLimits,
    ObservationWindow, OpeningRange, PivotConfig, PriceBasis, PriceZone, ProjectedNamedInput,
    RejectionPattern, ResolvedSession, ResolvedSessionOccurrence, ResolvedTradingDay, SeriesError,
    SeriesGeometry, SeriesGeometryError, SeriesId, SeriesRequirement, SeriesViewError,
    SeriesWarmupState, SessionOccurrenceId, SessionScheduleSpec, SessionSpanSpec,
    SourceBarFactKind, SourceBarFactProjector, Strategy, StrategyAnnotation,
    StrategyBacktestResult, StrategyComparisonMetrics, StrategyComparisonSnapshot,
    StrategyConfigError, StrategyContext, StrategyDecisionDraft, StrategyDecisionKind,
    StrategyDecisionOutput, StrategyDecisionRecord, StrategyDecisionRecorder,
    StrategyDecisionRetention, StrategyDescriptor, StrategyDomainError, StrategyEvent,
    StrategyExperimentComparison, StrategyExperimentError, StrategyFeedback, StrategyFeedbackEvent,
    StrategyId, StrategyJournalDraft, StrategyJournalError, StrategyJournalOutput,
    StrategyJournalRecord, StrategyJournalRecorder, StrategyJournalRetention, StrategyObservation,
    StrategyObservationDraft, StrategyObservationValue, StrategyOutput, StrategyReplayError,
    StrategyReplayInputError, StrategyRequirements, StrategyResearchLimits, StrategyResearchOutput,
    StrategyRetentionLimits, StrategyRuntimeError, SwingKind, SwingPoint, Timeframe,
    TradingCalendarSpec, WarmupRequirement, WeeklyMarketIntervalSpec, ZoneId, ZoneSide, ZoneSource,
    ZoneState,
};
pub use strategy::{
    ConfiguredInstance, DirectPortfolioInstance, INSTANCE_POSITION_TAG, MAX_PORTFOLIO_INSTANCES,
    MixedPortfolioBacktestResult, MixedPortfolioReplayError, PortfolioBacktestResult,
    PortfolioInstanceOutput, PortfolioReplayError, SupervisorEvent, SupervisorHaltAction,
    SupervisorOutput,
};