Skip to main content

qs_backtest/
lib.rs

1//! `qs-backtest` — Backtesting engine for the quant-system workspace.
2//!
3//! This crate provides tools for replaying historical market data through the
4//! [`qs_core::TradeEngine`] to evaluate trading strategies and predefined
5//! signal sets.
6//!
7//! # Two modes of operation
8//!
9//! 1. **Strategy-driven** — implement the [`Strategy`] trait; the runner feeds
10//!    market data tick-by-tick and your strategy decides when to act.
11//! 2. **Signal replay** - provide strict timestamped [`RawSignal`] values; the runner injects them at the correct moments while replaying price data.
12//!
13//! # Key types
14//!
15//! | Type | Purpose |
16//! |------|---------|
17//! | [`BacktestRunner`] | Orchestrates the backtest loop (both modes) |
18//! | [`BacktestExecutor`] | Tracks simulated fills, positions, and P&L |
19//! | [`BacktestResult`] | Final report with P&L, drawdown, and execution artifacts |
20//! | [`DataFeed`] | Trait for sequential market event sources |
21//! | [`Strategy`] | Trait for strategy-driven backtests |
22
23pub mod artifacts;
24pub mod currency;
25pub mod data_feed;
26pub mod economic_support;
27pub mod evaluation;
28pub mod executor;
29pub mod future_executor;
30pub mod ledger;
31pub mod mtm;
32pub mod portfolio;
33pub mod profile;
34pub mod report;
35pub mod runner;
36pub mod sizing;
37pub mod strategy;
38
39// ── Convenience re-exports ──────────────────────────────────────────────────
40
41pub use artifacts::{
42    CloseEvent, CompletedPosition, ExecutionMetadata, FutureBacktestArtifacts,
43    InstrumentSizingArtifact, NetPnlOutcome, OpenPositionSnapshot, PendingOrderLifecycleEvent,
44    PendingOrderLifecycleState, PendingOrderSnapshot, RecordedFill, ReplayInstrumentArtifact,
45    ReplayInstrumentManifest, RiskBasisStatus, RiskTranche,
46};
47pub use currency::{
48    ConversionError, ConversionLeg, ConversionLegAudit, ConversionPriceSide, ConversionQuoteBook,
49    ConversionResult, ConversionRoute, FxPair, FxPairDirection, QuoteValidationError,
50    RunCurrencyPlan, RunCurrencyPlanError, resolve_conversion_route, resolve_fx_pair,
51};
52pub use data_feed::{DataFeed, MarketEvent, VecFeed};
53pub use economic_support::{
54    EconomicSupportError, LEGACY_ECONOMIC_GUARD_ID, LegacyEconomicModel, SupportedLegacyEconomics,
55    guarded_instrument_spec, resolve_legacy_economics,
56};
57pub use evaluation::{
58    BootstrapConfig, BreakdownDimension, EvaluationContext, EvaluationOptions, EvaluationReport,
59    EvaluationSection, GroupFilter, PositionFilter, PositionSide,
60};
61pub use executor::BacktestExecutor;
62pub use future_executor::FutureExecutor;
63pub use mtm::{
64    DEFAULT_MTM_MAX_POINTS, MAX_MTM_MAX_POINTS, MIN_MTM_MAX_POINTS, MtmCurveCollector,
65    MtmOutputPolicy, MtmOutputPolicyError, MtmOutputSummary,
66};
67pub use profile::{
68    ManagementProfile, PositionRef, PositionResolver, ProfileApplicationError, ProfileError,
69    ProfileRegistry, ProfileRegistryError, ProfileValidationError, RawSignal, ResolvedEntry,
70    RuleConfigDef, StoplossMode, TargetResolution, TargetSelection, allocate_target_units,
71    resolve_signal, resolve_unprofiled_entry,
72};
73pub use report::{
74    BacktestResult, CloseReasonStats, DurationStats, MonthlyReturn, PositionSummary, RiskMetrics,
75    StreakStats, SubsetStats, TradeResult,
76};
77pub use runner::{
78    BacktestRunner, FutureQuoteConfig, ReplayCancelled, ReplayProgress, StreamingReplayError,
79};
80pub use strategy::{
81    AnalysisBoundary, AnalysisBoundaryOutput, AnalysisContext, AnalysisError, AnalysisPipeline,
82    AnnotationError, AnnotationId, AnnotationLimits, AnnotationTimeline, AnnotationUse,
83    BacktestConfiguredStrategyAdapter, BarSeriesSpec, BarWindow, ClosedBar,
84    ConfiguredHistoricalBindings, ConfiguredNamedInputBinding, ConfiguredSourceBinding,
85    ConfiguredStrategyAdapterBuildError, ConfiguredStrategyAdapterError,
86    ConfiguredStrategyAdapterPreflightError, ConfirmedPivotAnalyzer, HistoricalAnalyzer,
87    HistoricalNamedInputProjector, HistoricalObservationView, HistoricalSeriesView,
88    HistoricalStrategy, HistoricalVolumeProjection, JournalKind, MAX_ANALYZERS,
89    MAX_ANNOTATION_ID_BYTES, MAX_ANNOTATION_NOTE_BYTES, MAX_ANNOTATIONS, MAX_CHART_REF_BYTES,
90    MAX_DECISION_LATENCY_MS, MAX_DECISION_RECORDS, MAX_EXPERIMENT_LABEL_BYTES,
91    MAX_INSTRUMENT_BYTES, MAX_JOURNAL_PER_CALLBACK, MAX_JOURNAL_REASON_BYTES, MAX_JOURNAL_RECORDS,
92    MAX_JOURNAL_VALUE_KEY_BYTES, MAX_JOURNAL_VALUES, MAX_OBSERVATION_SOURCE_SERIES,
93    MAX_OBSERVATIONS_PER_BOUNDARY, MAX_PIVOT_SIDE_BARS, MAX_REASON_BYTES, MAX_RETAINED_BARS,
94    MAX_RETAINED_OBSERVATIONS, MAX_SERIES_ID_BYTES, MAX_SIGNALS_PER_CALLBACK,
95    MAX_STRATEGY_ID_BYTES, MAX_STRATEGY_REVISION_BYTES, MAX_STRATEGY_TITLE_BYTES,
96    MAX_TRADE_ID_BYTES, MAX_WARMUP_BARS, MAX_ZONE_ID_BYTES, MissingIntervalPolicy, MomentumState,
97    MultiTimeframeSeries, NamedInputProjectionContext, NamedInputProjectionError,
98    ObservationOrigin, ObservationSelection, ObservationStore, ObservationStoreLimits,
99    ObservationWindow, PivotConfig, PriceBasis, PriceZone, ProjectedNamedInput, RejectionPattern,
100    SeriesError, SeriesId, SeriesRequirement, SeriesViewError, SeriesWarmupState, Strategy,
101    StrategyAnnotation, StrategyBacktestResult, StrategyComparisonMetrics,
102    StrategyComparisonSnapshot, StrategyConfigError, StrategyContext, StrategyDecisionDraft,
103    StrategyDecisionKind, StrategyDecisionOutput, StrategyDecisionRecord, StrategyDecisionRecorder,
104    StrategyDecisionRetention, StrategyDescriptor, StrategyDomainError, StrategyEvent,
105    StrategyExperimentComparison, StrategyExperimentError, StrategyFeedback, StrategyFeedbackEvent,
106    StrategyId, StrategyJournalDraft, StrategyJournalError, StrategyJournalOutput,
107    StrategyJournalRecord, StrategyJournalRecorder, StrategyJournalRetention, StrategyObservation,
108    StrategyObservationDraft, StrategyObservationValue, StrategyOutput, StrategyReplayError,
109    StrategyReplayInputError, StrategyRequirements, StrategyResearchLimits, StrategyResearchOutput,
110    StrategyRetentionLimits, StrategyRuntimeError, SwingKind, SwingPoint, Timeframe,
111    WarmupRequirement, ZoneId, ZoneSide, ZoneSource, ZoneState,
112};