QSX Strategy Score: a fast backtest screener for overfitting and random-timing luck
Free strategy scorecard for trading backtests. Detect overfitting, weak edge, drawdown risk, and random-timing luck from returns, equity curves, or trade logs.
At a glance
- What is it?
- QSX Strategy Score turns a return curve, equity curve or trade log into a 0-100 path-quality score with overfit, buy-and-hold and random-timing checks. It is a screener, not a tear sheet, and the docs are explicit that the number does not prove alpha.
- Who is it for?
- Adopt QSX Strategy Score if you have a backtest result in CSV, TSV or Excel form and you want a fast, local, account-free read on whether the path is fragile, lucky or mostly beta before you spend days on a full tear sheet. Skip it if you need attribution, factor decomposition or institutional reporting, because the output is deliberately compact and the README says it is not a replacement for QuantStats or pyfolio.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 55 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 19, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What QSX Strategy Score screens for, and who it is aimed at
Most backtest tooling answers the question "how did this strategy perform?" QSX Strategy Score answers a narrower one. The README frames the intended output as a single screening decision: whether a backtest is worth deeper due diligence, or whether it looks fragile, lucky, overfit, or mostly beta. That is a different job from performance reporting, and the project says so directly in its positioning section.
The target user is someone who already has a result file. The README lists three accepted shapes: a return series with date and return columns, an equity curve with date and equity columns, and a closed-trade log with entry_time, exit_time, pnl_pct, side and symbol. CSV, TSV, Excel and TradingView-style exports are all listed as supported inputs. If your strategy output cannot be expressed in one of those three shapes, the tool has nothing to read.
The checks it runs are named in the README: a QSX Score and grade, overfit and too-good-to-be-true checks, a buy-and-hold comparison, a random timing test, and a Monte Carlo stress test. There is also an optional Overlay Preview, which the README describes as a way to test whether dynamic risk sizing changes the path. That overlay is explicitly not an entry signal, exit signal or coin selector; it sits outside the original strategy and multiplies the original returns by a dynamic exposure series.
The framing matters more than the feature list. A strategy can be profitable and still score badly. The README's own example output shows a 59 out of 100 with a NEEDS WORK grade, where the headline problem is that the path is indistinguishable from random timing at p=0.32, with an 83 percent max drawdown and a 0.90 correlation to buy-and-hold. The project's interpretation of that result is not "the strategy is useless" but "the uploaded path looks more like asset beta plus risk exposure than proven timing edge." That is the right mental model for the tool.
How the scoring pipeline works, from upload to grade
The mechanism is a file-in, score-out pipeline. You supply one of the three accepted path shapes, the tool normalizes it into a return or equity series, runs a fixed battery of checks against a benchmark for the named asset, and emits a 0-100 score plus a grade and a list of failure modes. The README describes the number as a description of the uploaded path, not a claim about live performance or production readiness.
The grade vocabulary is where the design gets interesting. PROVISIONAL means the path may look promising but benchmark, random-control, sample or track-record evidence is still incomplete. GOLD, SILVER and BRONZE require comparable benchmark evidence and passed free checks. NEEDS WORK and FLAGGED indicate a material weakness or a backtest that should be verified before the score is trusted. Notice that the top grades are gated on evidence availability, not just on the score. A high number with missing benchmark data cannot earn a medal; it stays PROVISIONAL. That is a deliberate constraint, and it is the part of the design most likely to frustrate first-time users who expect a high score to mean a high grade.
The asset flag matters for the same reason. The CLI example passes --asset BTC, and the buy-and-hold comparison and beta correlation depend on having a benchmark series for that asset. Score a BTC strategy without naming the asset and the benchmark-dependent checks have nothing to compare against, which pushes the result toward the provisional end of the scale.
The random timing test is the check that most clearly separates this tool from a standard performance report. It asks whether the observed path is distinguishable from random entry timing. In the README's sample result, that test fails at p=0.32, and the headline is written as "Indistinguishable from random timing" followed by "No proven timing edge." The Monte Carlo stress test plays a similar role on the drawdown side, resampling the path to see how bad the worst case could plausibly get.
The README points to docs/scoring.md for the scoring model and docs/calibration.md for the exact grade boundaries. Those boundaries are the thing to read before you argue with a grade, because the README states that scoring thresholds may still change before v1.0.
Installing QSX Strategy Score and scoring your first CSV
The repository installs as a Python package named qsx-score-free, with the console entry point qsx-score. Python 3.9 through 3.12 is the supported range according to the badges, and the base dependencies are only numpy and pandas. Matplotlib, Streamlit, openpyxl and xlrd live behind optional extras, so a minimal install stays small.
Clone the repository and install it in editable mode with the app and excel extras if you want the web UI and Excel input support:
git clone https://github.com/jianweiweng05/qsx-strategy-score.git
cd qsx-strategy-score
python -m pip install -e ".[app,excel]"Wait for pip to resolve numpy and pandas, then confirm the entry point exists. The README's first real command scores a bundled example file and names the benchmark asset and the output language:
qsx-score examples/strategy_alpha.csv --asset BTC --lang enYou should see a QSX Score out of 100, a grade, a headline sentence and a short list of key problems. The README's example result shows the shape of that output: a score of 59, a NEEDS WORK grade, a headline about random timing at p=0.32, and problems listing an 83 percent max drawdown, a failed random timing test, and a 0.90 correlation with buy-and-hold. Your numbers will differ because they come from your file.
The --lang flag accepts en, zh, ja, ko, es and pt-BR, and it localizes the CLI output, the PNG scorecard and the web output. To produce artifacts you can share, add the out, pdf and json flags:
qsx-score examples/strategy_alpha.csv --asset BTC --out card.png --pdf diagnostic.pdf --json report.jsonThat writes a shareable PNG scorecard, a three-page free diagnostic PDF, and a machine-readable JSON report. If you prefer a browser interface over the CLI, the repository ships a Streamlit app:
streamlit run app/streamlit_app.pyYour own file needs to match one of the documented shapes. A return series looks like this:
date,return
2021-01-01,0.012
2021-01-02,-0.004If your data is an equity curve instead, use date and equity columns. If it is a trade log, the required columns are entry_time, exit_time, pnl_pct, side and symbol. The examples directory contains sample_returns.csv, sample_equity.csv, sample_flagged.csv, strategy_alpha.csv and strategy_beta.csv if you want to compare a clean path against a flagged one before pointing the tool at your own results.
Where the screener breaks down and when it is the wrong tool
The most concrete limitation is stated in the Overlay Preview section: it rejects trade logs with overlapping per-position trades. If you run a strategy that holds multiple positions at once, a per-trade log cannot be aggregated into a single exposure series without ambiguity, so the preview refuses the input. The README's instruction is to upload an equity curve or a daily return series instead, so the preview works on the aggregate strategy path. That is a real constraint on multi-position strategies, and it is not something you can configure around.
The second limitation is scope. The README says plainly that QSX Strategy Score is not a replacement for QuantStats, pyfolio or a full research notebook. The output is intentionally compact: one score, an evidence status, the main failure modes, a scorecard and an optional overlay preview. There is no factor attribution, no rolling performance table, no exposure decomposition by sector or regime. If your question is "which part of this return stream came from what," this tool will not answer it.
The third is maturity. The README warns that scoring thresholds and hosted components may still change before v1.0. The release history in the repository shows v0.3.2, v0.3.3 and v0.3.4 all landing on 2026-07-16, which is a burst of patch releases on a single day. That pattern is consistent with a project still settling its scoring rules, and it means a grade you record today is not guaranteed to reproduce under a later version. Pin the version if you plan to compare scores across time.
Finally, the score itself is bounded by the input. A return series carries no information about position sizing, instrument selection or execution assumptions. The tool can tell you the path looks like beta plus risk exposure. It cannot tell you why, and it cannot tell you whether the same logic would survive live slippage. Treat a passing grade as permission to do more work, not as a result.
QSX Strategy Score versus QuantStats and pyfolio
The README names QuantStats and pyfolio as the tools to reach for when you want a detailed performance tear sheet, and positions itself as the fast screening alternative. The difference is in the question each one answers.
QuantStats produces a broad statistical report over a return series: cumulative returns, drawdown tables, rolling Sharpe, monthly heatmaps, and a long list of ratios. Its output is descriptive. It will show you that a strategy has a 1.4 Sharpe and an 83 percent drawdown, and it will leave the interpretation to you. pyfolio takes a similar descriptive stance with a portfolio-oriented bent, including position and transaction analysis.
QSX Strategy Score inverts that. It runs a narrower set of checks and commits to a verdict. The random timing test and the buy-and-hold correlation are the two checks that do the most work here, because they attack the most common way a backtest looks good without being good: the strategy is long the asset during an uptrend, and the equity curve inherits the asset's return. The README's sample result makes this explicit with corr +0.90 and beta +0.82 against buy-and-hold, alongside a failed random timing test. QuantStats would report the correlation if you asked it to. QSX Strategy Score leads with it and downgrades the grade because of it.
The trade-off is real in both directions. You lose the diagnostic breadth of a tear sheet, and you gain a screening decision you can act on in minutes. The practical pattern is to run QSX Strategy Score first on a new backtest, and only pull out QuantStats or a notebook for the strategies that survive the screen. The README also notes that a full audit-report workflow exists at quantscopex.com/report for users who want deeper due diligence after screening, which is the project's own answer to the depth gap.
Licence, maintenance and the cost of upgrading
The project is MIT licensed, with the licence text in the LICENSE file and the pyproject.toml declaring license = { text = "MIT" }. MIT permits commercial use, modification and redistribution provided the copyright notice and permission notice are retained. That is a permissive arrangement, and it means you can vendor the package into an internal pipeline without a legal review cycle in most organisations. This is a description of the licence terms, not legal advice; if you are redistributing it inside a product, read the LICENSE file yourself.
The dependency footprint keeps upgrade cost low. The required packages are numpy and pandas. Matplotlib is only needed for the card extra, Streamlit for the app extra, and openpyxl plus xlrd for the excel extra. A CI-only or CLI-only deployment can install without any of them, which limits how often a transitive dependency bump forces you to touch the package.
The upgrade risk sits in the scoring model, not the code. The README states that scoring thresholds and hosted components may still change before v1.0, and the release notes show three patch versions on 2026-07-16. If you store scores or grades from an earlier run and compare them against a later version, a threshold change can move a strategy from one grade band to another without any change to the strategy. The repository includes docs/calibration.md and docs/release-governance.md, and the README points readers to both for the exact boundaries and version policy. Read those before you build any workflow that treats a grade as a stable identifier.
Maintenance signals from the repository: the last push was on 2026-07-27, the most recent release is v0.3.4 from 2026-07-16, and the repository is not archived. The README's own warning about pre-v1.0 thresholds is the honest summary of where the project stands.
Editorial conclusion
Adopt QSX Strategy Score if you have a backtest result in CSV, TSV or Excel form and you want a fast, local, account-free read on whether the path is fragile, lucky or mostly beta before you spend days on a full tear sheet. Skip it if you need attribution, factor decomposition or institutional reporting, because the output is deliberately compact and the README says it is not a replacement for QuantStats or pyfolio. Before trusting any grade, verify three things yourself: which input format your file actually matches, whether your trade log has overlapping per-position trades (Overlay Preview rejects those), and how the score was calibrated against the thresholds in docs/calibration.md, since the README states scoring thresholds may still change before v1.0.
Frequently asked questions
What file formats does QSX Strategy Score accept?
The README lists CSV, TSV, Excel and TradingView-style exports, in three shapes: a return series with date and return columns, an equity curve with date and equity columns, or a closed-trade log with entry_time, exit_time, pnl_pct, side and symbol. The examples directory ships sample files for each shape.
Does QSX Strategy Score prove my strategy has real alpha?
No. The README states that the 0-100 number describes the uploaded path and does not prove real alpha or production readiness. A grade of PROVISIONAL means benchmark, random-control, sample or track-record evidence is still incomplete, and only GOLD, SILVER and BRONZE require comparable benchmark evidence and passed free checks.
Why does Overlay Preview reject my trade log?
Overlay Preview rejects trade logs with overlapping per-position trades, because the overlay needs a single aggregate strategy path. The README's instruction is to upload an equity curve or a daily return series instead so the preview can work on the aggregate path.
Community notes