point-in-time backtesting lab
Starting up…
PREVIEW MODE: no engine attached. Data shown is illustrative. Start the app with python main.py for real functionality.

Before you start

Midas is research software, not investment advice. Everything it produces is a hypothetical backtest: a simulation built with hindsight, not the record of real trading.

Please read the Terms of Use and the Privacy Policy.

reusable scoring strategies. Build once, link from any System
reusable universes. Build once, apply to any backtest

Guide

how Midas works, how to use it, and the math underneath

What is Midas?

Midas is a point-in-time backtesting lab. You design a Backtest (a reproducible recipe for an investing approach), and Midas replays it against history using only the data that was actually public at each moment, so a result can never peek at the future. It is deliberately philosophy-neutral: growth, value, quality, momentum, dividend, or fixed-basket ideas all run on the same engine, scored the same honest way.

The workflow

1. Backtests page → + New Backtest. 2. Walk the steps: StrategyCompaniesTimelineCashflows. Coverage is the wheel beside Run, not a step. In Strategy, use a saved library strategy, a built-in single or pair, or choose Choose my own investments and allocations: the Companies step holds your investments and their allocations. Strategies and lists are built in the Library and picked up in the builder. 3. Hit Run ▶ and pick everything to compare. 4. Read the results (chart, summary, portfolio-through-time, scorecard, rebalancing, taxes, observations). Every run is also saved to History.

Why "reproducible"?

A Backtest is a saved document: the same inputs produce the same result (a saved run in Runs is frozen exactly as it was). The Reliability check tells you how much of the data the backtest needs actually existed, so you know whether to believe the headline number. The only thing that legitimately moves a re-run is the passage of time (backtests end today) or your data provider revising history.

Use the tabs above to dig into each area. Midas is research software, not investment advice. See the Disclaimer.

Backtests

A Backtest is one saved recipe. Its Strategy step decides who picks the holdings:

A scored strategy re-ranks your universe on each Timeline date and deploys capital to the top names. This is the research workhorse (e.g. "own the 10 highest-quality stocks, re-checked quarterly").
Your own picks: you fix the tickers and their target weights once; no scoring. Good for testing a specific basket or a model portfolio.
Benchmark: holds a single ETF (e.g. SPY/QQQ) and mirrors the first backtest's cashflows 1:1, so the comparison is apples-to-apples. Tick them in the selection action bar to compare against your backtests, or tick only benchmarks to run them on their own: with no backtest to mirror, each buys $10,000 at the start of the available price history and holds it to today.

Comparing & viewing

When you hit Run ▶, the table itself becomes the picker: tick the backtests to chart together (a checkbox appears beside each name), toggle any benchmark chips under the toolbar, then hit Run (N) ▶. On the results page a frozen strip lets you switch which one you're viewing at any time: its line is drawn on top, gets the headline number, and the portfolio-through-time, strategy, rebalancing and taxes panels reflect it.

Organizing

Click the crown to favourite a backtest (only favourites show gold names). Make named categories per group and drag rows between them; picking a row up turns off column-sort so your manual order sticks. Sort any column by clicking its header. Categories, favourites and manual order all persist across restarts.

Editing safely

Everything auto-saves. Use ↶ Undo / ↷ Redo in the editor to walk changes back and forth. Duplicate clones a backtest (and keeps you on the same tab). A trust re-audit only runs when you change something that affects the data needed, not when you tweak a weight.

Strategies

A Strategy decides what deserves capital. It is a set of metrics drawn from the library (revenue growth, ROIC, FCF yield, P/E, debt/equity, momentum, …), each tagged with a group (Income statement, Valuation, Profitability, Health, …) from the library's own taxonomy.

Weights & groups

Each metric has a direction (higher- or lower-is-better: flip it with the LOWER/HIGHER toggle) and a weight. A metric's share of the score is its weight over the sum of all weights, and the strategy visual shows those shares as one ring.

Reuse & visuals

Strategies are built in the Library (each is a reusable card) and linked into backtests. Click the donut in a backtest's Strategy column for a blown-up view of its make-up (metrics, groups, and a Swap Strategy button), or the + to link one. Editing a strategy updates every backtest that links it (resolved at run time); a saved run in History stays frozen. The outer donut uses the fixed group→colour map; inner metric slices use related shades so their parent grouping remains legible.

Gotcha: why weight tweaks sometimes don't move results

The basket rule + DCA method (next tab) decide the actual portfolio. If you hold an Equal-weighted Top-N and a weight tweak only re-orders names within that same top-N set, the portfolio (and the result) won't change. To make weights bite, use a rank/blend DCA, tighten the Top-N, or change which metrics are selected.

Universe: who's eligible

The Universe is the pool of companies a backtest may hold. On each re-score date, every eligible ticker is scored; any ticker missing a required metric is dropped from that date's ranking entirely, never silently scored as an average, which is how lookalike tools quietly corrupt results. A ticker also needs at least a year of filed quarterly statements (4 quarters) on that date to be scored at all, so a barely-public company can't rank top-N on one quarter of noisy data (a real failure mode on deep-history backtests with thin early fundamentals).

Point-in-time correctness

Financial statements are sliced by filing date, so a backtest only ever uses what was public on the as-of date. Index membership is reconstructed point-in-time (the members as of that date, not today's list) to avoid survivorship bias, from a built-in S&P 500 history (1996–present) that needs no data provider, so companies that were in the index then but have since delisted are still in the past universe.

Data providers

Sharadar (via Nasdaq Data Link), the point-in-time core: prices from 1998 and fundamentals from 1990, covering delisted companies as well as live ones. That last part is what makes a survivorship-free backtest possible at all; it is why Midas uses this source rather than a free one. SEC EDGAR, free and public-domain: filing dates, SIC sectors, fund holdings, and bankruptcy detection, merged on top. Enable sources in Settings → Data providers; the Strategy metrics on offer are limited to what your enabled providers can actually supply, so the Reliability check never fails on data that never existed. The Missing-data policy (drop vs fill) also lives there.

Cashflows

Set one-time and/or recurring contributions and withdrawals (one-time on a date; recurring with a from/to window and cadence). The earliest cashflow date anchors where the backtest actually begins.

Basket rule + DCA method

Under a scored strategy, the basket rule (e.g. Top 10) selects which ranked names are eligible at each contribution. The DCA method then sizes them:

Equal: every selected name gets the same weight.
Linear · rank / Quad · rank: more capital to higher-ranked names (quad is steeper).
Linear · discount / Quad · discount: more to names trading further below their 2-year high.
Blend: rank × discount combined.
Momentum: weights by 12-month return.
Set allocations (your own picks): your fixed weights.

Capital-gains tax

Enable tax modeling to tax realized gains from sales/rebalancing. You choose short- vs long-term rates and a lot-selection method: FIFO, LIFO, highest-/lowest-cost (and their LT/ST variants), tax-sensitive, intraday-FIFO, or the Tax-Lot Optimizer (Schwab-style: short-term losses first, then long-term losses, then no-gain lots, then long-term gains, then short-term gains). Dividend income is also taxed (qualified at the long-term rate by default), settled each Dec 31 alongside capital gains.

Rebalancing

Rebalancing, Exit Conditions and Never Sell all live in Cashflows → Advanced Cashflows, because they answer the one question that step asks: how money is managed once it is already invested. The card has an On/Off switch and starts off, so a new backtest is buy & hold: contributions only direct new money, and winners grow into ever-larger shares (allocation drift).

Schedule: rebalance on the same dates your Timeline re-scores on, or give rebalancing its own clock (monthly, quarterly, semi-annually, annually). The two are separable because they answer different questions: scoring decides which companies are eligible for contributions, rebalancing decides what to sell.
Drift band: a ± tolerance (pp) that trades between scheduled dates when a holding strays too far, with a minimum-months throttle so it can't fire too often.
Extent: pull all the way to target, or only back to the edge of the band (positions inside it are left alone).
Minimum trade size: skip trades below a $ or % floor so the portfolio doesn't churn on trivial drift. Forced sales are never skipped: mergers, bankruptcies, withdrawals, year-end tax cover and exit-condition sales always occur.
Maximum concentration per ticker: a hard ceiling on any single holding's weight, applied to every purchase, not only to rebalances.

Exit Conditions

Rules that sell on their own, checked daily and point-in-time. Each rule applies either to each ticker that meets its criteria, or to the entire portfolio when the whole book does. A whole-portfolio rule sells a percentage of total value spread across your holdings by the method you pick, and routes the proceeds back into a regular contribution, into cash until it re-enters, or into a specific ticker or saved Company List.

Never Sell

A list of tickers the rebalancer may not sell, optionally covering Exit Conditions too. Forced sales are never vetoed. Bear in mind that refusing to sell is a decision made with hindsight, and will usually flatter a backtest.

Costs

Rebalancing realizes gains, which are taxed per your Cashflows Account type setting and the rates in Settings (using your chosen lot method) and add turnover. The Rebalancing card on the results page shows each event's turnover, realized gain, and what was sold/bought, so you can see exactly what the discipline cost.

The Reliability check: can you believe the result?

A backtest is only as good as the data behind it. The Reliability grade = the percentage of (ticker × date × metric) cells that have real, filed data: not gap-filled, not assumed. A high grade means the backtest ran on data that genuinely existed point-in-time.

What it audits

Look-ahead: statements sliced by filing date. Survivorship & corporate events: a bankruptcy forces a held position to $0 on its filing date, while an acquisition / delisting is sold at its last price (the deal payout, redeployed as cash), never $0. Both are applied automatically from a curated historical record plus live SEC EDGAR detection, with no per-user confirmation (see Settings → Corporate events). Universe basis: point-in-time vs today's membership. Dropped tickers: which names lacked a required metric on which dates.

Coverage by date → move start

The Coverage by date heat strip shows how complete the data was over time. Early years are often sparse. Click a cell to move your backtest's start date there: Midas trims earlier Timeline dates and clamps earlier cashflows so the backtest truly starts later. (Re-run to refresh the chart/portfolio.) The same "move start" appears as a nudge when coverage is below 90% and a later start would clear it.

When it re-runs

The audit re-runs only when you change something data-relevant (selected metrics, tickers, dates, mode), not when you tweak weights, groups, basket, or cashflows. While it's running you'll see a calm blue spinner, never a stale FAIL.

Scoring

On each as-of date, for each selected metric, every eligible ticker's raw value is converted to a percentile (0–100) against the rest of the universe (the percentile is flipped for "lower is better" metrics). A ticker's Score is the weighted average of its percentiles:

Score = Σ ( percentileₘ × effective_weightₘ ) ÷ Σ effective_weightₘ

where effective_weightₘ = metric_weightₘ × group_multiplier(group of m). Tickers missing any selected metric are excluded from that date's ranking.

Returns

Total return % = final value ÷ total invested − 1.

CAGR (the headline number) is money-weighted by default: the internal rate of return of your actual contributions, so it is what the dollars you put in earned, contribution timing included. Every per-year rate the app shows -- the Chart card, the summary table, the Backtests list, History, the Caliber's Return axis, the Report -- is on the same basis. Settings can switch the whole app to the time-weighted rate; the switch removes every saved result, so nothing computed on one basis is read as the other. The (i) beside that setting explains the two.

Time-weighted (TWR) is the per-year growth rate of the strategy with the effect of contribution timing removed: money flowing in or out is netted out on the day it moves, so a backtest is credited only with what its holdings actually did. It answers "how good is this strategy?"; money-weighted answers "how did my money do?". Both are in the Return card whichever is the headline.

Simple CAGR = (final ÷ invested)(365 ÷ days) − 1, where days is each backtest's own holding period. It treats every dollar you ever contributed as though it had been there since day one, so on a long drip-fed run it understates; it is the fallback only for a run recorded before the rates were stored.

Max drawdown = the largest peak-to-trough decline of the time-weighted return index: the strategy's own worst fall, with contribution timing removed. Measured on the dollar balance instead it would read shallower, because money arriving during a decline lifts the trough.

Fees

The optional advisory fee %/yr is applied as a daily drag (compounded) to the value series, to either all backtests or the viewed backtest only, so you can see the long-run cost of fees.

Why a re-run can differ

Backtests end at today, so re-running on a later day lengthens the period and adds fresh prices, legitimately shifting the final value and CAGR; a provider revising its history does the same. A run saved in History is a frozen snapshot. Within a day, the result cache makes identical re-runs instant and bit-identical.

What these numbers are not

Every figure on this page is computed from a simulation. However carefully the arithmetic is done (and this page exists because it is done carefully), the result is still a hypothetical constructed with the benefit of hindsight, on a strategy no real account traded, without the effect your own orders would have had on prices. A precise number is not a reliable one. Past performance does not guarantee future results, and none of this is investment advice. See the Disclaimer.

Checking…
Simulated, not advice
How the consistency windows work

The backtest is cut into contiguous calendar windows: one per year, quarter or month, whichever coarsest unit gives at least 8 windows (automatic, from the test length; nothing is adjustable, so the score can't be shopped).

Each window is scored by its annualised return on a soft-clip ruler (a flat window sits at 50; the ruler bends at ±25%/yr and approaches but never reaches 0 or 100), so how much a window made counts: a +45% year reads above a +28% year, and a −60% crash below a −25% dip, where the old ±25 clamp tied each pair. The consistency score is the mean of the window scores minus their spread: performance spread evenly across the calendar scores high, while a late-only run-up scores high in one window and low in the rest, so its spread drags the score down.

This value feeds the Risk card and the Caliber card.

Details

the full metric tables and per-section breakdowns behind the summary above

Risk

Return

Rebalancing

Exit Conditions

Taxes

Consider

  1. Treat the backtest as a hypothesis, not a verdict. A single historical run is one draw from history, built with hindsight. The question to explore is whether the edge is real and repeatable, not whether the past number is impressive.
  2. Pressure-test it out of the window. Re-run over different start dates, sub-periods, and market regimes (bull, bear, sideways). A result that only holds in one window may be fit to that window rather than to anything durable.
  3. Re-read the assumptions. Check this run's data coverage, fees, taxes, dividends, and rebalancing settings. Small changes to costs or timing can quietly erase an apparent edge: turn friction up and see what survives.
  4. Compare against a plain benchmark. See whether the strategy beats a simple index (e.g. buy-and-hold) after costs, and not only on return, but on the Risk and Consistency measures too.
  5. Look at what you'd actually hold. Use the Portfolio and Scorecard cards to inspect the real positions, concentration, and turnover, and ask honestly whether you could hold them through the worst drawdown shown here.
  6. Paper-trade before any real money. Track the strategy on paper or in a simulated account going forward, so you observe its behaviour out-of-sample, in real time, with live prices, where no backtest can flatter it.
  7. Account for real-world frictions a backtest misses. Bid/ask spreads, slippage, minimum lot sizes, order timing, tax lot treatment, and your own behaviour under stress all affect outcomes and are only approximated here.
  8. Consult licensed professionals. Before committing capital, discuss your own goals, time horizon, and risk tolerance with a licensed financial adviser and a tax professional. Midas cannot know your situation and does not give advice.

Disclaimer

Midas is research software, not investment advice. Nothing in this application (results, scores, trust checks, observations, nudges, or any other output) is a recommendation to buy, sell, or hold any security, or an offer of advisory services. Midas and its author are not registered investment advisers, broker-dealers, or fiduciaries, and no advisory relationship is created by your use of this software.

Backtested results are hypothetical. They do not represent actual trading, are constructed with the benefit of hindsight, and do not reflect the impact your own trading would have had on prices. Dividends are modeled per each backtest's Dividends setting, reinvested (total return) or taken as cash, and dividend income is taxed; an acquisition or merger forces a taxable sale at the deal price. Tax and fee modeling are simplified approximations and not tax advice. Data comes from third-party providers and may contain errors, gaps, or revisions; the trust check discloses known gaps but cannot verify provider correctness.

Past performance does not guarantee future results. Markets change; strategies that performed well historically can fail. You can lose money, including your entire investment. Do your own research and consult a licensed financial adviser, tax professional, or attorney before making investment decisions. By using Midas you accept full responsibility for any decisions you make.

Read the full Disclaimer →

Settings

Accessibility

Chart precision: speed vs. detail

How finely a backtest samples portfolio value through time. Daily is exact; coarser grids run faster by taking far fewer steps. Re-score dates and rebalances still fire on their exact days, but contributions, rebalance fills and the value curve snap to the nearest sampled day, so a coarser grid can shift the headline CAGR by a point or more and will understate drawdowns (it skips the troughs between samples). Daily is the ground truth; coarser grids are for fast iteration, not the numbers you report.

Value grid

Use Weekly/Monthly for fast iteration, then switch to Daily for the numbers you report: CAGR and max drawdown can change between grids. The results page shows which grid a run used. Changing this recomputes on the next run.

Exit Conditions: chart markers

Exit Conditions live in Cashflows → Advanced Cashflows: point-in-time rules that watch each held position (or the whole portfolio) daily and act when their conditions are met, for example “up 50% from my cost basis → sell 10%”, or “the portfolio is 20% below its high → sell everything, come back at 8%”.

Share classes: one company, one position

A company with two listed share classes appears twice in an index. By default a backtest holds it once, so a single company cannot quietly take two slots in your portfolio.

Costs & taxes: model real-world friction

By default every backtest charges a realistic transaction cost on each trade and models taxes on realized gains, so the returns you see resemble what you'd actually keep. These apply to all backtests (a backtest can still set its own cost). Re-run backtests after changing them.

Transaction cost basis points per trade: 10 bps = 0.10%, charged on every buy and sell (incl. rebalancing)
Slippage basis points per trade, added on top of the transaction cost

Slippage is the gap between the price you saw and the price you got, because your own order moved the market. It is separate from the spread, which the transaction cost above already covers, so the sensible default is 0: at 10 bps the transaction cost already bundles a modest allowance for a liquid large-cap position. Raise it to stress-test a strategy rather than to model a typical one.

Rough guide, per trade: 0 to 2 bps for large-cap US names in ordinary size, which is what an S&P 500 or NASDAQ-100 strategy trades. 5 to 15 bps if you are trading small caps, or a position large enough to be a meaningful share of a day's volume. 25 bps and up is a deliberate worst case: micro caps, illiquid names, or a crisis window where spreads gap.

The honest use of this box is a sensitivity check. Set the cost you believe, note the return, then raise slippage and see how much of the edge survives. A strategy that only works at 0 bps is telling you its edge is smaller than its trading costs, and a high-turnover strategy will lose ground here far faster than a patient one.

Short-term rate % Long-term rate % Lot method
Income tax rate %
Dividend tax applies to every backtest's dividend income

Risk-free rate: for Sharpe & Sortino

The benchmark "safe" return that risk-adjusted ratios measure excess return against. The traditional proxy is the short U.S. Treasury bill. This single rate feeds the Report card and the Return card (Sharpe / Sortino) on the results page: both read the same value, so they never disagree.

Maturity

Fetching the latest rate…

Default: latest 13-week (3-month) T-bill (the standard Sharpe risk-free proxy) fetched from the U.S. Treasury daily series (no key). A single constant rate is applied across the whole period (traditional convention). Changing it updates Sharpe/Sortino on the results page instantly: no re-run needed.

Return basis: every per-year growth rate

Every per-year growth rate the app shows -- the Chart card's headline, the summary table, the Backtests list, History, the Caliber's Return axis and the Report -- is on one basis. Money-weighted is the default. Switching removes every backtest from History and clears every backtest's stored result; every backtest run from then on uses the chosen basis.

Data providers

The sources Midas uses, and what each one supplies. There is nothing to switch on or off: the Strategy metrics on offer are limited to what these two can actually supply, so the trust check never fails on data that never existed.

Recommended setup

SEC EDGAR is free and public-domain, and supplies filing-dated US fundamentals, SIC sectors and corporate-event detection. On its own it cannot make a backtest survivorship-free: it carries no prices, and a delisted company you cannot price is a company you can never hold.

For reference-grade, fully survivorship-free data, add Sharadar: the Core US Equities Bundle (SF1 fundamentals + SEP prices incl. delisted names back to 1998). With a key set it becomes Midas's preferred source across the whole universe. Use “Get a key” in the table below.

Note: “Data coverage” means a provider can supply a metric for representative companies. It does not guarantee 100% availability for every ticker and date. Coverage is probed on a few large, well-reported names; specific companies (especially smaller, younger, non-US, or with limited history) may still be missing a given metric, in which case the name is kept and that one metric is scored at a neutral median rank (the unbiased default; you can switch to dropping such names under the missing-data policy below).

Missing-data policy

Default: keep the name and score a missing metric as (0–100, where 50 = neutral median rank)

Changes here save and re-scan automatically.

Point-in-time data cache: prepare once, run instantly

A point-in-time S&P 500 backtest draws from every company that was ever in the index (1996–present): about 1,180 names, including ones that have since delisted. The first deep-history run normally downloads all of them, which can take a while. Prepare that data now and it's cached on your computer, so long backtests start immediately. It runs in the background while you keep working (a backtest pauses it and it resumes after), and is safe to re-run: names already cached are reused, not re-downloaded. Midas also starts this automatically the first time you launch it, so it's usually ready without any action.

Uses your enabled providers above. Prices for delisted names are most complete on a paid source (Sharadar); free providers may miss some, which the trust check flags at run time. As broader baked datasets are added (e.g. NASDAQ-100, all-listed), they'll appear here too.

Corporate events: automatic & pre-built

Midas models the two ways a stock leaves the market, from public record: no per-user confirmation, so backtests are consistent and reproducible. A bankruptcy forces a held position to $0 on the filing date. An acquisition / delisting is sold at its last price on the delisting date (the deal payout), and that cash redeploys on the next rebalance: it is never forced to $0. Landmark historical events are curated into the app; everything new is detected automatically from SEC filings.

Bankruptcies → forced to $0

Landmark equity wipeouts are curated in; any company in your universe that later files for Chapter 11 (SEC 8-K item 1.03) is added automatically. This list looks short by design: a current-index universe is itself survivorship-biased (failed names already left the index). Midas counters that with built-in point-in-time S&P 500 membership (1996–present, no data provider required): when a backtest starts in the past, the universe includes the companies that were index members then (Enron, Lehman, WaMu, WorldCom and ~500 others) even though they have since delisted. (Holding a dead name still needs its price history, which is best on a paid provider; the trust check flags any name dropped for missing data.)

Acquisitions & delistings → sold at last price

Automatic detection

On startup Midas scans SEC EDGAR (bankruptcy 8-Ks item 1.03 + Form 25 delistings) and Sharadar's delisting record for every ticker your backtests reference, then applies each finding automatically (bankruptcy → $0, delisting → sold). Each event is self-validated against the ticker's own price history, so a recycled symbol (e.g. a defunct company's ticker later reused by a new one) is never mis-applied.

Developer

temporary customizers and lab surfaces: visible only to access-listed accounts, deleted as their numbers get baked in

Last 20 runtime stats

Displayed progress (solid) against the engine's own reported fraction (dashed), versus elapsed seconds. The faint diagonal is a constant percentage per second. Estimated time comes from the run's shape before it starts; the difference from what it actually took is the number to watch.

Donut TEMP

Strategy donuts only: the portfolio disk is untouched. ONE geometry, every size (Samir 2026-08-24: "The Donut: Small settings should be the same as above ... you may treat them as a single item"): the table's sitting mark and the enlarged card read the same thickness, bands and transparency, and TILT is the only thing set per surface. Each diameter slider pins a donut's inner and outer edge: the band's width is the difference between its two knobs, and the inner donut's inner edge is the hole, so there is no separate hole setting to fight. Transparency controls affect the complete glass band; joined slices use the midpoint of both transparency settings. A hover draws the glowing outline; nothing moves. Persists per browser.

Thickness
Glow colour
Glow · white groups
Tilt · pages
Tilt · table icon
Rim
Transparency
shipped: thickness 0.22 · hover glow outline · tilt 0.98 pages / 1.00 icon · outer 0.75–1.00 · inner 0.00–0.75 · opaque · both bands · no merge · no rotation

Intro choreography TEMP

Hold at Ready → the logo and bar fade off a canvas that is already the app background → the toolbar drops in and settles. Persists per browser. Press Replay to watch it again.

Animation speed
Hold at Ready
Contents fade
Toolbar drop
Drop overshoot
Page fade
Page direction
Folder switch fade
Builder open

Chart line TEMP

Only affects 5Y/10Y and MAX, where the chart has more points than pixels. Open a Result and pan the chart to compare.

Result rail TEMP

Vertical spacing TEMP

Nudge each element's gap below the ribbon. 0 is the shipped position; drag to add or remove space. Persists per browser.

Backtests: ribbon → Run
Builder: ribbon → Run

Navigation TEMP

App surfaces update live. Each row offers 21 carefully stepped choices; accent choices remain intentionally restrained. The first swatch restores the shipped value. Persists per browser.

shipped: #020202 ground / #060606 surfaces · theme fonts and accent

Coverage wheel

The green/yellow/red data-coverage rings. One setting, everywhere they appear: the Backtests table, the Coverage tab, the coverage popup and the Results rows. Persists per browser.

Backtest number badges TEMP

The numbered discs that mark a backtest across the chart, the summary, History and the reference strip. The disc's own colour comes from the palette; everything else is here. Persists per browser.

Number colour
Number outline
Outline width
Number font
Second circle
Its diameter
Its colour
Its outline
Its outline width
shipped: flat disc, automatic number colour, no outline, no second circle

Company marks TEMP

Slice and pill colours are sampled from each company mark, top-right corner by default; aim and click the stage to sample somewhere else for the listed tickers. Click any preview pill to size its mark and choose edge padding, saved as you move. The sampling location is written by Lock in, with a confirmation before anything saved is overwritten.

Tickers
Aim on
Location
Size guide
Guide diameter
Preview

Backtest rows TEMP

Padding above and below each row in the Backtests table. The row's HEIGHT is driven by its marks, and that is a per-user setting now: Settings → Appearance → Backtest table row height.

Top / bottom padding
shipped: 2px padding above and below

Popdown log

The last 20 popdown notifications this browser showed, newest first, including the ones that dismissed early because another arrived.

Research software, not investment advice. Hypothetical results. Company logos by Logo.dev.

Working…