# mdesgagnes/quant-backtest-studio architecture

> Architecture diagram of the GitHub repository mdesgagnes/quant-backtest-studio, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/mdesgagnes/quant-backtest-studio
- Repository: https://github.com/mdesgagnes/quant-backtest-studio

## Overview

Quant Backtest Studio is a Streamlit front end and standalone Python package for strategy backtests and price-based watchlist analysis. The main workflow loads Yahoo Finance or uploaded price data, builds signals and target weights, simulates execution and frictions, then analyses and exports results. Separate capabilities include imported-return analysis, exogenous signals, robustness checks, Canadian tax estimates, and Markets analytics. The graph reflects the documented workflow and sampled module responsibilities; app orchestration and several subsystem internals were not fully sampled, so uncertain call links are omitted.

Main entry points: [`app.py`](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/app.py) (Streamlit app), [`qbt/data.py`](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/data.py) (Price data), [`qbt/strategies/__init__.py`](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/strategies/__init__.py) (Strategy registry), [`qbt/strategies/library.py`](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/strategies/library.py) (Built-in strategies)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["User interface"]
  node_app["Streamlit app<br/>[app.py]"]
end

subgraph group_backtest["Backtest workflow"]
  node_data["Price data<br/>[data.py]"]
  node_external["Yahoo Finance<br/>[external.py]"]
  node_exog["Exogenous data<br/>[exog.py]"]
  node_strategy["Strategy registry<br/>[__init__.py]"]
  node_strategy_library["Built-in strategies<br/>[library.py]"]
  node_formula["Formula signals<br/>[formula.py]"]
  node_engine["Simulation engine<br/>[engine.py]"]
  node_costs["Trading frictions<br/>[costs.py]"]
  node_allocation["Portfolio allocation<br/>[allocation.py]"]
end

subgraph group_analysis["Analysis and reports"]
  node_returns_input["Imported returns<br/>[returns_input.py]"]
  node_metrics["Performance metrics<br/>[metrics.py]"]
  node_robustness["Robustness suite<br/>[robustness.py]"]
  node_stress["Stress analysis<br/>[stress.py]"]
  node_tax["Tax analysis<br/>[tax.py]"]
  node_charts["Backtest charts<br/>[charts.py]"]
  node_report["Reports and exports<br/>[full_report.py]"]
  node_excel["Workbook export<br/>[excel_export.py]"]
end

subgraph group_markets["Markets analytics"]
  node_monitor["Watchlist analytics<br/>[monitor.py]"]
  node_tvchart["Markets charts<br/>[tvchart.py]"]
end

node_user(("User"))
node_price_source(("CSV / Excel files"))
node_return_source(("Return files"))

node_user -->|"configures"| node_app
node_app -->|"requests prices"| node_data
node_data -->|"fetches prices"| node_external
node_price_source -->|"supplies prices"| node_data
node_app -->|"loads signals"| node_exog
node_app -->|"selects strategy"| node_strategy
node_strategy -->|"registers built-ins"| node_strategy_library
node_strategy_library -.->|"evaluates formulas"| node_formula
node_app -->|"runs simulation"| node_engine
node_app -->|"configures weights"| node_allocation
node_engine -->|"applies frictions"| node_costs
node_app -->|"requests statistics"| node_metrics
node_app -->|"runs checks"| node_robustness
node_app -->|"tests periods"| node_stress
node_app -->|"estimates taxes"| node_tax
node_app -->|"renders results"| node_charts
node_app -->|"builds report"| node_report
node_app -->|"exports workbook"| node_excel
node_return_source -->|"supplies returns"| node_returns_input
node_app -->|"analyses returns"| node_returns_input
node_app -->|"analyses watchlist"| node_monitor
node_monitor -->|"uses price data"| node_data
node_app -->|"renders Markets charts"| node_tvchart

click node_app "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/app.py"
click node_data "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/data.py"
click node_external "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/external.py"
click node_exog "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/exog.py"
click node_strategy "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/strategies/__init__.py"
click node_strategy_library "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/strategies/library.py"
click node_formula "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/formula.py"
click node_engine "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/engine.py"
click node_costs "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/costs.py"
click node_allocation "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/allocation.py"
click node_returns_input "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/returns_input.py"
click node_metrics "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/metrics.py"
click node_robustness "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/robustness.py"
click node_stress "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/stress.py"
click node_tax "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/tax.py"
click node_charts "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/charts.py"
click node_report "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/full_report.py"
click node_excel "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/excel_export.py"
click node_monitor "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/monitor.py"
click node_tvchart "https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/tvchart.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_user toneBlue
class node_data,node_external,node_exog,node_strategy,node_strategy_library,node_formula,node_engine,node_costs,node_allocation toneAmber
class node_returns_input,node_metrics,node_robustness,node_stress,node_tax,node_charts,node_report,node_excel toneMint
class node_monitor,node_tvchart toneRose
class node_price_source,node_return_source toneIndigo
```

## Components

### User interface

- [Streamlit app](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/app.py): `app.py`

### Backtest workflow

- [Price data](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/data.py): `qbt/data.py`
- [Yahoo Finance](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/external.py): `qbt/external.py`
- [Exogenous data](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/exog.py): `qbt/exog.py`
- [Strategy registry](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/strategies/__init__.py): `qbt/strategies/__init__.py`
- [Built-in strategies](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/strategies/library.py): `qbt/strategies/library.py`
- [Formula signals](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/formula.py): `qbt/formula.py`
- [Simulation engine](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/engine.py): `qbt/engine.py`
- [Trading frictions](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/costs.py): `qbt/costs.py`
- [Portfolio allocation](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/allocation.py): `qbt/allocation.py`

### Analysis and reports

- [Imported returns](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/returns_input.py): `qbt/returns_input.py`
- [Performance metrics](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/metrics.py): `qbt/metrics.py`
- [Robustness suite](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/robustness.py): `qbt/robustness.py`
- [Stress analysis](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/stress.py): `qbt/stress.py`
- [Tax analysis](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/tax.py): `qbt/tax.py`
- [Backtest charts](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/charts.py): `qbt/charts.py`
- [Reports and exports](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/full_report.py): `qbt/full_report.py`
- [Workbook export](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/excel_export.py): `qbt/excel_export.py`

### Markets analytics

- [Watchlist analytics](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/monitor.py): `qbt/monitor.py`
- [Markets charts](https://github.com/mdesgagnes/quant-backtest-studio/blob/main/qbt/tvchart.py): `qbt/tvchart.py`

### Other components

- **User**
- **CSV / Excel files**
- **Return files**

## Connections

- User → Streamlit app: configures
- Streamlit app → Price data: requests prices
- Price data → Yahoo Finance: fetches prices
- CSV / Excel files → Price data: supplies prices
- Streamlit app → Exogenous data: loads signals
- Streamlit app → Strategy registry: selects strategy
- Strategy registry → Built-in strategies: registers built-ins
- Built-in strategies → Formula signals: evaluates formulas
- Streamlit app → Simulation engine: runs simulation
- Streamlit app → Portfolio allocation: configures weights
- Simulation engine → Trading frictions: applies frictions
- Streamlit app → Performance metrics: requests statistics
- Streamlit app → Robustness suite: runs checks
- Streamlit app → Stress analysis: tests periods
- Streamlit app → Tax analysis: estimates taxes
- Streamlit app → Backtest charts: renders results
- Streamlit app → Reports and exports: builds report
- Streamlit app → Workbook export: exports workbook
- Return files → Imported returns: supplies returns
- Streamlit app → Imported returns: analyses returns
- Streamlit app → Watchlist analytics: analyses watchlist
- Watchlist analytics → Price data: uses price data
- Streamlit app → Markets charts: renders Markets charts
