QuantAscent — Alpha Release Notes¶
Current Version: v1.1.2-alpha¶
Thank you for testing QuantAscent! This document covers what's included, what's known to be incomplete, and what to expect as an alpha tester.
What This Alpha Includes¶
Full Feature Set¶
Every feature described in the Product Overview is functional:
- 12 tabs — Dashboard, Account, Holdings, Strategy Performance, Strategy Manager, Strategy Builder, Backtesting, Research, Company Analysis, Company Screener, Trade Log, Settings
- 85 built-in strategies — per-sector and multi-sector factor strategies (Equal Weighting, Momentum, Quality, Value, Financial Strength) plus index-tracking strategies, pre-built and ready to deploy or customize
- 120+ financial metrics across value, quality, growth/momentum, and financial strength factors
- 20 years of historical data for ~5,000 US equities
- Automated trading through Interactive Brokers with three order modes
- Full accounting — FIFO lot matching, wash sale tracking, tax reporting
- Auto-updates — the app updates itself silently on startup
Data Pack (Pre-loaded)¶
Your alpha install includes: - Financial database (fundamentals, prices, and computed metrics) - Pre-built metrics matrix - 85 built-in strategies with cached backtest results
This means you can explore Research, Strategy Builder, and Backtesting immediately without waiting for downloads.
Version History¶
v1.1.2-alpha (Current)¶
- Built-in library regeneration with a tighter algorithm — Each strategy now uses 4 highly-predictive metrics (down from 10) plus a single hard-filter metric that trims the weakest half of the universe before scoring. In long out-of-sample testing back to 2009, this design materially outperforms the previous library and reduces drawdown. See the Auto-Generated Built-in Library section for how the metrics are picked. The new library reaches your app via the next strategy-pack sync after launch.
- Fix return measurements to include dividends — IC analysis, backtests, and SPY comparisons now read dividend-adjusted closes everywhere returns are computed (FutureProfit, Momentum, the backtester's per-period return, and the SPY benchmark). Dividend-paying stocks (utilities, energy, REITs, financials) were previously under-counted by roughly 2% per year; this is a measurement correctness fix, not a strategy change. Older saved backtests are unchanged; new ones reflect the corrected measurement.
- Change Strategy Builder and Backtest list default sort from Sharpe to CAGR — Sharpe is still available as the second option in the sort dropdown, but the default now surfaces higher-CAGR strategies first. Based on walk-forward research showing CAGR-ranked picks held up better in out-of-sample windows than Sharpe-ranked picks. You can change the sort back to Sharpe anytime.
- Fix Strategy Builder card charts showing dollar amounts instead of cumulative return % — the small equity chart on each library card now uses the same +X%/-X% Y-axis as the full Backtest detail page, so strategies are visually comparable to each other and to SPY at a glance.
- Fix Company Screener filter dropdowns empty on first launch after a fresh install — Sector / Industry / Country / Exchange dropdowns now populate immediately without needing an app restart.
- Add 95% confidence intervals to Research → IC Rankings — every metric now shows a "95% CI" column and chart error bars, so you can tell at a glance when an IC is statistically distinguishable from zero. Especially useful as you add filters: narrower universes get visibly wider CIs.
- Add a "Compare to:" dropdown on Research → IC Rankings and Quintile Analysis — defaults to "Whole market" (matches how the strategy backtester actually scores stocks), with "Sector peers" and "Sector + size peers" as investigative lenses that answer whether a metric's signal is real or driven by sector/size exposure. Chart titles label the active mode so peer-relative numbers aren't accidentally compared against memory of whole-market numbers.
- Mute green/red bar fills across Research and Metric Inspector charts to a softer alpha — consistent with the built-in library overview chart, and lets the new IC Rankings error bars stay legible on top of the bars.
v1.1.1-alpha¶
- Add hover tooltips to backtest parameters, the Strategy Performance "Weighted" checkbox, and Research's "Exclude $ metrics" toggle — hovering Lookback, Capital, Risk-Free Rate, Commission, Slippage, or Rebalance on the Backtesting page now explains what each input controls and how it affects results, the Weighted checkbox spells out the difference between raw strategy returns and allocation-weighted portfolio contribution, and the dollar-metrics tooltip is rewritten in plain language.
- Auto-run IC Rankings the first time Research opens so the page lands with a ranked metric list and chart instead of a blank "click Run" placeholder. Filters, analysis type, and Run all behave the same as before — this only fires once on first load.
- Revamp Research filters to match Strategy Builder — Min/Max Market Cap with unit dropdowns, Metric Filter gates (e.g. P/E < 20), and Include/Exclude multi-select for Sector / Industry / Country / Exchange replace the old single-value dimension rows. Same filter UX you already use on the Builder.
- Polish input field arrows and date pickers across Backtesting, Research, Strategy Builder, and Settings — number-input up/down steppers now show clear triangles instead of barely-visible dots, calendar date pickers have a single clean dropdown arrow matching the strategy/metric search dropdowns, and date fields no longer change values from mouse-wheel scroll or arrow keys (dates change only by typing or via the calendar popup).
- Reorganize every metric dropdown by factor and add a Factor column to Research → IC Rankings — Research and Strategy Builder metric pickers now group all metrics under collapsible Value / Quality / Momentum / Financial Strength / Volatility / Other headers with one-line factor descriptions. IC Rankings gains a color-tinted Factor column so you can scan or sort by category alongside |IC|.
- Fix Strategy Performance chart drawing a flat 0% line across history for newly created strategies — a strategy's line now only starts plotting from the first day it actually held positions, instead of compounding back-populated zero-MV rows from portfolio inception.
- Add a performance dashboard at the top of the Built-in Strategy Library — a 12-facet bar chart of every built-in strategy's out-of-sample performance grouped by sector, with a Show toggle for CAGR / Sharpe / Alpha vs Sector ETF, hover for full metric breakdowns, and click any bar to jump to that strategy's detail card. The Strategy Builder now always opens on this tab so the chart is what you see on entry.
v1.1.0-alpha¶
- Add a sample portfolio that fills the execution views on first launch instead of greeting new users with rows of "N/A" — Dashboard, Strategy Performance, Trade Log, and Account now show three years of activity across three built-in strategies until you connect a broker, with a persistent yellow "Sample data shown — Click to connect your broker" banner on each page. Auto-deactivates the first time a Flex query parses successfully; Holdings has its own gate that pairs your real lots with sample prices until IBKR connects.
- Reorganize the built-in strategy library by factor instead of risk profile — replaces "Growth/Balanced" with Equal Weighting / Momentum / Quality / Value / Financial Strength, with each factor shipped per-sector and universe-wide (39 → 85 strategies). The old "Safety" tier label is renamed Financial Strength wherever it appeared; previously adopted strategies keep working unchanged.
- Strengthen auto-update download verification — every update is now validated against the developer's signing key in addition to the existing checksum check, so a tampered installer is rejected before it can run.
- Add crash-resilient strategy attribution — trade-to-strategy assignment is now committed to disk before the order is sent, so a crash between order placement and fill no longer falls back to Discretionary. A startup pass also reconciles any fills that arrived while the app was offline.
- Rebuild the way the app correlates your trade history against broker statements — the new matcher uses IBKR's stable order identifier directly instead of fuzzy field comparison, eliminating the "Discretionary" fall-through and cross-strategy mix-ups in earlier audits. First launch auto-rebuilds your strategy attribution from broker statements (preserves definitions and allocations).
v1.0.31-alpha¶
- Improve backtest parallelism — auto-tunes worker count to your machine and reliably releases memory when you cancel — fixed worker count is replaced by runtime adaptation to free memory and core count, so big runs go faster on bigger machines and don't pressure smaller ones. Cancel now reaps background workers within seconds instead of leaving them holding multi-GB working copies.
- Add paper portfolios reconstructing their daily history from broker statements — paper accounts now use the same Flex-statement-based ingest as live, including per-lot realized P&L, dividends, and corporate actions. Requires a Flex Query and token created from IBKR paper's separate Client Portal session (the wizard prompts you).
- Add a "Rebuild Portfolio from Start Date" button to Settings → Portfolio — wipes your locally derived portfolio history and re-derives it from your account start date using saved broker statements as the source of truth. Takes a timestamped backup first and refuses to run without a configured backup folder.
- Fix the Strategy Manager's Actual allocation row mis-attributing market value when a ticker is held by multiple strategies — the row used to dump the whole shared position into whichever strategy most recently traded that name; it now splits each shared position by each strategy's share of the open lots. The allocation bar segments now also snap to whole percents so widths exactly match labels.
- Add the active order mode to the Rebalance preview dialog — the preview now shows whether the trade will run as Limit, Market, or Limit-then-Market so you can confirm at a glance.
- Fix the Strategy Manager's allocation bar misrepresenting both desired and actual allocations — segment widths used to inflate to fit labels, making a 5% slice look the same as a 20% slice; widths are now strictly proportional with long labels shortened on narrow slices. The Actual row also no longer disappears when IBKR is disconnected — falls back to the latest snapshot until live data returns.
- Fix the morning broker-statement import not bringing already-logged sales' realized P&L into wash-sale-adjusted alignment — the morning import now re-attributes per-row P&L on already-logged sales using the broker's per-lot detail, closing a wash-blind drift on those rows. Drift-detection notification also now surfaces realized-P&L disagreements alongside open-position ones.
- Add per-trade Realized Profit on the Closed Trades table matching IBKR's wash-sale-adjusted numbers cell-for-cell — sales that closed a wash-replacement position were previously computed with an internal formula that didn't fully apply wash-sale basis step-up. New closures record IBKR's number directly; existing rows keep their old values until your next rebuild.
- Add realized P&L breakdown that reconciles to your IBKR YTD Activity Statement — Dashboard's "Realized YTD" tile now shows IBKR's tax-realized headline with a hover tooltip for economic realized and wash adjustment. Trade Log replaces its single YTD line with a three-line bridge (Economic → Wash Adjustment → Tax).
- Fix stock splits and other corporate actions occasionally not applying when the app catches up after being closed a long time — corporate actions are now applied before each statement's trades during catch-up, the same way historical rebuilds already worked. Day-to-day live operation was never affected.
- Fix the lot-matching engine occasionally reaching forward into not-yet-purchased lots when imports aren't strictly chronological — the matcher now refuses to look at lots dated after the sale, so out-of-order rebuilds raise a loud error instead of silently producing wrong P&L. Live trading was unaffected.
- Fix two trades at the exact same second occasionally getting their broker trade IDs swapped during the morning import — the import now matches each broker trade to its own row by share count and skips rows already tagged, so each row gets exactly its own broker reference. Rare in practice.
v1.0.30-alpha¶
- Fix trade history drift between the app and the broker quietly accumulating over time — three compounding causes (partial-sale undo on next-morning import, silent under-match on uncoverable sales, wrong-date-scope morning comparison) all fixed together. Open positions and IBKR tax forms were unaffected; small historical realized-P&L attribution drift may still exist on a handful of older trades until those records are reconstructed.
- Add storage-layer safety rails on the local trade history — the local DB now enforces no-negative-shares / no-over-close / no-zero-quantity rules at write time, so a future bug can't silently land an inconsistent record. Existing rows migrate idempotently on first launch.
- Add sidebar notification when the morning broker-comparison report shows trade-history drift — the comparison was already running but its results sat unread; a warning notification now fires from startup whenever positions disagree with the broker, naming affected tickers. Hidden when clean.
- Extend the v1.0.29 duplicate-trade cleanup tool to also catch duplicate sales — the prior cleanup only checked buy lots, missing the same pattern on the sales side. Now recognizes both.
- Speed up equity-scoring backtests by running rebalance periods in parallel — a 5-year monthly-rebalance backtest now runs about 2.4× faster on a 4-core machine, with longer horizons benefiting more. Final equity curve / Sharpe / win rate match the prior version exactly.
- Fix Holdings page getting stuck on "Fetching IBKR positions..." after a portfolio switch — for real this time. A hidden per-position corporate-action check was moved off the load path to a once-daily background job, with three independent safety nets (60s per-call ceiling, 30s overall timeout with auto-disconnect, Cancel & Retry button after 15s).
- Fix Research's Build Matrix freezing the rest of the UI during the compute phase — the build now keeps the UI fully responsive throughout and finishes meaningfully faster on multi-core machines.
- Fix Holdings page top Daily P&L disagreeing with TWS on days you trade — the top stat now reads IBKR's account-level daily P&L (same number TWS shows), while the table's TOTAL row continues to reflect just current holdings. Per-row Daily Ret for same-day positions now uses your fill price, not yesterday's close.
- Fix rebalances under-allocating when sells and buys both run the same day — the buy phase now reads your broker's live "available funds" figure so it sees filled-but-unsettled proceeds, eliminating the second-rebalance-to-finish-deploying-cash workaround.
- Fix trade history occasionally drifting from the broker's record on rebalance days — the import matcher now has a same-day fallback so a fill lines up with its existing log entry regardless of clock skew between broker and app timestamps.
- Move QuantAscent to its own domain — quantascent.io, with a new landing page and public alpha-access request form. Existing alpha installs continue to work on the old domain without changes.
- Add named backtest runs and per-strategy variant grouping — each backtest now keeps its own named variant under its strategy with right-click Rename / Delete / Duplicate as new run, and Compare mode distinguishes variants of the same strategy. Existing backtests are preserved as each strategy's first variant.
- Split strategies into "sleeves" (named portfolio bucket) and "scoring systems" (algorithm a sleeve uses to pick names) — the Strategy Manager now lets you swap a sleeve's scoring algorithm from Edit while preserving allocation, identity, and trade history. A one-time migration on first launch backs up data and tags every past trade with the algorithm that picked it.
- Add Conditional IC against sector / industry / MarketCapBand with a working Scan Mode quintile split — the Research conditioning picker now opens with sector / industry / country / exchange / MarketCapBand in a "Categorical" group at the top, and Scan Mode quintile now produces per-metric IC across Q1–Q5 instead of falling back to median. Research docs (§7) rewritten to match.
- Fix Conditional IC chart unreadable when the conditioning variable has many values — the chart caps at top 30 subsets by |IC| (table below still lists every subset), left margin auto-sizes to the longest y-tick label, and long sector/industry names rotate 30° on dense axes.
- Fix Backtesting Compare mode breaking after switching tabs — Compare selections now re-apply every time the list rebuilds, so tab switches, sort changes, and timeframe changes all preserve the active comparison.
- Split built-in strategies and their backtests into a separate strategy pack — the weekly data pack now ships matrices only, and built-in strategies + cached backtests ship on a slower multi-day cadence. Fresh fundamentals no longer wait on backtest builds.
- Add safety guards against empty-pack wipe-and-empty installs — the strategy-pack installer now refuses to wipe-and-replace if the manifest claims zero strategies/backtests or file counts disagree, and a post-install check confirms the destination isn't empty before writing the version file.
- Fix Strategy Builder and Research still showing the previous portfolio's strategies after a portfolio switch — both now refresh as part of the portfolio-switch reload.
- Fix Research's "Add to Strategy" not showing up in Strategy Builder until reload — the builder now picks up external edits automatically. If the builder has unsaved edits, it leaves them alone and posts a status hint rather than overwriting your work.
v1.0.29-alpha¶
- Add Copy Strategy to Portfolio — copy a strategy's setup from one portfolio to another (e.g. promote paper-tested to live), via a new Copy button on each Strategy Manager card. The destination lands inactive at 0% allocation; trade history, P&L, and rebalance state stay behind.
- Fix daily portfolio backup only capturing the active portfolio — every portfolio now lands in one dated folder under your backup destination, plus the registry and global settings. Restore by dropping a dated folder back into
%LOCALAPPDATA%/QuantAscent. - Add periodic benchmark-price audit — a daily job re-checks every row in
benchmark_log.csvagainst canonical adjusted closes and rewrites any row drifting more than 1 basis point. Runs across every portfolio. - Fix data-pack sync silently treating a wiped
matrices/folder as up to date — sync now checks each matrix file from the version manifest still exists on disk, so antivirus quarantine or partial installs self-heal on the next launch.
v1.0.28-alpha¶
- Split metric matrices into
builtin/anduser/subdirectories — built-in matrices ship with the data pack and wipe/replace cleanly, no more ~30 GB of stale weekly files. Custom matrices live in a separate folder the pack never touches. - Fix paper portfolios writing phantom weekend / holiday rows — opening the app on a Saturday or NYSE holiday was writing a same-day row with a fake daily return computed from off-market marks. Snapshots now skip non-trading days.
- Add TWS-process-running and Read-Only API states to the IBKR setup wizard — the wizard detects when TWS is running with the API socket disabled, and when TWS has Read-Only API enabled (lets the app see holdings but blocks trades). The sidebar IBKR pill shows yellow "Read-Only" alongside Connected/Disconnected.
- Remove automatic local matrix build from the startup wizard — the multi-hour CPU-burning fallback is gone; matrices ship via the data pack only, and the wizard verifies they're present and tells you to re-run sync if not.
- Distinguish data-pack manifest 404 from network errors in startup logs — now logs distinct messages for each instead of "manifest is None".
- Add first-run IBKR connection setup wizard — a guided walkthrough that detects what's wrong with your IBKR connection (TWS not running, API not enabled, wrong port, paper-vs-live mismatch) and shows the exact step needed. A clickable IBKR pill in the sidebar reopens the wizard.
- Fix paper portfolios showing cash-only phantom NAV and 1855% first-day returns on fresh setup — a bundle of bugs in the new-paper backfill is fixed; now writes today's actual NAV from IBKR and properly excludes pre-start rows from baselines.
- Fix IBKR Paper Trading Disclaimer notifications stacking — accepting the prompt used to fire 3–5 duplicate toasts; dedupe is now shared across all connection roles at most one toast per minute.
- Fix Holdings page getting stuck on "Fetching IBKR positions…" after a portfolio switch — particularly when the gateway was swapped mid-switch (paper → live login). Three small bugs fixed together restore correct loading state and retry IBKR once.
- Clean up console noise during IBKR disconnects — Windows socket-cleanup tracebacks and the Paper Trading Disclaimer warning no longer spam the console on every disconnect.
- Fix Strategy Manager rebalance preview generating phantom trim-sells for tickers held by a different strategy — trim and buy logic is now strictly scoped to the strategy being rebalanced.
- Fix FIFO lot matching closing another strategy's lots when a sale is tagged to a specific strategy — the matcher is now strategy-scoped. No data repair needed — the bug never fired in practice.
- Fix fixed_allocation rebalance using IBKR's total position for target-vs-current comparisons — same bug pattern as the equity-scoring trim-sell fix above, fixed pre-emptively before any overlap configuration could trigger it.
- Add Buying Power and Cash line to the Rebalance Preview dialogs — preview now shows estimated buying power and cash before/after the trade. Cash-after is red when the trade would dip into margin.
v1.0.27-alpha¶
- Fix Backtesting tab freezing when you cancel mid-run — Cancel now returns instantly and the UI always resets cleanly, no more stuck Cancel button blocking new backtests until restart.
- Fix Strategy Builder strategy dropdown going empty after switching scoring modes and clicking No on the create prompt — switching back to the original mode now correctly restores its strategies.
- Fix Strategy Builder save-after-Type-switch making a new strategy disappear — save and refresh paths now always agree on which mode is active.
- Fix Strategy Builder Save As and Duplicate silently overwriting another existing strategy when the new name normalized to an existing filename — Save As now prompts to confirm overwrite, Duplicate refuses and asks for a different name.
- Fix Strategy Builder rename leaving a phantom orphan when the manager update fails — rename now writes the new file, updates the manager, and only deletes the old file if both prior steps succeed.
- Fix Strategy Builder categorical filter changes not flagging the strategy as unsaved — toggling sectors / industries / countries / exchanges now lights the dirty-state indicator.
- Fix daily portfolio backup failing on OneDrive destinations — the previous
.partialstaging-then-rename flow was holding the folder open with OneDrive; backup now copies directly to the final destination. Pre-fix.partialfolders are cleaned automatically.
v1.0.26-alpha¶
- Add Include / Exclude toggle for sector / industry / country / exchange filters in Strategy Builder — every categorical filter combo now has a mode dropdown letting you pick whether the checked items are the ONLY values matched (Include) or values to EXCLUDE.
- Fix Research page Global Filter returning zero results when two or more values are selected for the same dimension — multiple rows in the same dimension now OR within and AND across dimensions, instead of impossible AND-within.
- Fix Filter Tester histogram chart showing the unfiltered matrix as the "All stocks" baseline — chart now applies the same filter as the table stats.
- Fix Research page IC Rankings and Score Breakdown Y-axis labels getting clipped when the Global Filter bar expands — long metric names no longer drop their first 3–5 characters at any window width.
- Fix Research page Score Breakdown and Score Analysis ignoring the selected strategy's universe filters — now AND-combines the strategy's filters with the Global Filter bar.
- Fix Strategy Builder silently wiping sector/industry/country/exchange filter selections on view revisit — the refresh path now preserves user selections.
v1.0.25-alpha¶
- Fix Strategy Performance page showing wildly inflated returns on paper portfolios — four compounding bugs in paper-account aggregation produced returns that didn't match Dashboard or holdings (one tester saw +668% YTD on a single sleeve against an actual ~33% move). First launch after upgrade rebuilds the paper strategy log end-to-end; live Flex-based portfolios were not affected.
v1.0.24-alpha¶
- Fix Backtesting Compare mode clipping strategy name headers — headers now auto-size to fit and re-fit when the window is resized.
- Fix Backtesting tab keeping the previous portfolio's strategies after a mid-session portfolio switch — switch now also refreshes Backtesting.
- Fix Strategy Builder metric-insight popup showing global stats instead of strategy-universe stats — IC, quintile bars, and threshold stats now respect the strategy's universe so the numbers match Research and what the backtest will see.
- Replace "Min Rebalance %" with "Min Trade $" — the anti-churn threshold is now measured in flat dollars (default $50; $0 disables). Previous percentage-based threshold scaled badly to large accounts.
v1.0.23-alpha¶
- Fix benchmark and strategy logs staying out of date after a fresh daily data pack installs on startup — the wizard now runs a lightweight refill when the portfolio log is current but benchmark/strategy logs aren't, closing the gap until the next morning's cron.
- Add missed scheduled runs tracking — strategies that needed to fire while the app was closed now appear in a Pending Actions dialog on startup (and hourly) with one-click Run / Generate / Execute / Dismiss buttons, color-coded by overdueness. Holiday-aware.
- Add batched catch-up execution — clicking Run-now on multiple missed items runs them in a sensible order (oldest first; generate before execute for the same strategy). Closing the dialog mid-run doesn't cancel anything.
- Add Upcoming Schedule card to the Strategy Manager page — shows the next wave of scheduled runs with task chips, strategy name, scheduled time, and a countdown. Defaults to This Week; overdue runs always pin to the top.
- Each strategy card now shows Next generate and Next execute lines separately, with market-holiday awareness so dates reflect the actual trading day.
v1.0.22-alpha¶
- Add built-in strategy update notifications — adopted strategies whose source built-in has a newer version now show an amber "Update available" pill and a count next to Strategy Manager in the sidebar; clicking opens a side-by-side diff with Update / Keep as-is / Cancel.
- Fix stale validation warnings persisting in
strategy_allocations.json— runtime annotations are now stripped before writing, and existing files self-clean on next save. - Move IBKR FLEX token storage to the Windows Credential Manager — the token now lives in Windows' encrypted DPAPI vault, scoped to your user account. Renaming a portfolio migrates the token alongside the folder rename.
- Add Privacy mode — a Settings checkbox masks every dollar amount in the UI with
$••••; percentages, share counts, tickers, and dates stay visible. Toggle and save; every tab re-renders immediately. - Fix Strategy Performance "Total" row showing roughly double the correct value — IBKR's summary roll-up row was being parsed as a position and dumped into a phantom "Discretionary" bucket; parser now skips it, and
strategy_log.csvwas rebuilt from inception. - Fix partial-fill trades silently tagged as "Discretionary" — multi-fill orders and price-drifted fills now match back to the parent order's strategy, no more sibling fills falling through.
- Replace yfinance with Financial Modeling Prep (FMP) for benchmark prices, paper-account historical prices, earnings calendar, and stock news — yfinance prohibits commercial use, FMP is licensed for it.
- Add a daily data pack — a small (~7 MB) download that keeps the last ~14 days of prices, upcoming earnings calendar, and recent stock news fresh. Synced on launch and via a 4:30 AM ET refresh.
- Add stale data notifications on the bell icon — surfaces a warning if the daily pack is more than 30 hours old. Benchmark and portfolio loggers also follow a strict skip-on-stale rule.
- Expand earnings calendar coverage on the Company Analysis page — fixed an FMP endpoint cap that was silently truncating most of the requested window. Scheduled report dates now show for AAPL, MSFT, JPM, BAC, and many more.
- Fix DIA missing from benchmarks — the Dow benchmark stopped getting fetched after the FMP migration. Pack builders now always fetch SPY, QQQ, DIA, and IWM regardless of strategy membership.
- Switch benchmark returns to total return (dividend-adjusted) — FMP's plain price endpoint was split-adjusted-but-not-dividend-adjusted, causing rolling returns to step down on migration day (e.g. SPY 10-year from 294% to 234%). Now uses the dividend-adjusted endpoint.
- Fix Holdings page hanging on "Fetching account metrics…" for up to a minute after switching to a well-populated Live account — removed a dead serial-per-stock pricing loop that wasn't feeding the UI.
v1.0.21-alpha¶
- New installs now create both a Paper and Live portfolio by default, with Paper active on first launch so new users start safely in paper trading mode.
- Renaming a portfolio now renames the data folder on disk to match — previously only the display name changed while the folder kept the original slug. Open SQLite and IBKR handles are safely closed and reopened during the rename.
- Switching to a live portfolio with no FLEX credentials or start date configured now prompts the IBKR setup dialog automatically instead of silently skipping data sync.
- Portfolio deletion no longer hardcodes protection for a "default" portfolio — you can delete any portfolio except the last remaining one.
- Fix incorrect prices and daily PNL for illiquid stocks when the market is closed — wide-spread names like SENEA were using the bid/ask midpoint instead of the session close, causing wildly inflated market values and daily returns. Streaming fallback now uses the session close.
- Add order status dialog for manual orders on the Holdings page — submitting an order opens a real-time status window showing order progress, fill updates, timeout countdown, and connection status instead of a static text label.
- Add order cancellation for manual orders — the status dialog includes a Cancel button that sends a cancel and waits for IBKR confirmation, warning if it can't be confirmed.
- Add arbitrary ticker entry for manual orders — the ticker field is now a free-text input with autocomplete from held positions. Selling a ticker you don't hold shows a short-position confirmation warning.
- Add arbitrary ticker lookup for the candlestick chart — the chart selector is now free-text with autocomplete, so you can view price charts for any stock, not just ones you hold.
v1.0.20-alpha¶
- Add download page at quantascentfund.com/download — alpha testers can download installers directly by entering their API key. Windows and macOS.
- Add HTTPS to quantascentfund.com — all traffic is encrypted end-to-end via Caddy with auto-provisioned Let's Encrypt certificates.
- Add time-based API key expiration — keys now expire after a configurable number of days (default 90). Server returns distinct errors for expired, revoked, and invalid keys.
- Add
extendcommand to API key management — expired or expiring keys can be renewed without generating a new key. - Improve error messages for API key validation — the download page, activation dialog, and startup wizard now show specific messages for expired / revoked / invalid / network-unreachable instead of generic errors.
v1.0.19-alpha¶
- Add API key validation on startup — the app now validates your API key against the server each launch. If missing, invalid, expired, or unreachable, the app enters degraded mode with trading, data sync, logging, and scheduled jobs disabled, with a clear warning dialog.
- Add server-side validation to the API key setup dialog — keys are now verified before being saved instead of silently accepted.
- Fix Enter key in the API key dialog triggering "Skip" instead of "Save & Continue" — Save is now the default action.
- Add API key status indicator in Settings — green "Valid" / red "Invalid" next to the API key field, with sync buttons disabled when invalid.
- Validate API key changes in Settings before saving — prevents saving invalid keys; reminds users to restart after updating.
- Guard trade submission, strategy generation, and rebalance execution behind API key validation — disabled actions show a popup or tooltip explaining a valid key is required.
- Fix empty database crash during first-run matrix build — now raises a clear error instead of crashing with
KeyError: 'ticker'. - Fix HTTP 422 errors from the server not handled in database and data pack sync clients — missing or invalid keys now produce clear messages instead of unhandled exceptions.
v1.0.18-alpha¶
- Move IBKR streaming prices to a dedicated background thread — the UI no longer blocks on IBKR network calls during price updates, reconnection, or streaming setup. Eliminates UI stuttering during poor network conditions and freezes when IBKR reconnects.
- Validate IBKR data on startup before displaying — if the gateway is still initializing, the app shows DB-only holdings and auto-retries once the gateway is ready instead of displaying incorrect NAV or position values.
- Guard candlestick chart loading against unstable connections — chart loading is deferred until IBKR data is confirmed valid, preventing crashes from mid-call socket disconnects.
- Reduce IBKR connection retry cooldown from 30 seconds to 10 seconds for faster reconnection after gateway restarts.
- Fix holdings page failing to load when IBKR connection drops during startup — the app now automatically reconnects and retries price fetching instead of showing an empty "No holdings data" screen.
- Fix order cancellation not confirmed by IBKR — cancellation now polls for confirmation up to 10 seconds and warns the user if any orders could not be confirmed cancelled.
- Add cancel check between primary and fallback order phases — prevents fallback MKT orders from being placed when the user already clicked Cancel during the primary LMT phase.
- Fix strategy chart defaults not persisting — the settings file was read-only and silently dropping changes. Also fixes performance / risk metrics tables ignoring chart defaults.
- Fix cash deposits counted as portfolio gains — IBKR FLEX data can include offsetting internal CashTransaction legs; returns now use the authoritative
ChangeInNAV.depositsWithdrawalsvalue instead of summing transactions. - Fix settings changes requiring app restart to take effect — Min Rebalance %, Margin Enabled, and Max Leverage now apply immediately after saving.
- Allow Min Rebalance % to be set to 0% — removes the previous 0.1% floor so users can disable the anti-churn guard entirely.
v1.0.17-alpha¶
- Add in-app bug reporting — submit bug reports directly from Help & About with a description, system info, and log file attached automatically. Reports are stored securely on the server and the developer is notified by email.
v1.0.16-alpha¶
- Add extended hours trading support — new "Extended Hours" toggle in Settings allows limit orders to fill during pre-market (4:00 AM–9:30 AM ET) and after-hours (4:00–8:00 PM ET) sessions via IBKR's
outsideRthflag. Defaults to off; when enabled, buy limit prices use the ask (instead of mid) to stay within IBKR's after-hours price caps. - Fix misleading "All orders filled successfully" notification when buy orders are rejected — rebalance now reports rejected symbols and partial fills accurately.
- Fix holdings page reloading every ~60 seconds while idle — TWS zero-position events for closed positions were being mistaken for new trades and triggering an infinite reload loop.
- Fix holdings page crash/freeze from repeated clicking — table sorting no longer creates C++ objects, chart redraws reuse matplotlib axes instead of accumulating figure state, and rapid chart button clicks are debounced.
- Fix portfolio event handler accumulation across IBKR reconnects —
updatePortfolioEventis now properly disconnected during streaming cleanup.
v1.0.15-alpha¶
- Fix orphaned positions not sold during rebalance — exit sells now use the lots DB (authoritative FIFO-matched positions) instead of the strategy ledger, which could drift due to old-format entries or incomplete partial fill recording.
v1.0.14-alpha¶
- Fix startup hang when IBKR paper account is not fully initialized — IBKR connection no longer blocks all roles behind a single lock.
- Fix catchup worker persisting
ibkr_connected=Trueafter initial cash balance check fails, preventing cascading timeouts.
v1.0.13-alpha¶
- Fix settings discard crash when switching portfolios (QSpinBox.setText → setValue).
- Remove local builtin strategy regeneration from startup — strategies now only download from VPS data pack.
- Remove stale auto-regenerate setting, scheduler job, and UI regenerate buttons.
- Clean up old VPS matrices automatically when a new data pack installs.
v1.0.12-alpha¶
- Add 60-second cooldown to position-change reload to prevent reload loop during active trading.
- Update known position set immediately on detection to prevent repeat triggers.
v1.0.11-alpha¶
- Auto-detect TWS trades: holdings page reloads automatically when positions change outside the app.
- Discretionary allocation updates in real time from live IBKR positions.
- Fix read-only rebalance state file cleanup on Windows (WinError 5).
v1.0.10-alpha¶
- Fix stale rebalance state deadlock: auto-clear orphaned state files instead of blocking preview.
- Fix empty buy orders for small-allocation strategies: anti-churn guard no longer blocks initial position entry.
v1.0.9-alpha¶
- Show install progress bar during auto-update instead of a blank screen.
- Add bounds checking on numeric settings (Client ID, Order Timeout, Min Rebalance %).
- Stale NAV warning on dashboard when portfolio data is outdated (NYSE calendar-aware).
- Verify IBKR account type on reconnect to prevent live/paper mismatch.
- Clarified Min Rebalance % description in UI and documentation.
v1.0.8-alpha¶
- Added alpha documentation site with MkDocs, docs button in Help dialog.
v1.0.7-alpha¶
- Version bump for alpha distribution with full data pack.
v1.0.6-alpha¶
- Auto-updater now relaunches the app automatically after silent install.
- Improved update reliability.
v1.0.5-alpha¶
- Fixed frozen-app detection for the packaged build (Nuitka compatibility).
v1.0.4-alpha¶
- Consolidated logging: all logs now go to a single log directory.
- Removed scattered debug error files.
v1.0.3-alpha¶
- Pre-alpha hardening release — data safety, logging, and stability fixes.
- Read-only file locking to prevent manual edits of data files.
- Mid-trade disconnect detection and order reconciliation for IBKR.
- Help & About dialog with version info, log folder access, and system info.
- IBKR live positions as primary holdings data source.
- Worker thread safety, FLEX validation, order timeout enforcement.
Earlier Releases (Pre-alpha)¶
- Money-weighted returns (IRR) alongside time-weighted returns.
- Auto software updates with silent install.
- Discretionary strategy for tracking non-app trades.
- Market order mode and limit-then-market hybrid.
- Rebalance execution polish: progress UI, cancel support, failure handling.
- Chart defaults dialog for persistent preferences.
- Async holdings loading for faster startup.
- Batch strategy execution with order netting.
- Fixed allocation (ETF) backtesting support.
- Backtest subprocess isolation to prevent UI freezes.
- Data catchup on portfolio switch.
Known Limitations¶
These are areas that are incomplete or have known rough edges:
Platform¶
- The app is packaged with Nuitka; startup may take a few seconds on first launch
Trading¶
- Options trading is not supported — equity positions only
- Order execution assumes US market hours and US equities
- The Flex API has rate limits — if you trigger multiple rapid syncs, you may need to wait
Data¶
- The financial database covers US equities only (~5,000 stocks)
- Some newer IPOs or recently listed companies may not have full metric history
- Metric data updates weekly on Saturdays — intra-week data is not reflected until the next sync
UI¶
- Some charts may render slowly with very large date ranges (10+ years with many strategies)
- The app uses a fixed dark theme — light mode is not available
What We're Looking For¶
As an alpha tester, the most valuable feedback is:
- Crashes or freezes — if the app stops responding, submit a bug report from Help & About
- Data that looks wrong — if a number doesn't match what you see in IBKR, note the specific metric and date
- Confusing workflows — if you can't figure out how to do something, that's a documentation or UX issue we want to fix
- Things that are slower than expected — note which screen and what you were doing
How to Report Issues¶
Open Help & About from the sidebar and use the Submit Bug Report button. Describe what happened and what you expected — your system info and log file are included automatically. The developer is notified by email when a report is submitted.
What's Next¶
The roadmap for upcoming alpha releases includes: - Additional built-in strategy types - Enhanced reporting and export options - Performance optimizations based on tester feedback - Documentation updates based on questions and confusion points