quantred 2.4.0__tar.gz → 2.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {quantred-2.4.0 → quantred-2.4.1}/.github/workflows/docs.yml +2 -2
- {quantred-2.4.0 → quantred-2.4.1}/.github/workflows/release.yml +3 -3
- {quantred-2.4.0 → quantred-2.4.1}/PKG-INFO +20 -20
- {quantred-2.4.0 → quantred-2.4.1}/README.md +16 -16
- {quantred-2.4.0 → quantred-2.4.1}/docker-compose.yml +10 -2
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/changelog.md +18 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/docker.md +9 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/first-run.md +2 -2
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/migrating-to-quantred.md +4 -2
- {quantred-2.4.0 → quantred-2.4.1}/docs/docusaurus.config.js +1 -1
- {quantred-2.4.0 → quantred-2.4.1}/docs/package-lock.json +2 -2
- {quantred-2.4.0 → quantred-2.4.1}/docs/package.json +1 -1
- quantred-2.4.1/docs/wrangler.jsonc +19 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/README.md +4 -4
- {quantred-2.4.0 → quantred-2.4.1}/pyproject.toml +5 -5
- {quantred-2.4.0 → quantred-2.4.1}/quantred/__init__.py +1 -1
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/registry.py +18 -5
- {quantred-2.4.0 → quantred-2.4.1}/quantred/settings.py +1 -1
- {quantred-2.4.0 → quantred-2.4.1}/scripts/compose_smoke.sh +2 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_name.py +1 -1
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_extension_registry.py +50 -3
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_release_order.py +1 -1
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_transition_package.py +1 -1
- quantred-2.4.0/docs/wrangler.jsonc +0 -14
- {quantred-2.4.0 → quantred-2.4.1}/.dockerignore +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/.env.example +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/.github/pull_request_template.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/.github/scripts/require_published_dependency.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/.github/workflows/ci.yml +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/.gitignore +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/.gitleaksignore +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/.nvmrc +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/AGENTS.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/CLAUDE.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/CONTRIBUTING.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/Dockerfile +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/LICENSE +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/Makefile +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/conftest.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/.nvmrc +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/alphas.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/architecture.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/attribution.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/broker-abstraction.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/coding-standards.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/data-flow.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/data-panel.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/embedding.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/engine.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/evaluation-metrics.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/extending.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/indicators.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/information-analysis.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/information-horizon.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/mcp-server.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/multi-period-trading.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/multi-signal.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/optimization.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/philosophy.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/portfolio-construction.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/portfolio.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/research-agent.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/risk-model.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/scanners.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/separation-of-concerns.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/strategies.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/testing.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/transaction-costs.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/verdict.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/walk-forward.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/intro.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/agents.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/alphas.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/backtesting.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/brokers.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/configuration.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/extras.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/getting-started.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/horizon.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/html-reports.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/information.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/installation.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/live-trading.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/optimization.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/portfolio.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/private-strategies.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/risk.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/run-configs.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/scanning.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/screening.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/stopping.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/trials.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/validation-diagnostics.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/verdict.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/walk-forward.md +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/sidebars.js +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/src/css/custom.css +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/static/.gitkeep +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/docs/static/img/demo.png +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/.gitignore +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/configs/breakout.json +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/configs/reversion_longshort.json +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/scanners/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/scanners/liquidity.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/strategies/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/strategies/breakout.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/strategies/pairs_reversion.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/example/pyproject.toml +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/main.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/base.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/combine.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/horizon.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/refine.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/scorers.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/attribution.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/bootstrap.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/charts.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/excursion.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/execution_quality.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/exposure.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/htmlreport.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/information.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/metrics.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/performance.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/reporting.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/screening.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/series_comparison.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/trade_analytics.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/alpaca/broker.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/alpaca/factory.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/alpaca/market_data.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/base.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/dryrun.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/errors.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/cli.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/costs/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/costs/base.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/costs/parametric.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/data/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/data/compute.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/data/edges.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/data/features.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/data/panel.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/data/scan.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/data/store.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/demo/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/demo/scanners.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/demo/strategies.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/engine/backtest.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/engine/barcheck.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/engine/live.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/decision.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/flatten.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/halt.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/ledger.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/live_trader.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/order_id.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/sizing.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/indicators/indicators.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/base.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/client.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/session.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/synthetic.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/timeframe.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/mcp/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/mcp/selftest.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/mcp/server.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/causality.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/config_store.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/optimizer.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/parallel.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/param_space.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/walk_forward.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/allocator.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/benchmark.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/optimizer.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/policy.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/posterior.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/research/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/research/agent.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/research/demo_proposals.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/research/llm.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/research/proposer.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/research/provider_errors.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/research/sandbox.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/base.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/conditional.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/exposures.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/factor.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/sample.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/streaming.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/scanners/base.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/scanners/symbol_scanner.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/analysis.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/audit.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/campaign.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/configs.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/data.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/dryrun.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/glossary.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/maintenance.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/setup.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/sizing.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/services/smallreal.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/store/__init__.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/store/bars.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/store/trials.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/strategies/base.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/strategies/signals.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/errors.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/extras.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/logging_config.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/numeric.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/streaming.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/timeutils.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/scripts/check_links.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/conftest.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/fakes.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/state_leak_guard.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_alphas.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_attribution.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_backtest.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_backtest_surface_parity.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_bar_cache.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_bar_path_concurrency.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_benchmark_portfolio.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_black_litterman.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_bootstrap_skill.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_broker_errors.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_campaign_material.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_causality_probes.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_dates.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_help.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_hints.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_input_refusals.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_closing_inventory.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_combine.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_compute.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_conditional_risk.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_conditional_risk_service.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_cost_aware.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_costs.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_data.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_diagnostic_surfaces.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_docs_commands.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_dry_run.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_dst_boundaries.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_example_pack.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_execution_quality.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_extras_map.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_forecast_refinement_v2.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_halt.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_holdout_history.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_honest_labels.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_horizon.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_html_report.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_html_report_ux.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_information.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_ledger_fill_accounting.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_links.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_live_hardening.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_live_portfolio_cli.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_live_trader.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_long_short.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_market_data_feed.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_bad_input.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_description_truth.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_json_safe.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_keyless.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_save_config.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_shutdown.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_stdio.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_surface.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_memoized_backtest.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_min_notional_parity.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_model_probe.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_multi_period_policy.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_net_cap_derivation.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_net_exposure.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_offline.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_optimizer.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_optimizer_book.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_packaging.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_parallel_trials.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_param_constraints.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_portfolio.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_portfolio_excursion.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_portfolio_optimizer.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_promoted_cost.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_research.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_research_cli.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_research_history.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_research_rounds.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_risk.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_risk_streaming.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_run_config.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_run_context.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_saved_config_book.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_scanner.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_screen_command.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_screening.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_series_comparison.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_services.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_settings.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_setup.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_shutdown_signals.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_signal_causality.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_small_real_command.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_small_real_contract.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_state_leak_guard.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_state_root.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_store.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_strategy.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_strategy_registry.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_stream.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_stream_close.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_surface_parity.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_synthetic.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_trade_analytics.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_trade_command_output.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_trade_update_handling.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_browser.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_history_labels.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_id_prefix.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_store.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_store_maintenance.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_units.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_verdict.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_walk_forward.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/tests/test_walk_forward_evidence_parity.py +0 -0
- {quantred-2.4.0 → quantred-2.4.1}/uv.lock +0 -0
|
@@ -91,8 +91,8 @@ jobs:
|
|
|
91
91
|
if [ -z "$CLOUDFLARE_API_TOKEN" ]; then
|
|
92
92
|
echo "::error title=Missing deploy credentials::CLOUDFLARE_API_TOKEN is not set."
|
|
93
93
|
echo ""
|
|
94
|
-
echo "The docs site cannot deploy without it, so
|
|
95
|
-
echo "keep serving
|
|
94
|
+
echo "The docs site cannot deploy without it, so quantred.mk-dir.com will"
|
|
95
|
+
echo "keep serving the version that is already deployed (if any); nothing new is published."
|
|
96
96
|
echo ""
|
|
97
97
|
echo "Add it at: Settings -> Secrets and variables -> Actions"
|
|
98
98
|
echo " CLOUDFLARE_API_TOKEN a token with the Workers Scripts:Edit permission"
|
|
@@ -18,7 +18,7 @@ name: Release
|
|
|
18
18
|
#
|
|
19
19
|
# A tag `v*` publishes the engine from the repository root. A tag `tradeflow-engine-v*`
|
|
20
20
|
# publishes the final transition release of the old distribution name from
|
|
21
|
-
#
|
|
21
|
+
# legacy/tradeflow-engine instead. That project's trusted publisher must name the
|
|
22
22
|
# repository as it is now called (`quantred`, renamed from the old one) and the same
|
|
23
23
|
# workflow `release.yml` and environment `pypi`.
|
|
24
24
|
|
|
@@ -53,7 +53,7 @@ jobs:
|
|
|
53
53
|
run: uv build
|
|
54
54
|
- name: Build the transition package (tag tradeflow-engine-v*)
|
|
55
55
|
if: startsWith(github.ref, 'refs/tags/tradeflow-engine-v')
|
|
56
|
-
run: uv build
|
|
56
|
+
run: uv build legacy/tradeflow-engine -o dist
|
|
57
57
|
# Catches a malformed README or bad metadata before it is permanent.
|
|
58
58
|
- run: uvx twine check dist/*
|
|
59
59
|
# The tag and the packaged version must agree, or the release notes describe
|
|
@@ -77,7 +77,7 @@ jobs:
|
|
|
77
77
|
# installed, so the order of the two tags is checked, not remembered.
|
|
78
78
|
- name: The engine release this requires is on PyPI
|
|
79
79
|
if: startsWith(github.ref, 'refs/tags/tradeflow-engine-v')
|
|
80
|
-
run: uv run --no-project --with packaging python .github/scripts/require_published_dependency.py
|
|
80
|
+
run: uv run --no-project --with packaging python .github/scripts/require_published_dependency.py legacy/tradeflow-engine/pyproject.toml
|
|
81
81
|
- uses: actions/upload-artifact@v7
|
|
82
82
|
with:
|
|
83
83
|
name: dist
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: quantred
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.1
|
|
4
4
|
Summary: A layered, broker-agnostic algorithmic-trading research engine that is honest about how hard making money is.
|
|
5
|
-
Project-URL: Homepage, https://
|
|
6
|
-
Project-URL: Documentation, https://
|
|
5
|
+
Project-URL: Homepage, https://quantred.mk-dir.com/
|
|
6
|
+
Project-URL: Documentation, https://quantred.mk-dir.com/
|
|
7
7
|
Project-URL: Source, https://github.com/makedirectory/quantred
|
|
8
8
|
Project-URL: Issues, https://github.com/makedirectory/quantred/issues
|
|
9
|
-
Project-URL: Changelog, https://
|
|
9
|
+
Project-URL: Changelog, https://quantred.mk-dir.com/changelog
|
|
10
10
|
Author-email: Andrew Schwartz <andrew@mk-dir.com>
|
|
11
11
|
License-Expression: MIT
|
|
12
12
|
License-File: LICENSE
|
|
@@ -60,7 +60,7 @@ Description-Content-Type: text/markdown
|
|
|
60
60
|
# QuantRed
|
|
61
61
|
|
|
62
62
|
[](https://github.com/makedirectory/quantred/actions/workflows/ci.yml)
|
|
63
|
-
[](https://quantred.mk-dir.com/)
|
|
64
64
|
|
|
65
65
|
A small, **layered**, **broker-agnostic** algorithmic-trading **research
|
|
66
66
|
engine** — and an honest one, which mostly means it's very good at telling you
|
|
@@ -75,8 +75,8 @@ optimization**, **walk-forward validation**, and **constraint-solver portfolio
|
|
|
75
75
|
allocation**.
|
|
76
76
|
|
|
77
77
|
Full docs — usage guide, engineering wiki, and
|
|
78
|
-
[changelog](https://
|
|
79
|
-
**[
|
|
78
|
+
[changelog](https://quantred.mk-dir.com/changelog) — live at
|
|
79
|
+
**[quantred.mk-dir.com](https://quantred.mk-dir.com/)**.
|
|
80
80
|
|
|
81
81
|
> Making money in markets is genuinely hard. This project won't change that — but
|
|
82
82
|
> it will at least stop you from fooling yourself quite so quickly, which is most
|
|
@@ -115,7 +115,7 @@ never touch**:
|
|
|
115
115
|
**Promotion is a manual human step** — automation never flips `PAPER_TRADE` or
|
|
116
116
|
places an order. The [MCP server](#agent-integration-mcp) enforces this
|
|
117
117
|
*structurally*: it builds only a data client, so it physically cannot trade. See
|
|
118
|
-
the [architecture docs](https://
|
|
118
|
+
the [architecture docs](https://quantred.mk-dir.com/engineering/architecture)
|
|
119
119
|
for the full picture.
|
|
120
120
|
|
|
121
121
|
## Requirements
|
|
@@ -153,11 +153,11 @@ quantred mcp --self-test # confirm discovery works without a chat
|
|
|
153
153
|
|
|
154
154
|
Optional capabilities are extras (charts, the MCP server, the model SDKs). Adding one
|
|
155
155
|
later with `uv tool` replaces the environment, so list every extra you want — the
|
|
156
|
-
[extras guide](https://
|
|
156
|
+
[extras guide](https://quantred.mk-dir.com/usage/extras) has the table and the exact
|
|
157
157
|
commands. `quantred init --check --for <task>` prints the one you need for that task, and a
|
|
158
158
|
command that needs a missing extra prints it with your current extras filled in.
|
|
159
159
|
|
|
160
|
-
**→ [Getting started](https://
|
|
160
|
+
**→ [Getting started](https://quantred.mk-dir.com/usage/getting-started)** walks the
|
|
161
161
|
whole path: install → keys → your first real result → Claude connected. Six steps,
|
|
162
162
|
the first two with no keys and no network.
|
|
163
163
|
|
|
@@ -167,7 +167,7 @@ The distribution and the command are both **`quantred`**; the importable package
|
|
|
167
167
|
`quantred`, so upgrading it moves you across without breaking old scripts, MCP configs or
|
|
168
168
|
packs importing `tradeflow` (the alias raises a `DeprecationWarning`, shown under `-W default` or in test runs). A private pack needs its imports
|
|
169
169
|
changed from `tradeflow` to `quantred` before you drop it. The steps are in
|
|
170
|
-
[migrating to QuantRed](https://
|
|
170
|
+
[migrating to QuantRed](https://quantred.mk-dir.com/usage/migrating-to-quantred).
|
|
171
171
|
|
|
172
172
|
State (the research journal, trial store, bar cache, promoted configs) lives in
|
|
173
173
|
`~/.tradeflow` — for an installed copy and for a checkout alike. `quantred --version`
|
|
@@ -210,7 +210,7 @@ docker compose run --rm verdict --scanner none \
|
|
|
210
210
|
```
|
|
211
211
|
|
|
212
212
|
`live` is profile-gated and is never started by `up` — turning the machine on must
|
|
213
|
-
not turn trading on. See [Running in Docker](https://
|
|
213
|
+
not turn trading on. See [Running in Docker](https://quantred.mk-dir.com/usage/docker).
|
|
214
214
|
|
|
215
215
|
Run `make help` to see every target. Anything is overridable inline:
|
|
216
216
|
|
|
@@ -273,7 +273,7 @@ alongside it appears in the same table, scored the same way.
|
|
|
273
273
|
Notice the arc: `demo_trend` looks tradeable in-sample (+14.7%, Sharpe 0.48), but
|
|
274
274
|
once it's optimized in-sample and scored **out-of-sample** the edge evaporates
|
|
275
275
|
(median OOS Sharpe −0.26) and all but one promotion gate fails. That's
|
|
276
|
-
[walk-forward validation](https://
|
|
276
|
+
[walk-forward validation](https://quantred.mk-dir.com/engineering/walk-forward)
|
|
277
277
|
doing its job.
|
|
278
278
|
|
|
279
279
|
### Watching the agent get told "no"
|
|
@@ -376,13 +376,13 @@ them out of this repository entirely.
|
|
|
376
376
|
|
|
377
377
|
Each strategy defines a single continuous **score** (its conviction); the trade
|
|
378
378
|
clock's `BUY/SELL/HOLD` and the
|
|
379
|
-
[continuous alpha](https://
|
|
379
|
+
[continuous alpha](https://quantred.mk-dir.com/engineering/alphas) are both
|
|
380
380
|
derived from it — one source of truth.
|
|
381
381
|
|
|
382
382
|
`example` is a complete working pack to copy — `quantred init
|
|
383
383
|
--example-pack ./my-signals` writes it out. See
|
|
384
|
-
[Your own strategies](https://
|
|
385
|
-
and [Extending](https://
|
|
384
|
+
[Your own strategies](https://quantred.mk-dir.com/usage/private-strategies)
|
|
385
|
+
and [Extending](https://quantred.mk-dir.com/engineering/extending).
|
|
386
386
|
|
|
387
387
|
### Using it from your own code
|
|
388
388
|
|
|
@@ -399,13 +399,13 @@ print(result["verdict"]["summary"])
|
|
|
399
399
|
```
|
|
400
400
|
|
|
401
401
|
Everything outside `services/` is internal and moves without notice. See
|
|
402
|
-
[Using QuantRed as a library](https://
|
|
402
|
+
[Using QuantRed as a library](https://quantred.mk-dir.com/engineering/embedding).
|
|
403
403
|
|
|
404
404
|
### Optional features
|
|
405
405
|
|
|
406
406
|
Capabilities are optional extras so the base install stays lean:
|
|
407
407
|
|
|
408
|
-
Installed: see the [extras guide](https://
|
|
408
|
+
Installed: see the [extras guide](https://quantred.mk-dir.com/usage/extras). In a
|
|
409
409
|
checkout:
|
|
410
410
|
|
|
411
411
|
```bash
|
|
@@ -510,7 +510,7 @@ quantred research --provider ollama --model llama3.1 \
|
|
|
510
510
|
--goal "improve OOS Sharpe without raising max drawdown" --holdout-days 60
|
|
511
511
|
```
|
|
512
512
|
|
|
513
|
-
See the [docs](https://
|
|
513
|
+
See the [docs](https://quantred.mk-dir.com/) (Usage → *AI agents*) for the full
|
|
514
514
|
tool surface, guardrails, and provider setup.
|
|
515
515
|
|
|
516
516
|
*Contributors, from a checkout:* the same commands run as `python main.py mcp` and
|
|
@@ -619,7 +619,7 @@ make flatten REASON="why" # halt, cancel everything, close everythin
|
|
|
619
619
|
|
|
620
620
|
Halt state is a file under the state root, not a database — the order path holds no
|
|
621
621
|
connection to anything that can be down, so the switch still works when the engine
|
|
622
|
-
does not. See [Stopping trading](https://
|
|
622
|
+
does not. See [Stopping trading](https://quantred.mk-dir.com/usage/stopping).
|
|
623
623
|
|
|
624
624
|
## ☕ Coffee?
|
|
625
625
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# QuantRed
|
|
2
2
|
|
|
3
3
|
[](https://github.com/makedirectory/quantred/actions/workflows/ci.yml)
|
|
4
|
-
[](https://quantred.mk-dir.com/)
|
|
5
5
|
|
|
6
6
|
A small, **layered**, **broker-agnostic** algorithmic-trading **research
|
|
7
7
|
engine** — and an honest one, which mostly means it's very good at telling you
|
|
@@ -16,8 +16,8 @@ optimization**, **walk-forward validation**, and **constraint-solver portfolio
|
|
|
16
16
|
allocation**.
|
|
17
17
|
|
|
18
18
|
Full docs — usage guide, engineering wiki, and
|
|
19
|
-
[changelog](https://
|
|
20
|
-
**[
|
|
19
|
+
[changelog](https://quantred.mk-dir.com/changelog) — live at
|
|
20
|
+
**[quantred.mk-dir.com](https://quantred.mk-dir.com/)**.
|
|
21
21
|
|
|
22
22
|
> Making money in markets is genuinely hard. This project won't change that — but
|
|
23
23
|
> it will at least stop you from fooling yourself quite so quickly, which is most
|
|
@@ -56,7 +56,7 @@ never touch**:
|
|
|
56
56
|
**Promotion is a manual human step** — automation never flips `PAPER_TRADE` or
|
|
57
57
|
places an order. The [MCP server](#agent-integration-mcp) enforces this
|
|
58
58
|
*structurally*: it builds only a data client, so it physically cannot trade. See
|
|
59
|
-
the [architecture docs](https://
|
|
59
|
+
the [architecture docs](https://quantred.mk-dir.com/engineering/architecture)
|
|
60
60
|
for the full picture.
|
|
61
61
|
|
|
62
62
|
## Requirements
|
|
@@ -94,11 +94,11 @@ quantred mcp --self-test # confirm discovery works without a chat
|
|
|
94
94
|
|
|
95
95
|
Optional capabilities are extras (charts, the MCP server, the model SDKs). Adding one
|
|
96
96
|
later with `uv tool` replaces the environment, so list every extra you want — the
|
|
97
|
-
[extras guide](https://
|
|
97
|
+
[extras guide](https://quantred.mk-dir.com/usage/extras) has the table and the exact
|
|
98
98
|
commands. `quantred init --check --for <task>` prints the one you need for that task, and a
|
|
99
99
|
command that needs a missing extra prints it with your current extras filled in.
|
|
100
100
|
|
|
101
|
-
**→ [Getting started](https://
|
|
101
|
+
**→ [Getting started](https://quantred.mk-dir.com/usage/getting-started)** walks the
|
|
102
102
|
whole path: install → keys → your first real result → Claude connected. Six steps,
|
|
103
103
|
the first two with no keys and no network.
|
|
104
104
|
|
|
@@ -108,7 +108,7 @@ The distribution and the command are both **`quantred`**; the importable package
|
|
|
108
108
|
`quantred`, so upgrading it moves you across without breaking old scripts, MCP configs or
|
|
109
109
|
packs importing `tradeflow` (the alias raises a `DeprecationWarning`, shown under `-W default` or in test runs). A private pack needs its imports
|
|
110
110
|
changed from `tradeflow` to `quantred` before you drop it. The steps are in
|
|
111
|
-
[migrating to QuantRed](https://
|
|
111
|
+
[migrating to QuantRed](https://quantred.mk-dir.com/usage/migrating-to-quantred).
|
|
112
112
|
|
|
113
113
|
State (the research journal, trial store, bar cache, promoted configs) lives in
|
|
114
114
|
`~/.tradeflow` — for an installed copy and for a checkout alike. `quantred --version`
|
|
@@ -151,7 +151,7 @@ docker compose run --rm verdict --scanner none \
|
|
|
151
151
|
```
|
|
152
152
|
|
|
153
153
|
`live` is profile-gated and is never started by `up` — turning the machine on must
|
|
154
|
-
not turn trading on. See [Running in Docker](https://
|
|
154
|
+
not turn trading on. See [Running in Docker](https://quantred.mk-dir.com/usage/docker).
|
|
155
155
|
|
|
156
156
|
Run `make help` to see every target. Anything is overridable inline:
|
|
157
157
|
|
|
@@ -214,7 +214,7 @@ alongside it appears in the same table, scored the same way.
|
|
|
214
214
|
Notice the arc: `demo_trend` looks tradeable in-sample (+14.7%, Sharpe 0.48), but
|
|
215
215
|
once it's optimized in-sample and scored **out-of-sample** the edge evaporates
|
|
216
216
|
(median OOS Sharpe −0.26) and all but one promotion gate fails. That's
|
|
217
|
-
[walk-forward validation](https://
|
|
217
|
+
[walk-forward validation](https://quantred.mk-dir.com/engineering/walk-forward)
|
|
218
218
|
doing its job.
|
|
219
219
|
|
|
220
220
|
### Watching the agent get told "no"
|
|
@@ -317,13 +317,13 @@ them out of this repository entirely.
|
|
|
317
317
|
|
|
318
318
|
Each strategy defines a single continuous **score** (its conviction); the trade
|
|
319
319
|
clock's `BUY/SELL/HOLD` and the
|
|
320
|
-
[continuous alpha](https://
|
|
320
|
+
[continuous alpha](https://quantred.mk-dir.com/engineering/alphas) are both
|
|
321
321
|
derived from it — one source of truth.
|
|
322
322
|
|
|
323
323
|
`example` is a complete working pack to copy — `quantred init
|
|
324
324
|
--example-pack ./my-signals` writes it out. See
|
|
325
|
-
[Your own strategies](https://
|
|
326
|
-
and [Extending](https://
|
|
325
|
+
[Your own strategies](https://quantred.mk-dir.com/usage/private-strategies)
|
|
326
|
+
and [Extending](https://quantred.mk-dir.com/engineering/extending).
|
|
327
327
|
|
|
328
328
|
### Using it from your own code
|
|
329
329
|
|
|
@@ -340,13 +340,13 @@ print(result["verdict"]["summary"])
|
|
|
340
340
|
```
|
|
341
341
|
|
|
342
342
|
Everything outside `services/` is internal and moves without notice. See
|
|
343
|
-
[Using QuantRed as a library](https://
|
|
343
|
+
[Using QuantRed as a library](https://quantred.mk-dir.com/engineering/embedding).
|
|
344
344
|
|
|
345
345
|
### Optional features
|
|
346
346
|
|
|
347
347
|
Capabilities are optional extras so the base install stays lean:
|
|
348
348
|
|
|
349
|
-
Installed: see the [extras guide](https://
|
|
349
|
+
Installed: see the [extras guide](https://quantred.mk-dir.com/usage/extras). In a
|
|
350
350
|
checkout:
|
|
351
351
|
|
|
352
352
|
```bash
|
|
@@ -451,7 +451,7 @@ quantred research --provider ollama --model llama3.1 \
|
|
|
451
451
|
--goal "improve OOS Sharpe without raising max drawdown" --holdout-days 60
|
|
452
452
|
```
|
|
453
453
|
|
|
454
|
-
See the [docs](https://
|
|
454
|
+
See the [docs](https://quantred.mk-dir.com/) (Usage → *AI agents*) for the full
|
|
455
455
|
tool surface, guardrails, and provider setup.
|
|
456
456
|
|
|
457
457
|
*Contributors, from a checkout:* the same commands run as `python main.py mcp` and
|
|
@@ -560,7 +560,7 @@ make flatten REASON="why" # halt, cancel everything, close everythin
|
|
|
560
560
|
|
|
561
561
|
Halt state is a file under the state root, not a database — the order path holds no
|
|
562
562
|
connection to anything that can be down, so the switch still works when the engine
|
|
563
|
-
does not. See [Stopping trading](https://
|
|
563
|
+
does not. See [Stopping trading](https://quantred.mk-dir.com/usage/stopping).
|
|
564
564
|
|
|
565
565
|
## ☕ Coffee?
|
|
566
566
|
|
|
@@ -17,6 +17,14 @@
|
|
|
17
17
|
#
|
|
18
18
|
# Live trading is NEVER started by `up`. See the `live` service at the bottom.
|
|
19
19
|
|
|
20
|
+
# The project name is pinned, not derived from the checkout directory's name. Compose
|
|
21
|
+
# prefixes every volume with it, and it was `tradeflow` for everyone whose clone was
|
|
22
|
+
# called that: the journal lives in `tradeflow_tradeflow-logs`. A clone now made from the
|
|
23
|
+
# renamed repository lands in a `quantred/` directory, and an unpinned name would have
|
|
24
|
+
# pointed it at new, empty volumes. Pinned, every checkout - old directory or new -
|
|
25
|
+
# attaches to the same ones. Container and image names carry the new name; these do not.
|
|
26
|
+
name: tradeflow
|
|
27
|
+
|
|
20
28
|
x-app: &app
|
|
21
29
|
build:
|
|
22
30
|
context: .
|
|
@@ -41,7 +49,7 @@ services:
|
|
|
41
49
|
# ---------------------------------------------------------------- surfaces --
|
|
42
50
|
mcp:
|
|
43
51
|
<<: *app
|
|
44
|
-
container_name:
|
|
52
|
+
container_name: quantred-mcp
|
|
45
53
|
# The server speaks stdio, so this is attach-oriented rather than a listening
|
|
46
54
|
# port: an MCP client runs `docker compose run --rm mcp`. A TCP/SSE transport
|
|
47
55
|
# would add a port mapping here and nothing else.
|
|
@@ -64,7 +72,7 @@ services:
|
|
|
64
72
|
docs:
|
|
65
73
|
profiles: ["docs"]
|
|
66
74
|
image: node:24-slim
|
|
67
|
-
container_name:
|
|
75
|
+
container_name: quantred-docs
|
|
68
76
|
working_dir: /site
|
|
69
77
|
volumes:
|
|
70
78
|
- ./docs:/site
|
|
@@ -28,6 +28,24 @@ index; they are tagged in the repository.
|
|
|
28
28
|
|
|
29
29
|
---
|
|
30
30
|
|
|
31
|
+
## 2.4.1 — 2026-11-08
|
|
32
|
+
|
|
33
|
+
- **No false "a pack imports the old name" line when launched through the old name.**
|
|
34
|
+
`python -m tradeflow.cli ...` - the form MCP client configs written before the rename
|
|
35
|
+
use, working through `tradeflow-engine` 2.3.1 - imports the old name itself before
|
|
36
|
+
discovery runs, and the check read that as a pack using it, printing the warning on
|
|
37
|
+
every launch. It now warns only when the old name first appears while packs are
|
|
38
|
+
loading. One blind spot is accepted: when the process itself was launched through the
|
|
39
|
+
old name, a pack that also imports it is not named.
|
|
40
|
+
- **The documentation moves to https://quantred.mk-dir.com.** quantred's own package
|
|
41
|
+
metadata, the README links and the hints the CLI prints point there.
|
|
42
|
+
`tradeflow-engine` 2.3.1 is already published and its metadata still names the old
|
|
43
|
+
address; that cannot change.
|
|
44
|
+
- **The Docker containers are renamed `quantred-mcp` and `quantred-docs`** (they were
|
|
45
|
+
`tradeflow-mcp` and `tradeflow-docs`). Update any `docker exec`, `docker logs` or
|
|
46
|
+
client config that names the old container. The volumes keep their names because the
|
|
47
|
+
compose project is pinned to `tradeflow`.
|
|
48
|
+
|
|
31
49
|
## 2.4.0 — 2026-11-07
|
|
32
50
|
|
|
33
51
|
TradeFlow is now **QuantRed**, and a first session works from install to a result
|
|
@@ -80,6 +80,15 @@ resetting the campaign count that every multiple-testing correction depends on
|
|
|
80
80
|
nothing would error. `scripts/compose_smoke.sh` tests exactly that: journal a trial (no keys needed),
|
|
81
81
|
`down`, and check the trial is still there.
|
|
82
82
|
|
|
83
|
+
**Names.** The volumes are still called `tradeflow-logs`, `tradeflow-cache` and
|
|
84
|
+
`tradeflow-configs`, and the compose project is pinned as `tradeflow`, so Docker sees them
|
|
85
|
+
as `tradeflow_tradeflow-logs` and so on. That is deliberate: they hold the recorded trial
|
|
86
|
+
history, a renamed volume is a new empty one, and an unpinned project name would follow
|
|
87
|
+
the checkout directory, so a fresh clone into `quantred/` would not find a journal that a
|
|
88
|
+
clone into `tradeflow/` wrote. The containers and image carry the QuantRed name (the containers were renamed
|
|
89
|
+
`quantred-mcp` and `quantred-docs` in 2.4.1, so anything that names `tradeflow-mcp` or
|
|
90
|
+
`tradeflow-docs` needs updating); the volumes keep the old name on purpose.
|
|
91
|
+
|
|
83
92
|
**Ownership.** The image runs as a pinned non-root uid (1000) and creates each mount
|
|
84
93
|
point *in the image* so the named volumes inherit that ownership. Docker seeds a
|
|
85
94
|
volume's ownership from the image directory at that path and makes it root-owned
|
|
@@ -82,7 +82,7 @@ QuantRed setup check
|
|
|
82
82
|
state root: ~/.tradeflow
|
|
83
83
|
(journal, trial store, bar cache, and configs all live here)
|
|
84
84
|
|
|
85
|
-
[ok] version quantred 2.4.
|
|
85
|
+
[ok] version quantred 2.4.1
|
|
86
86
|
[optional] env file ~/.tradeflow/.env not found
|
|
87
87
|
-> run `init` to create it, or export the keys as environment variables
|
|
88
88
|
[blocked] APCA_API_KEY_ID (not set) - no command that touches the market will run
|
|
@@ -100,7 +100,7 @@ QuantRed setup check
|
|
|
100
100
|
blocked for: data (APCA_API_KEY_ID, APCA_API_SECRET_KEY)
|
|
101
101
|
blocked for: research (APCA_API_KEY_ID, APCA_API_SECRET_KEY, model provider)
|
|
102
102
|
|
|
103
|
-
Also not installed (optional): viz - what each unlocks and how to add it: https://
|
|
103
|
+
Also not installed (optional): viz - what each unlocks and how to add it: https://quantred.mk-dir.com/usage/extras
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
That is a trimmed example from a machine with no keys; your rows will differ (the
|
|
@@ -10,7 +10,8 @@ The project was called TradeFlow and was distributed as `tradeflow-engine`. It i
|
|
|
10
10
|
is for anyone who already has the old distribution installed. If you are installing for
|
|
11
11
|
the first time, you do not need it: see [installation](installation).
|
|
12
12
|
|
|
13
|
-
Two releases carry the move
|
|
13
|
+
Two releases carry the move (QuantRed 2.4.1 is a later fix, described under
|
|
14
|
+
[MCP clients](#mcp-clients)). QuantRed 2.4.0 is the first release published as `quantred`.
|
|
14
15
|
`tradeflow-engine` 2.3.1 is the last release under the old name and is published after
|
|
15
16
|
it: a transition package with no engine code of its own. It depends on `quantred`, still
|
|
16
17
|
provides the `tradeflow` command (which runs QuantRed's command line), and ships a
|
|
@@ -190,7 +191,8 @@ A client entry written under the old name launches `tradeflow` or
|
|
|
190
191
|
installed, and stop once it is removed (Path B). An entry whose command is a path
|
|
191
192
|
*inside* the old tool's environment (for example
|
|
192
193
|
`.../uv/tools/tradeflow-engine/bin/tradeflow`) stops working as soon as that tool is
|
|
193
|
-
uninstalled.
|
|
194
|
+
uninstalled. From quantred 2.4.1, a launch through `python -m tradeflow.cli` no longer
|
|
195
|
+
prints a spurious "a pack imports the old name" warning.
|
|
194
196
|
|
|
195
197
|
To move a client across, run `quantred mcp --self-test` and paste the absolute command
|
|
196
198
|
and block it prints, which uses the key and command `quantred`. The server now reports
|
|
@@ -11,7 +11,7 @@ const config = {
|
|
|
11
11
|
// Served as its own site at the docs subdomain. `baseUrl` stays '/' because the
|
|
12
12
|
// docs own the whole (sub)domain root; it would only change if these were ever
|
|
13
13
|
// hosted under a path like mk-dir.com/docs.
|
|
14
|
-
url: 'https://
|
|
14
|
+
url: 'https://quantred.mk-dir.com',
|
|
15
15
|
baseUrl: '/',
|
|
16
16
|
|
|
17
17
|
// Broken internal links and anchors fail the build — the docs CI relies on this
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
2
|
+
"name": "quantred-docs",
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
|
-
"name": "
|
|
8
|
+
"name": "quantred-docs",
|
|
9
9
|
"version": "0.1.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@docusaurus/core": "^3.6.0",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "node_modules/wrangler/config-schema.json",
|
|
3
|
+
"name": "quantred",
|
|
4
|
+
// The docs domain is attached here rather than in the dashboard, so the deploy that
|
|
5
|
+
// creates this worker also claims its hostname (Cloudflare creates the DNS record).
|
|
6
|
+
// Needs the mk-dir.com zone in the deploying account and a token with Workers Routes
|
|
7
|
+
// and DNS edit on it, or the deploy fails at this step.
|
|
8
|
+
"routes": [{ "pattern": "quantred.mk-dir.com", "custom_domain": true }],
|
|
9
|
+
"compatibility_date": "2026-06-20",
|
|
10
|
+
"observability": {
|
|
11
|
+
"enabled": true
|
|
12
|
+
},
|
|
13
|
+
"assets": {
|
|
14
|
+
"directory": "build"
|
|
15
|
+
},
|
|
16
|
+
"compatibility_flags": [
|
|
17
|
+
"nodejs_compat"
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -200,7 +200,7 @@ one if they do.
|
|
|
200
200
|
|
|
201
201
|
## Then read
|
|
202
202
|
|
|
203
|
-
- [Your own strategies](https://
|
|
204
|
-
- [Run configs](https://
|
|
205
|
-
- [Validation diagnostics](https://
|
|
206
|
-
- [Extending](https://
|
|
203
|
+
- [Your own strategies](https://quantred.mk-dir.com/usage/private-strategies)
|
|
204
|
+
- [Run configs](https://quantred.mk-dir.com/usage/run-configs)
|
|
205
|
+
- [Validation diagnostics](https://quantred.mk-dir.com/usage/validation-diagnostics)
|
|
206
|
+
- [Extending](https://quantred.mk-dir.com/engineering/extending) — the interface reference
|
|
@@ -97,16 +97,16 @@ demo_volume = "quantred.demo.scanners:DemoVolumeScanner"
|
|
|
97
97
|
# have to be kept in agreement.
|
|
98
98
|
quantred = "quantred.cli:main"
|
|
99
99
|
# No `tradeflow` alias here. The previous command is provided by the final
|
|
100
|
-
# `tradeflow-engine` release (
|
|
100
|
+
# `tradeflow-engine` release (legacy/tradeflow-engine), which depends on this
|
|
101
101
|
# distribution: two distributions that both install `bin/tradeflow` would have the
|
|
102
102
|
# upgrade or uninstall of one delete the other's copy.
|
|
103
103
|
|
|
104
104
|
[project.urls]
|
|
105
|
-
Homepage = "https://
|
|
106
|
-
Documentation = "https://
|
|
105
|
+
Homepage = "https://quantred.mk-dir.com/"
|
|
106
|
+
Documentation = "https://quantred.mk-dir.com/"
|
|
107
107
|
Source = "https://github.com/makedirectory/quantred"
|
|
108
108
|
Issues = "https://github.com/makedirectory/quantred/issues"
|
|
109
|
-
Changelog = "https://
|
|
109
|
+
Changelog = "https://quantred.mk-dir.com/changelog"
|
|
110
110
|
|
|
111
111
|
[build-system]
|
|
112
112
|
requires = ["hatchling"]
|
|
@@ -144,7 +144,7 @@ exclude = [
|
|
|
144
144
|
"/docs/node_modules",
|
|
145
145
|
"/docs/build",
|
|
146
146
|
"/dist",
|
|
147
|
-
"/
|
|
147
|
+
"/legacy",
|
|
148
148
|
"*.csv",
|
|
149
149
|
"/.env",
|
|
150
150
|
]
|
|
@@ -199,6 +199,10 @@ def _entry_point_classes(group: str, base_cls: Type) -> Dict[str, Type]:
|
|
|
199
199
|
so a broken private package cannot make the public engine unusable.
|
|
200
200
|
"""
|
|
201
201
|
found: Dict[str, Type] = {}
|
|
202
|
+
# Whether the old name was already imported before any pack loaded: launching
|
|
203
|
+
# through it (`python -m tradeflow.cli`, the form old MCP client configs use) does
|
|
204
|
+
# that itself, and is not a pack using the old name.
|
|
205
|
+
old_name_already_loaded = _old_import_name_loaded()
|
|
202
206
|
for entry_point in _select_entry_points(group):
|
|
203
207
|
declared = getattr(entry_point, "group", None) or group
|
|
204
208
|
if _from_legacy_distribution(entry_point):
|
|
@@ -250,7 +254,7 @@ def _entry_point_classes(group: str, base_cls: Type) -> Dict[str, Type]:
|
|
|
250
254
|
)
|
|
251
255
|
continue
|
|
252
256
|
found[name] = cls
|
|
253
|
-
_warn_if_a_pack_imports_the_old_name()
|
|
257
|
+
_warn_if_a_pack_imports_the_old_name(already_loaded=old_name_already_loaded)
|
|
254
258
|
return found
|
|
255
259
|
|
|
256
260
|
|
|
@@ -269,16 +273,25 @@ def _from_legacy_distribution(entry_point: Any) -> bool:
|
|
|
269
273
|
_WARNED_OLD_IMPORT = False
|
|
270
274
|
|
|
271
275
|
|
|
272
|
-
def
|
|
273
|
-
"""
|
|
276
|
+
def _old_import_name_loaded() -> bool:
|
|
277
|
+
"""Whether the old import package (the alias `tradeflow-engine` 2.3.1 ships) is loaded."""
|
|
278
|
+
return "tradeflow" in sys.modules
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def _warn_if_a_pack_imports_the_old_name(already_loaded: bool) -> None:
|
|
282
|
+
"""Say once that a pack loaded through the ``tradeflow`` import alias.
|
|
274
283
|
|
|
275
284
|
The alias's ``DeprecationWarning`` is hidden by Python's default filters unless it
|
|
276
285
|
is raised from ``__main__``, so a pack loaded by entry point would use it silently
|
|
277
286
|
while the docs say it warns. Detected from the alias itself (its module and its
|
|
278
|
-
import finder are present) rather than from any one pack
|
|
287
|
+
import finder are present) rather than from any one pack, and only when the module
|
|
288
|
+
appeared while packs were loading: with ``already_loaded`` the process itself was
|
|
289
|
+
launched through the old name, and blaming a pack for that printed a false line on
|
|
290
|
+
every launch from an old MCP client config. Accepted blind spot: when the process
|
|
291
|
+
itself was launched through the old name, a pack that also imports it is not named.
|
|
279
292
|
"""
|
|
280
293
|
global _WARNED_OLD_IMPORT
|
|
281
|
-
if _WARNED_OLD_IMPORT or
|
|
294
|
+
if _WARNED_OLD_IMPORT or already_loaded or not _old_import_name_loaded():
|
|
282
295
|
return
|
|
283
296
|
if not any(type(finder).__name__ == "_AliasFinder" for finder in sys.meta_path):
|
|
284
297
|
return
|
|
@@ -70,7 +70,7 @@ MCP_SERVER_NAME = "quantred"
|
|
|
70
70
|
|
|
71
71
|
#: The documentation root. Pages are served from the site root (there is no ``/docs/``
|
|
72
72
|
#: prefix), so a link built from this constant and a page path is a page that exists.
|
|
73
|
-
DOCS_URL = "https://
|
|
73
|
+
DOCS_URL = "https://quantred.mk-dir.com"
|
|
74
74
|
#: Where the source lives: the one place an installed copy can get the example pack.
|
|
75
75
|
REPOSITORY_URL = "https://github.com/makedirectory/quantred"
|
|
76
76
|
|
|
@@ -70,6 +70,8 @@ fi
|
|
|
70
70
|
|
|
71
71
|
# 5. The volume is readable by the host user without sudo — mixed native/container
|
|
72
72
|
# work against one journal is certain, and a root-owned journal breaks it.
|
|
73
|
+
# The project name is pinned to `tradeflow` in docker-compose.yml, so this is the same
|
|
74
|
+
# name in every checkout directory.
|
|
73
75
|
VOLUME=$(docker volume inspect tradeflow_tradeflow-logs --format '{{.Mountpoint}}' 2>/dev/null || echo "")
|
|
74
76
|
if [[ -n "$VOLUME" ]]; then
|
|
75
77
|
pass "logs volume exists ($VOLUME)"
|
|
@@ -32,7 +32,7 @@ ALLOWED = {
|
|
|
32
32
|
("research/sandbox.py", "_guarded_import"): (
|
|
33
33
|
"compares an import's root module against the import package name"
|
|
34
34
|
),
|
|
35
|
-
("services/registry.py", "
|
|
35
|
+
("services/registry.py", "_old_import_name_loaded"): (
|
|
36
36
|
"looks for the old *import package* in sys.modules - the alias a pack loaded - "
|
|
37
37
|
"not the command a reader types"
|
|
38
38
|
),
|