This document describes additive utility tools exposed by BacktestingKit. These tools do not alter v2/v3 engine model shapes or parity behavior.
- Validate input (
BKValidationTool) - Emit lifecycle diagnostics (
BKDiagnosticsCollector) - Run engine (
BKEngine.runV2/BKEngine.runV3) - Export payloads (
BKExportTool) - Compare run summaries (
BKComparisonTool) - Benchmark/parity checks in CI (
BKBenchmarkTool,BKParityTool)
Purpose: Preflight validation before execution.
validateCSV(_:columnMapping:)- Verifies strict CSV parseability (ISO8601 date, chronological order, required columns).
- Returns
BKValidationReportwith structuredBKValidationIssueentries.
validateV2Request(_:)- Validates
BKEngine.V2Requestshape (empty IDs, suspicious period ranges).
- Validates
validateV3Request(_:)- Validates
BKEngine.V3Requestshape.
- Validates
Output types:
BKValidationSeverityBKValidationIssueBKValidationReport
Example:
let validation = BKValidationTool.validateCSV(csvText, columnMapping: nil)
guard validation.isValid else {
// Show validation.issues in UI
return
}Purpose: Capture structured lifecycle events for UI and troubleshooting.
append(_:)emit(kind:stage:message:metadata:)snapshot()clear()
Event types:
BKDiagnosticEventKindBKDiagnosticEvent
Example:
let diagnostics = BKDiagnosticsCollector()
await diagnostics.emit(kind: .validationStarted, stage: "validation", message: "CSV preflight")Purpose: Measure latency and optional memory deltas for repeatable micro-benchmarks.
run(name:iterations:warmup:measureMemory:block:)runAsync(name:iterations:warmup:measureMemory:block:)
Result types:
BKBenchmarkSampleBKBenchmarkResult
Example:
let bench = BKBenchmarkTool.run(name: "parse-csv", iterations: 20) {
_ = csvToBarsStreaming(csvText, reverse: false, strict: true)
}Purpose: Compare expected/actual numeric metrics with a tolerance.
compareMetrics(expected:actual:tolerance:)compareAnalysis(expected:actual:tolerance:)
Result types:
BKParityMismatchBKParityReport
Example:
let report = BKParityTool.compareMetrics(expected: baseline, actual: candidate, tolerance: 1e-6)
if !report.isMatch {
// show report.mismatches
}Purpose: Deterministic synthetic scenario generation for reproducible simulation tests.
generateCandles(config:)run(config:)defaultSmokeConfigs()validate(config:)summarize(config:)runExportBundle(config:diagnostics:prettyPrinted:)smokeSuite(configs:)
Config/result types:
BKScenarioStrategyBKScenarioConfigBKScenarioResultBKScenarioReadinessReportBKScenarioSmokeCaseReportBKScenarioSmokeSuiteReport
Example:
let scenario = BKScenarioTool.run(config: BKScenarioConfig(seed: 42))
print(scenario.backtest.totalReturn)Purpose: Compare compact helper summaries for regressions and smoke-test review.
diffSummaries(baseline:candidate:)Produces a structured summary diff including headline metric deltas.compareRuns(baseline:candidate:tolerance:)Flags whether summary differences exceed a caller-supplied tolerance.assertEquivalent(baseline:candidate:tolerance:)ThrowsBKComparisonAssertionErrorwhen summary differences exceed the allowed tolerance.
Output types:
BKRunMetricDiffBKRunSummaryDiffBKRunComparisonReportBKComparisonAssertionError
Example:
let report = BKComparisonTool.compareRuns(
baseline: baselineSummary,
candidate: candidateSummary,
tolerance: 0.001
)Purpose: Stable payload export for downstream tooling/UI.
toJSON(_:prettyPrinted:)tradesToCSV(_:)exportPreflight(_:trades:prettyPrinted:)exportRunBundle(summary:trades:diagnostics:scenario:prettyPrinted:)exportMarkdownSummary(_:,title:)
Error type:
BKExportError
Example:
let export = BKExportTool.tradesToCSV(trades)
let json = BKExportTool.toJSON(analysis)- Tools return
Resultand typed errors where relevant. - Validation returns structured issue arrays instead of throwing.
- Export failures are surfaced as
BKExportError.
- Run benchmark and parity helpers in deterministic mode (fixed seeds/tolerances).
- Keep tolerances explicit in parity checks per metric family.
- Store benchmark outputs as artifacts for release-to-release comparison.