Changelog
September 5, 2026 · View on GitHub
All notable changes to this project will be documented in this file.
[0.12.0] - 2026-09-05
- Limit FX refreshes and rebalancing to active/target positions; reuse rebalance scratch storage.
- Reuse option-fill margin totals and update long-only option margins by delta; skip unchanged margin inputs.
- Speed up position churn and bulk expiry with indexed scheduling and batched cleanup. Public APIs are unchanged.
- Speed up financing, expiry, and FX processing with event indices; reuse validated option-margin projections.
- Eliminate temporary allocations in ordinary fills without trade history; add allocation tests and runtime/scaling benchmarks.
- Breaking API change:
Accountgains a third type parameter for trade recording. Constructors and partial annotations such asAccount{DateTime,NoOpBroker}remain supported; code assuming exactly two parameters must be updated.
[0.11.0] - 2026-09-05
This release reduces package loading time with fewer dependencies, built-in text and SVG rendering, and the lighter RiskPerf 0.4 dependency graph.
Breaking changes ⚠️
- Removed esoteric
plot_violin_realized_returns_by_dayandplot_violin_realized_returns_by_hour, their exports and examples, and the optional StatsPlots dependency. Fastback.plot_*now uses built-in SVG by default. To retain Plots.jl output, runusing Plotsandset_plot_backend!(:plots), or passbackend=:plotsto individual calls.
Added
- A unified
Fastback.plot_*interface with built-in SVG rendering and optional Plots.jl output, selected globally throughset_plot_backend!or per call withbackend. - SVG strings and IO-first
!methods for balance, equity, open orders, drawdown, exposure, portfolio weights, cashflows, and cumulative realized returns, without additional dependencies. - SVG plots return inline
Base.HTMLresults by default. Useset_svg_output_format!(:string)for raw SVG strings or:htmlto restore inline display; individual calls accept anoutput_formatoverride. - Dark SVG presentation theme, separate equity/drawdown axes, maximum-drawdown markers, and stacked portfolio weights.
Changed
- Replaced PrettyTables and Crayons with built-in colored text tables for account and exchange-rate displays. Numeric precision, row limits, and terminal-width cropping are preserved; colors follow the IO context.
- Removed the Query dependency; the Plots extension groups realized returns with plain Julia, while documentation examples retain their own Query dependency.
- Require RiskPerf 0.4, which replaces Distributions with StatsFuns and reduces package loading overhead.
- SVG is the primary plotting approach in the README, quickstarts, API guide, and plotting showcases; Plots.jl remains an optional extension.
- Both plotting backends select maximum-drawdown markers by the collector's mode and use non-negative default limits with a bounded number of integer ticks for open-order counts.
[0.10.0] - 2026-09-01
Breaking changes ⚠️
- Fastback now requires Julia 1.12 or later; older Julia releases are no longer supported.
- Variation-margin
Trade.fill_pnl_settlenow attributes previously settled mark-to-market P&L to reductions and final expiry. Opening execution-to-mark cash still settles immediately, but remains attached to the open position until exposure is realized. As a result, gross trade P&L and same-fill cash movement can differ. - Account operations now enforce non-decreasing time consistently. Backdated fills, marks, financing calls, lifecycle operations, and event steps are rejected.
- Direct
update_rate!(acc, ...)calls are rejected while exposure is open; useprocess_step!(...; fx_updates=...)so dependent values and margins are revalued together. process_step!and multi-stage lifecycle operations are fail-stop rather than transactional. If one fails, completed changes remain and the account is markedpoisoned; discard it rather than continuing the backtest.Tradehas a newpreceding_split_factorfield for split-aware analytics. The previous positional constructor remains available and defaults the factor to1.0.performance_summarynow interpretsrisk_freeandmaras annualized simple rates and converts them to per-period thresholds usingperiods_per_year.
Added
- Optional target-weight portfolio management with
Portfolio,TargetWeights,RebalancePolicy, deterministic fill models, explicit futures/perpetual rolls, fully funded cash scaling, exposure snapshots, and reduction-first execution. apply_spot_corporate_action!for spot splits, reverse splits, and signed cash dividends, includingCashflowKind.CashDividendand split-aware holding-period reconstruction.AccountPoisonedErroridentifies attempts to advance a failed account.- Boundary validation for fill quantities and ownership, crossed quotes, cash amounts, instrument metadata, exchange rates, and conversion overflows.
Changed
process_step!coalesces repeated FX, mark, and option-underlying observations with last-observation-wins semantics without copying account-wide state.- Duplicate market observations are indexed by route, option chain, or instrument, making coalescing linear in the event count.
process_expiries!settles short options first, futures second, and long options last, preserving registration order within each priority group.create_order!validates account-owned strategy orders, assigns their IDs, and advances account time at order creation; directOrder(...)construction remains available as a low-level compatibility path.- Ordinary fills now plan mark settlement, borrow fees, execution effects, margin, and trade notional before committing; a failed fill leaves marks, cash, positions, financing clocks, and history unchanged.
- Futures/option expiry batches, rolls, liquidation, and corporate actions retain completed changes and poison the account when any later stage fails.
- Exchange-rate updates reject Float64 values whose reciprocal is not finite before resizing or changing the rate matrix.
StepSchedulesorts breakpoints and rejects empty schedules and duplicate timestamps.check_invariantsindependently recomputes position values and portfolio margins and now audits registry layout, flat-position state, ledger numerics, and history ordering.calc_base_qty_for_notionaluses tolerance-aware tick arithmetic and clamps to inward tick-aligned quantity bounds.- Hot fill and mark paths no longer rescan every derived field for finiteness; critical input, route, conversion, and ledger boundaries remain validated.
[0.9.0] - 2026-05-04
Added
- Basic listed option support via
ContractKind.Option,OptionRight,OptionExerciseStyle, andoption_instrument. - Quote-driven option premium accounting, underlying mark updates through
OptionUnderlyingUpdate, and cash-settled option expiry viasettle_option_expiry!. - Conservative short-option margin with instrument-level
option_short_margin_rateandoption_short_margin_min_rateparameters, plus bounded multi-leg option margin relief for spreads, butterflies, and condors. fill_option_strategy!for atomic multi-leg option fills checked against final package buying power.- IBKR Pro Fixed option commissions with premium tiers and per-order minimums.
[0.8.0] - 2026-05-03
Added
PerformanceSummarynow includes additional equity-curve diagnostics, changing positional construction and the exactperformance_summary_tableschema.performance_summarynow reportsn_periods,best_ret,worst_ret,positive_period_rate,expected_shortfall_95,skewness,kurtosis,downside_vol,max_dd_duration,pct_time_in_drawdown, andomega.performance_summary_tableexposes the newPerformanceSummaryfields as Tables.jl columns.
[0.7.0] - 2026-04-12
Added
PerformanceSummary,TradeSummary,QuoteTradeSummary,SettlementTradeSummary,RealizedHoldingPeriod, andHoldingPeriodSummaryresult types with explicit fields and compact REPL display.performance_summary,trade_summary,realized_holding_periods,holding_period_summary, andpnl_concentrationanalytics helpers.gross_realized_pnl_quoteandnet_realized_pnl_quotehelpers for quote-currency realized P&L diagnostics.performance_summary_tableas a one-row Tables.jl source exposing the fields ofPerformanceSummary, including trade diagnostics such asn_trades,n_closing_trades,winners, andlosers.performance_summaryreturns unrounded numeric values with compact display,trade_summarygroups quote- and settlement-currency diagnostics by currency, andpnl_concentrationreports realized P&L concentration by bucket and quote currency.
[0.6.0] - 2026-04-11
Breaking changes ⚠️
Tradenow stores fill-time base-currency traded notional in the newnotional_basefield. PositionalTradeconstruction must include this field.
Added
turnover_collector,TurnoverValues, andTurnoverModefor account-level turnover series. The collector tracks gross traded notional by period using fill-time base-currency notionals, reports round-trip turnover by default, supports one-way notional turnover viaTurnoverMode.OneWay, returnsNaNfor nonpositive base-currency equity, and includes the turnover mode in Tables.jl rows.
[0.5.1] - 2026-03-23
Changed
Cashflowstruct immutable now.Accountconstructor parameterstrack_tradesandtrack_cashflowsto optionally switch off tracking of trades and cashflows. Newtrade_countfield that's always populated, even iftrack_trades=false.
[0.5.0] - 2026-02-15
Breaking changes ⚠️
- Complete rework of the API with lots of renamings, restructuring and new features.
- Introduction of margin- and futures trading support as first-class concepts.
- Introduction of broker concept.
[0.4.0] - 2025-09-26
Breaking changes ⚠️
-
Accountnow only uses keyword arguments in constructor -
Renamings for clarity (update any usages accordingly!):
cash->cash_balancecash_object->cash_assethash_cash_symbol->has_cash_assetformat_date->format_datetimeregister_cash!->register_cash_asset! -
Split
add_cash!function intodeposit!andwithdraw!(update any usages accordingly!) -
should_collectfunction must be called for all collectors to determine if a value should be collected -
predicateparameter removed fromdrawdown_collectorfunction, onlyPeriodremains supported
Added
- Add Tables.jl integration for account artefacts and collectors
- New Glossary page in docs
- Generalized support for arbitrary
Dates.AbstractTimetypes across the package for date/time handling instead of justDateTime - Example integrations for
NanoDates.jlandTimestamps64.jltime provider packages
Changed
- Consistently use of
qtyinstead ofquantityfor display outputs - Explicitly export all public API functions in
Fastback.jl
[0.3.0] - 2025-09-25
- Introduce optional take_profit and stop_loss fields for Order
- Switch to TestItemRunner.jl for unit tests
[0.2.0] - 2025-09-23
- Update code to integrate PrettyTables v3 due to breaking changes
- Set PrettyTables v3 compatibility constraint in Project.toml
[0.1.0] - 2025-07-23
- First release