roboquant 2.1.2__tar.gz → 2.2.0__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.
- {roboquant-2.1.2 → roboquant-2.2.0}/.github/workflows/verify.yml +3 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/LICENSE +1 -1
- {roboquant-2.1.2 → roboquant-2.2.0}/PKG-INFO +20 -20
- {roboquant-2.1.2 → roboquant-2.2.0}/README.md +13 -14
- roboquant-2.2.0/docs/DESIGN.md +85 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/pyproject.toml +3 -2
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/__init__.py +2 -3
- roboquant-2.2.0/roboquant/ai/__init__.py +6 -0
- {roboquant-2.1.2/roboquant/ml → roboquant-2.2.0/roboquant/ai}/features.py +1 -1
- {roboquant-2.1.2/roboquant/ml → roboquant-2.2.0/roboquant/ai}/rl.py +2 -2
- {roboquant-2.1.2/roboquant/ml → roboquant-2.2.0/roboquant/ai}/strategies.py +1 -1
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/brokers/broker.py +2 -2
- roboquant-2.2.0/roboquant/crypto/__init__.py +3 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/integration/test_ccxt.py +1 -1
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/crypto_backtest.py +1 -1
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/sb3_strategy.py +2 -2
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/sb3_strategy_quotes.py +2 -2
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/talib_feature.py +1 -1
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/talib_strategy.py +0 -1
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/torch_lstm.py +2 -2
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/torch_transformer.py +2 -2
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_features.py +1 -1
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_rnn.py +2 -2
- {roboquant-2.1.2 → roboquant-2.2.0}/uv.lock +70 -15
- roboquant-2.1.2/docs/DESIGN.md +0 -0
- roboquant-2.1.2/tests/unit/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/.gitignore +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/.vscode/settings.json +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/.zed/settings.json +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/.zed/tasks.json +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/bin/local_install.sh +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/bin/publish.sh +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/bin/verify.sh +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/docs/roboquant_header.png +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/account.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/alpaca/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/alpaca/broker.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/alpaca/feed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/asset.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/brokers/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/brokers/simbroker.py +0 -0
- {roboquant-2.1.2/roboquant/brokers → roboquant-2.2.0/roboquant/crypto}/cryptobroker.py +0 -0
- {roboquant-2.1.2/roboquant/feeds → roboquant-2.2.0/roboquant/crypto}/cryptofeed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/event.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/csvfeed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/feed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/historic.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/live.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/parquet.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/randomwalk.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/resources/us10.parquet +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/sql.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/util.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/yahoo.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/ibkr/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/ibkr/broker.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/ibkr/types.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/alphabeta.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/basicjournal.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/feedmetric.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/journal.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/marketmetric.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/metric.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/metricsjournal.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/pnlmetric.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/pricemetric.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/runmetric.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/scorecard.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/tensorboard.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/monetary.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/order.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/run.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/signal.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/buffer.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/cachedstrategy.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/emacrossover.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/ibsstrategy.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/multistrategy.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/strategy.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/tastrategy.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/ta/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/timeframe.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/traders/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/traders/flextrader.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/traders/trader.py +0 -0
- {roboquant-2.1.2/roboquant/ml → roboquant-2.2.0/tests}/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/common.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/stooq/5_min/ibm.us.txt +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/stooq/daily/ibm.us.txt +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/yahoo/AAPL.csv +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/yahoo/AMZN.csv +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/yahoo/META.csv +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/yahoo/TSLA.csv +0 -0
- {roboquant-2.1.2/tests → roboquant-2.2.0/tests/integration}/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/integration/test_alpaca.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/integration/test_ibkr.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/integration/test_yahoo.py +0 -0
- {roboquant-2.1.2/tests/integration → roboquant-2.2.0/tests/performance}/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/performance/test_bigfeed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/performance/test_delay.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/performance/test_profiling.py +0 -0
- {roboquant-2.1.2/tests/performance → roboquant-2.2.0/tests/samples}/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_forwardtest_bars.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_forwardtest_trades.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_live_feed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_papertrade.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_record.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/charts.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/chronos_prediction.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/extra_logging.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/ibkr_close_positions.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/monetary.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/pandas_dataframe.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/parquet_csv.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/parquet_csv_large.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/parquet_yahoo.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/tensorboard_metrics.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/yahoo_backtest.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/yahoo_walkforward.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/yahoo_walkforward_multiprocess.py +0 -0
- {roboquant-2.1.2/tests/samples → roboquant-2.2.0/tests/unit}/__init__.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_account.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_asset.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_buffer.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_csvfeed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_feedutil.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_journal.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_monetary.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_order.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_parquetfeed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_randomwalk.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_run.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_signal.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_simbroker.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_sqlfeed.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_strategy.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_tastrategy.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_tensorboard.py +0 -0
- {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_timeframe.py +0 -0
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
|
187
187
|
identification within third-party archives.
|
|
188
188
|
|
|
189
|
-
Copyright 2024, 2025 Neural Layer
|
|
189
|
+
Copyright 2024, 2025, 2026 Neural Layer
|
|
190
190
|
|
|
191
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
192
|
you may not use this file except in compliance with the License.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: roboquant
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: A fast algorithmic trading platform with support for AI based strategies
|
|
5
5
|
Project-URL: Homepage, https://roboquant.org
|
|
6
6
|
Project-URL: Repository, https://github.com/neurallayer/roboquant.py.git
|
|
@@ -25,27 +25,28 @@ Requires-Python: <3.15,>=3.12
|
|
|
25
25
|
Requires-Dist: numpy>2.0.0
|
|
26
26
|
Requires-Dist: pyarrow>24.0.0
|
|
27
27
|
Requires-Dist: requests>2.30.0
|
|
28
|
+
Requires-Dist: ta-lib==0.6.5
|
|
28
29
|
Requires-Dist: yfinance>1.5.0
|
|
30
|
+
Provides-Extra: ai
|
|
31
|
+
Requires-Dist: sb3-contrib>=2.9.0; extra == 'ai'
|
|
32
|
+
Requires-Dist: stable-baselines3>=2.9.0; extra == 'ai'
|
|
33
|
+
Requires-Dist: tensorboard>=2.21.0; extra == 'ai'
|
|
34
|
+
Requires-Dist: torch>=2.9.0; extra == 'ai'
|
|
29
35
|
Provides-Extra: alpaca
|
|
30
36
|
Requires-Dist: alpaca-py>=0.43.5; extra == 'alpaca'
|
|
31
37
|
Provides-Extra: crypto
|
|
32
38
|
Requires-Dist: ccxt>=4.5.65; extra == 'crypto'
|
|
33
39
|
Provides-Extra: ibkr
|
|
34
40
|
Requires-Dist: ibind[oauth]>=0.1.22; extra == 'ibkr'
|
|
35
|
-
Provides-Extra: torch
|
|
36
|
-
Requires-Dist: sb3-contrib>=2.9.0; extra == 'torch'
|
|
37
|
-
Requires-Dist: stable-baselines3>=2.9.0; extra == 'torch'
|
|
38
|
-
Requires-Dist: tensorboard>=2.21.0; extra == 'torch'
|
|
39
|
-
Requires-Dist: torch>=2.9.0; extra == 'torch'
|
|
40
41
|
Description-Content-Type: text/markdown
|
|
41
42
|
|
|
42
43
|
|
|
43
44
|
# 
|
|
44
45
|
|
|
45
|
-

|
|
46
|
-

|
|
47
|
-

|
|
48
|
-

|
|
46
|
+

|
|
47
|
+

|
|
48
|
+

|
|
49
|
+

|
|
49
50
|

|
|
50
51
|
[](https://discord.com/channels/954650958300856340/954650958300856343)
|
|
51
52
|
|
|
@@ -67,28 +68,27 @@ print(account)
|
|
|
67
68
|
|
|
68
69
|
## Install
|
|
69
70
|
Roboquant can be installed like most other Python packages, using tools like `uv`, `pip` or `conda`.
|
|
70
|
-
Make sure you have Python version 3.
|
|
71
|
+
Make sure you have Python version 3.12 or higher installed.
|
|
71
72
|
|
|
72
73
|
```shell
|
|
73
74
|
python3 -m pip install --upgrade roboquant
|
|
74
75
|
```
|
|
75
76
|
|
|
76
|
-
The core of roboquant limits the number of dependencies.
|
|
77
|
-
But you can install roboquant including one or more of the optional dependencies if you require certain functionality:
|
|
77
|
+
The core of roboquant limits the number of dependencies. But you can install roboquant including one or more of the optional dependencies if you require certain additional functionality:
|
|
78
78
|
|
|
79
79
|
```shell
|
|
80
|
-
#
|
|
81
|
-
python3 -m pip install --upgrade "roboquant[
|
|
80
|
+
# AI based strategies using Torch and SB3
|
|
81
|
+
python3 -m pip install --upgrade "roboquant[ai]"
|
|
82
82
|
|
|
83
|
-
# Integration with Interactive Brokers
|
|
83
|
+
# Integration with Interactive Brokers
|
|
84
84
|
python3 -m pip install --upgrade "roboquant[ibkr]"
|
|
85
85
|
|
|
86
|
-
# Integration with Alpaca
|
|
86
|
+
# Integration with Alpaca broker
|
|
87
87
|
python3 -m pip install --upgrade "roboquant[alpaca]"
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Additionally, if you want to use the any of TA-Lib techncial indicators, you'll need to install it first. You can read a more about that on [ta-lib-python GitHub](https://github.com/ta-lib/ta-lib-python)
|
|
91
88
|
|
|
89
|
+
# Integration many crypto exchanges via CCXT package
|
|
90
|
+
python3 -m pip install --upgrade "roboquant[crypto]"
|
|
91
|
+
```
|
|
92
92
|
|
|
93
93
|
## Building from source
|
|
94
94
|
Roboquant.py uses `uv` as the main tool for handling package dependencies.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
|
|
2
2
|
# 
|
|
3
3
|
|
|
4
|
-

|
|
5
|
-

|
|
6
|
-

|
|
7
|
-

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
8
|

|
|
9
9
|
[](https://discord.com/channels/954650958300856340/954650958300856343)
|
|
10
10
|
|
|
@@ -26,28 +26,27 @@ print(account)
|
|
|
26
26
|
|
|
27
27
|
## Install
|
|
28
28
|
Roboquant can be installed like most other Python packages, using tools like `uv`, `pip` or `conda`.
|
|
29
|
-
Make sure you have Python version 3.
|
|
29
|
+
Make sure you have Python version 3.12 or higher installed.
|
|
30
30
|
|
|
31
31
|
```shell
|
|
32
32
|
python3 -m pip install --upgrade roboquant
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
The core of roboquant limits the number of dependencies.
|
|
36
|
-
But you can install roboquant including one or more of the optional dependencies if you require certain functionality:
|
|
35
|
+
The core of roboquant limits the number of dependencies. But you can install roboquant including one or more of the optional dependencies if you require certain additional functionality:
|
|
37
36
|
|
|
38
37
|
```shell
|
|
39
|
-
#
|
|
40
|
-
python3 -m pip install --upgrade "roboquant[
|
|
38
|
+
# AI based strategies using Torch and SB3
|
|
39
|
+
python3 -m pip install --upgrade "roboquant[ai]"
|
|
41
40
|
|
|
42
|
-
# Integration with Interactive Brokers
|
|
41
|
+
# Integration with Interactive Brokers
|
|
43
42
|
python3 -m pip install --upgrade "roboquant[ibkr]"
|
|
44
43
|
|
|
45
|
-
# Integration with Alpaca
|
|
44
|
+
# Integration with Alpaca broker
|
|
46
45
|
python3 -m pip install --upgrade "roboquant[alpaca]"
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Additionally, if you want to use the any of TA-Lib techncial indicators, you'll need to install it first. You can read a more about that on [ta-lib-python GitHub](https://github.com/ta-lib/ta-lib-python)
|
|
50
46
|
|
|
47
|
+
# Integration many crypto exchanges via CCXT package
|
|
48
|
+
python3 -m pip install --upgrade "roboquant[crypto]"
|
|
49
|
+
```
|
|
51
50
|
|
|
52
51
|
## Building from source
|
|
53
52
|
Roboquant.py uses `uv` as the main tool for handling package dependencies.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Design Principles
|
|
2
|
+
|
|
3
|
+
## Modular Pipeline Architecture
|
|
4
|
+
|
|
5
|
+
The library is built around a clean separation of five orthogonal concerns:
|
|
6
|
+
|
|
7
|
+
| Component | Responsibility | Has access to Account? |
|
|
8
|
+
|-----------|---------------|----------------------|
|
|
9
|
+
| **Feed** | Provides market data events | No |
|
|
10
|
+
| **Strategy** | Generates trading signals from events | No |
|
|
11
|
+
| **Trader** | Converts signals into orders (risk/sizing) | Yes |
|
|
12
|
+
| **Broker** | Executes orders, maintains account state | Yes (owns Account) |
|
|
13
|
+
| **Journal** | Logs/tracks every step (read-only) | Read-only snapshot |
|
|
14
|
+
|
|
15
|
+
Each component is an abstract base class with pluggable implementations, making every part of the pipeline independently swappable.
|
|
16
|
+
|
|
17
|
+
## The Run Loop
|
|
18
|
+
|
|
19
|
+
The core of the system is the `roboquant.run()` function, which connects all components in a streaming event loop:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
for each event in feed.play(timeframe):
|
|
23
|
+
1. broker.sync(event) — update account, execute fills
|
|
24
|
+
2. strategy.create_signals(event) — generate signals from market data
|
|
25
|
+
3. trader.create_orders(signals, ...) — apply risk rules, produce orders
|
|
26
|
+
4. broker.place_orders(orders) — submit orders to the broker
|
|
27
|
+
5. journal.track(event, account, ...) — record metrics (optional)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Step-by-step
|
|
31
|
+
|
|
32
|
+
1. **`broker.sync(event)`** — Updates the account with the latest market data. Open orders from previous steps are tested against prices and executed if conditions are met. No look-ahead bias: orders placed at time `t` only execute at time `t+1`.
|
|
33
|
+
|
|
34
|
+
2. **`strategy.create_signals(event)`** — The strategy examines the event's price data and returns a list of `Signal` objects. Each signal has an asset, a rating (typically -1.0 to 1.0), and a type (`ENTRY`, `EXIT`, or `ENTRY_EXIT`). Strategies are **pure decision-makers** — they know nothing about cash, positions, or risk.
|
|
35
|
+
|
|
36
|
+
3. **`trader.create_orders(signals, event, account)`** — The trader applies risk management rules (position sizing, shorting constraints, order limits) and converts signals into concrete `Order` objects. Unlike strategies, traders **have full access to the Account** (cash, positions, buying power).
|
|
37
|
+
|
|
38
|
+
4. **`broker.place_orders(orders)`** — New orders are submitted to the broker. In `SimBroker`, they are stored and evaluated for execution when the next event arrives.
|
|
39
|
+
|
|
40
|
+
5. **`journal.track(...)`** — Optional logging and metrics collection. Journals are passive observers that never modify state.
|
|
41
|
+
|
|
42
|
+
## Minimal Backtest
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
import roboquant as rq
|
|
46
|
+
|
|
47
|
+
feed = rq.feeds.YahooFeed("JPM", "IBM", start_date="2015-01-01")
|
|
48
|
+
account = rq.run(feed, rq.strategies.EMACrossover())
|
|
49
|
+
print(account)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
This works because `run()` provides sensible defaults: `SimBroker` (USD 1M deposit, 0% slippage) and `FlexTrader` (conservative position sizing).
|
|
53
|
+
|
|
54
|
+
## Custom Backtest
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
feed = rq.feeds.YahooFeed("AAPL", "MSFT", start_date="2020-01-01")
|
|
58
|
+
strategy = rq.strategies.EMACrossover()
|
|
59
|
+
trader = rq.traders.FlexTrader(max_order_perc=0.1, shorting=True)
|
|
60
|
+
broker = rq.brokers.SimBroker(deposit=500_000)
|
|
61
|
+
journal = rq.journals.MetricsJournal()
|
|
62
|
+
|
|
63
|
+
account = rq.run(feed, strategy, trader=trader, broker=broker, journal=journal)
|
|
64
|
+
print(account)
|
|
65
|
+
print(journal.metrics())
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Strategy/Trader Separation
|
|
69
|
+
|
|
70
|
+
This is the most important design choice in the library:
|
|
71
|
+
|
|
72
|
+
- **Strategies** produce signals from market data only. They implement `create_signals(event) -> list[Signal]` and have no access to account state. This keeps them pure, testable, and reusable across any trader configuration.
|
|
73
|
+
- **Traders** implement `create_orders(signals, event, account) -> list[Order]` and are responsible for risk management, position sizing, and order construction. They know nothing about indicators or market data beyond what is in the signal.
|
|
74
|
+
|
|
75
|
+
Example: The same `EMACrossover` strategy can be used with a conservative trader (2% max order) in backtesting and a different trader (20% max order, shorting enabled) in live trading — without changing a line of strategy code.
|
|
76
|
+
|
|
77
|
+
## Key Principles
|
|
78
|
+
|
|
79
|
+
- **Event-driven streaming** — Everything is built around `Event` objects produced lazily by feeds, supporting both backtesting and live trading with the same pipeline.
|
|
80
|
+
- **Broker owns the Account** — The Account is never modified directly by user code; it is always the broker's canonical view returned by `sync()`.
|
|
81
|
+
- **Default-everywhere** — `roboquant.run(feed, strategy)` works out of the box with sensible defaults, making the simplest case a one-liner.
|
|
82
|
+
- **Immutable core types** — `Asset`, `Signal`, and `Event` are immutable; `Order` uses `cancel()`/`modify()` returning new objects.
|
|
83
|
+
- **Strategy composition** — `MultiStrategy` combines multiple strategies with configurable conflict resolution (`first`, `last`, `mean`, `none`).
|
|
84
|
+
- **Pluggable pricing** — Price type strings (`"OPEN"`, `"CLOSE"`, `"HIGH"`, `"LOW"`, `"DEFAULT"`) allow strategies and traders to choose which price to use for evaluation.
|
|
85
|
+
- **Multi-currency** — Built-in support via `Amount`, `Wallet`, and pluggable `CurrencyConverter` (ECB, static, one-to-one).
|
|
@@ -56,10 +56,11 @@ dependencies = [
|
|
|
56
56
|
"requests>2.30.0",
|
|
57
57
|
"yfinance>1.5.0",
|
|
58
58
|
"pyarrow>24.0.0",
|
|
59
|
+
"ta-lib==0.6.5"
|
|
59
60
|
]
|
|
60
61
|
|
|
61
62
|
[project.optional-dependencies]
|
|
62
|
-
|
|
63
|
+
ai = [
|
|
63
64
|
"torch>=2.9.0",
|
|
64
65
|
"tensorboard>=2.21.0",
|
|
65
66
|
"stable-baselines3>=2.9.0",
|
|
@@ -83,4 +84,4 @@ dev = [
|
|
|
83
84
|
"ipywidgets>=8.1.6",
|
|
84
85
|
"chronos-forecasting>=2.3.1",
|
|
85
86
|
]
|
|
86
|
-
talib = ["ta-lib==0.6.
|
|
87
|
+
talib = ["ta-lib==0.6.5"]
|
|
@@ -3,7 +3,7 @@ The `roboquant` package contains the `run` method and a number of shared classes
|
|
|
3
3
|
like `Account`, `Asset` and `Event`.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
__version__ = "2.
|
|
6
|
+
__version__ = "2.2.0"
|
|
7
7
|
|
|
8
8
|
import logging
|
|
9
9
|
|
|
@@ -12,7 +12,7 @@ from roboquant import feeds
|
|
|
12
12
|
from roboquant import journals
|
|
13
13
|
from roboquant import strategies
|
|
14
14
|
from roboquant import traders
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
from .account import Account, Position
|
|
17
17
|
from .event import Event, PriceItem, Bar, TradePrice, Quote
|
|
18
18
|
from .signal import Signal, SignalType
|
|
@@ -31,7 +31,6 @@ __all__ = [
|
|
|
31
31
|
"journals",
|
|
32
32
|
"strategies",
|
|
33
33
|
"traders",
|
|
34
|
-
"ml",
|
|
35
34
|
"Account",
|
|
36
35
|
"Position",
|
|
37
36
|
"Event",
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""roboquant.ai package.
|
|
2
|
+
Provides a number of AI related classes and methods to support the development of AI based trading strategies.
|
|
3
|
+
It relies on Stable Baselines3 for reinforcement learning and PyTorch for deep learning.
|
|
4
|
+
|
|
5
|
+
The package provides also several features to support the development of AI based trading strategies.
|
|
6
|
+
"""
|
|
@@ -18,7 +18,7 @@ FloatArray = NDArray[np.float32]
|
|
|
18
18
|
class Feature(Generic[T]):
|
|
19
19
|
"""Base class for different types of features.
|
|
20
20
|
The ones included by default are either based either an `Event` or an `Account`.
|
|
21
|
-
Typically Event features are used for input and Account features are used for label/output."""
|
|
21
|
+
Typically Event features are used for input and Account features are used for reward/label/output."""
|
|
22
22
|
|
|
23
23
|
@abstractmethod
|
|
24
24
|
def calc(self, value: T) -> FloatArray:
|
|
@@ -15,7 +15,7 @@ from roboquant.brokers.simbroker import SimBroker
|
|
|
15
15
|
from roboquant.event import Event
|
|
16
16
|
from roboquant.feeds.feed import Feed
|
|
17
17
|
from roboquant.journals.journal import Journal
|
|
18
|
-
from roboquant.
|
|
18
|
+
from roboquant.ai.features import Feature
|
|
19
19
|
from roboquant.signal import Signal
|
|
20
20
|
from roboquant.strategies.strategy import Strategy
|
|
21
21
|
from roboquant.timeframe import Timeframe
|
|
@@ -23,7 +23,7 @@ from roboquant.traders.flextrader import FlexTrader
|
|
|
23
23
|
from roboquant.traders.trader import Trader
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
register(id="roboquant/StrategyEnv-v0", entry_point="roboquant.
|
|
26
|
+
register(id="roboquant/StrategyEnv-v0", entry_point="roboquant.ai.envs:StrategyEnv")
|
|
27
27
|
logger = logging.getLogger(__name__)
|
|
28
28
|
|
|
29
29
|
|
|
@@ -11,7 +11,7 @@ from torch.utils.data import DataLoader, Dataset
|
|
|
11
11
|
|
|
12
12
|
from roboquant.asset import Asset
|
|
13
13
|
from roboquant.event import Event
|
|
14
|
-
from roboquant.
|
|
14
|
+
from roboquant.ai.features import Feature, NormalizeFeature
|
|
15
15
|
from roboquant.signal import Signal
|
|
16
16
|
from roboquant.strategies.strategy import Strategy
|
|
17
17
|
|
|
@@ -148,11 +148,11 @@ class LiveBroker(Broker):
|
|
|
148
148
|
"""
|
|
149
149
|
order = Order(
|
|
150
150
|
asset=asset,
|
|
151
|
-
size=-Decimal(size),
|
|
151
|
+
size=-Decimal(size), # Negative size for sell orders
|
|
152
152
|
limit=float(limit),
|
|
153
153
|
tif=tif,
|
|
154
154
|
)
|
|
155
|
-
order.fill = - Decimal(fill)
|
|
155
|
+
order.fill = - Decimal(fill) # Negative fill for sell orders
|
|
156
156
|
order.id = str(id)
|
|
157
157
|
return order
|
|
158
158
|
|
|
@@ -3,8 +3,8 @@ from sb3_contrib import RecurrentPPO
|
|
|
3
3
|
from sb3_contrib.common.recurrent.policies import RecurrentActorCriticPolicy
|
|
4
4
|
from roboquant import run
|
|
5
5
|
from roboquant.feeds.yahoo import YahooFeed
|
|
6
|
-
from roboquant.
|
|
7
|
-
from roboquant.
|
|
6
|
+
from roboquant.ai.features import BarFeature, EquityFeature, CombinedFeature, SMAFeature, PriceFeature
|
|
7
|
+
from roboquant.ai.rl import TradingEnv, SB3PolicyStrategy
|
|
8
8
|
|
|
9
9
|
# %%
|
|
10
10
|
symbols = ["IBM", "JPM", "MSFT", "BA"]
|
|
@@ -4,8 +4,8 @@ from sb3_contrib import RecurrentPPO
|
|
|
4
4
|
from roboquant import run
|
|
5
5
|
from roboquant.alpaca.feed import AlpacaHistoricStockFeed
|
|
6
6
|
from roboquant.asset import Stock
|
|
7
|
-
from roboquant.
|
|
8
|
-
from roboquant.
|
|
7
|
+
from roboquant.ai.features import EquityFeature, QuoteFeature
|
|
8
|
+
from roboquant.ai.rl import TradingEnv, SB3PolicyStrategy
|
|
9
9
|
from roboquant.timeframe import Timeframe
|
|
10
10
|
from dotenv import load_dotenv
|
|
11
11
|
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
# from the TaLib library. The strategy combines the Relative Strength Index (RSI) and Bollinger Bands
|
|
4
4
|
|
|
5
5
|
# %%
|
|
6
|
-
# Make sure ta-lib 0.6.4 or higher is installed before running this sample
|
|
7
6
|
import roboquant.ta as ta
|
|
8
7
|
import roboquant as rq
|
|
9
8
|
from roboquant.strategies import OHLCVBuffer, TaStrategy
|
|
@@ -6,8 +6,8 @@ import torch.nn.functional as F
|
|
|
6
6
|
import roboquant as rq
|
|
7
7
|
from roboquant.asset import Stock
|
|
8
8
|
from roboquant.journals.basicjournal import BasicJournal
|
|
9
|
-
from roboquant.
|
|
10
|
-
from roboquant.
|
|
9
|
+
from roboquant.ai.features import BarFeature, CombinedFeature, MaxReturnFeature, PriceFeature, SMAFeature
|
|
10
|
+
from roboquant.ai.strategies import TimeSeriesStrategy, logger
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
# %%
|
|
@@ -6,8 +6,8 @@ from torch import nn
|
|
|
6
6
|
import roboquant as rq
|
|
7
7
|
from roboquant.asset import Stock
|
|
8
8
|
from roboquant.journals.basicjournal import BasicJournal
|
|
9
|
-
from roboquant.
|
|
10
|
-
from roboquant.
|
|
9
|
+
from roboquant.ai.features import BarFeature, CombinedFeature, MaxReturnFeature, PriceFeature, SMAFeature, DayOfMonthFeature
|
|
10
|
+
from roboquant.ai.strategies import TimeSeriesStrategy, logger
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
# %%
|
|
@@ -6,8 +6,8 @@ import numpy as np
|
|
|
6
6
|
|
|
7
7
|
import roboquant as rq
|
|
8
8
|
from roboquant.asset import Stock
|
|
9
|
-
from roboquant.
|
|
10
|
-
from roboquant.
|
|
9
|
+
from roboquant.ai.features import BarFeature, CombinedFeature, PriceFeature, SMAFeature
|
|
10
|
+
from roboquant.ai.strategies import TimeSeriesStrategy, SequenceDataset
|
|
11
11
|
from tests.common import get_feed
|
|
12
12
|
|
|
13
13
|
|
|
@@ -249,6 +249,20 @@ wheels = [
|
|
|
249
249
|
{ url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 },
|
|
250
250
|
]
|
|
251
251
|
|
|
252
|
+
[[package]]
|
|
253
|
+
name = "build"
|
|
254
|
+
version = "1.5.1"
|
|
255
|
+
source = { registry = "https://pypi.org/simple" }
|
|
256
|
+
dependencies = [
|
|
257
|
+
{ name = "colorama", marker = "(os_name == 'nt' and platform_machine != 'aarch64' and sys_platform == 'linux') or (os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux')" },
|
|
258
|
+
{ name = "packaging" },
|
|
259
|
+
{ name = "pyproject-hooks" },
|
|
260
|
+
]
|
|
261
|
+
sdist = { url = "https://files.pythonhosted.org/packages/2d/21/6ec54248b4d0d51f12f3ca4aa77a128077d747a5db86cb5a2fcd9aedecbd/build-1.5.1.tar.gz", hash = "sha256:94e17f1db803ab22f46049376c44c8437c52090f0dfdf1adc43df56542d644fb", size = 112439 }
|
|
262
|
+
wheels = [
|
|
263
|
+
{ url = "https://files.pythonhosted.org/packages/c7/f7/2c3f99ff9282f1c1ec9f6298f2c03034658a0901eeacb3b3501cb488574c/build-1.5.1-py3-none-any.whl", hash = "sha256:f1a58fe2e5af5b0238a07b9e70207492c79ddebbdb1ad954fc86d62a56be3e0d", size = 31195 },
|
|
264
|
+
]
|
|
265
|
+
|
|
252
266
|
[[package]]
|
|
253
267
|
name = "ccxt"
|
|
254
268
|
version = "4.5.65"
|
|
@@ -1868,6 +1882,15 @@ wheels = [
|
|
|
1868
1882
|
{ url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 },
|
|
1869
1883
|
]
|
|
1870
1884
|
|
|
1885
|
+
[[package]]
|
|
1886
|
+
name = "pip"
|
|
1887
|
+
version = "26.1.2"
|
|
1888
|
+
source = { registry = "https://pypi.org/simple" }
|
|
1889
|
+
sdist = { url = "https://files.pythonhosted.org/packages/01/91/47e7d486260f618783899587af63ccf7980fb60245c3e63dd4571c6b57ad/pip-26.1.2.tar.gz", hash = "sha256:f49cd134c61cf2fd75e0ce2676db03e4054504a5a4986d00f8299ae632dc4605", size = 1840799 }
|
|
1890
|
+
wheels = [
|
|
1891
|
+
{ url = "https://files.pythonhosted.org/packages/5d/95/6b5cb3461ea5673ba0995989746db58eb18b91b54dbf331e72f569540946/pip-26.1.2-py3-none-any.whl", hash = "sha256:382ff9f685ee3bc25864f820aa50505825f10f5458ffff07e30a6d96e5715cab", size = 1813144 },
|
|
1892
|
+
]
|
|
1893
|
+
|
|
1871
1894
|
[[package]]
|
|
1872
1895
|
name = "platformdirs"
|
|
1873
1896
|
version = "4.3.6"
|
|
@@ -2224,6 +2247,15 @@ wheels = [
|
|
|
2224
2247
|
{ url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 },
|
|
2225
2248
|
]
|
|
2226
2249
|
|
|
2250
|
+
[[package]]
|
|
2251
|
+
name = "pyproject-hooks"
|
|
2252
|
+
version = "1.2.0"
|
|
2253
|
+
source = { registry = "https://pypi.org/simple" }
|
|
2254
|
+
sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228 }
|
|
2255
|
+
wheels = [
|
|
2256
|
+
{ url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216 },
|
|
2257
|
+
]
|
|
2258
|
+
|
|
2227
2259
|
[[package]]
|
|
2228
2260
|
name = "pyright"
|
|
2229
2261
|
version = "1.1.411"
|
|
@@ -2423,10 +2455,17 @@ dependencies = [
|
|
|
2423
2455
|
{ name = "numpy" },
|
|
2424
2456
|
{ name = "pyarrow" },
|
|
2425
2457
|
{ name = "requests" },
|
|
2458
|
+
{ name = "ta-lib" },
|
|
2426
2459
|
{ name = "yfinance" },
|
|
2427
2460
|
]
|
|
2428
2461
|
|
|
2429
2462
|
[package.optional-dependencies]
|
|
2463
|
+
ai = [
|
|
2464
|
+
{ name = "sb3-contrib" },
|
|
2465
|
+
{ name = "stable-baselines3" },
|
|
2466
|
+
{ name = "tensorboard" },
|
|
2467
|
+
{ name = "torch" },
|
|
2468
|
+
]
|
|
2430
2469
|
alpaca = [
|
|
2431
2470
|
{ name = "alpaca-py" },
|
|
2432
2471
|
]
|
|
@@ -2436,12 +2475,6 @@ crypto = [
|
|
|
2436
2475
|
ibkr = [
|
|
2437
2476
|
{ name = "ibind", extra = ["oauth"] },
|
|
2438
2477
|
]
|
|
2439
|
-
torch = [
|
|
2440
|
-
{ name = "sb3-contrib" },
|
|
2441
|
-
{ name = "stable-baselines3" },
|
|
2442
|
-
{ name = "tensorboard" },
|
|
2443
|
-
{ name = "torch" },
|
|
2444
|
-
]
|
|
2445
2478
|
|
|
2446
2479
|
[package.dev-dependencies]
|
|
2447
2480
|
dev = [
|
|
@@ -2464,13 +2497,14 @@ requires-dist = [
|
|
|
2464
2497
|
{ name = "numpy", specifier = ">2.0.0" },
|
|
2465
2498
|
{ name = "pyarrow", specifier = ">24.0.0" },
|
|
2466
2499
|
{ name = "requests", specifier = ">2.30.0" },
|
|
2467
|
-
{ name = "sb3-contrib", marker = "extra == '
|
|
2468
|
-
{ name = "stable-baselines3", marker = "extra == '
|
|
2469
|
-
{ name = "
|
|
2470
|
-
{ name = "
|
|
2500
|
+
{ name = "sb3-contrib", marker = "extra == 'ai'", specifier = ">=2.9.0" },
|
|
2501
|
+
{ name = "stable-baselines3", marker = "extra == 'ai'", specifier = ">=2.9.0" },
|
|
2502
|
+
{ name = "ta-lib", specifier = "==0.6.5" },
|
|
2503
|
+
{ name = "tensorboard", marker = "extra == 'ai'", specifier = ">=2.21.0" },
|
|
2504
|
+
{ name = "torch", marker = "extra == 'ai'", specifier = ">=2.9.0" },
|
|
2471
2505
|
{ name = "yfinance", specifier = ">1.5.0" },
|
|
2472
2506
|
]
|
|
2473
|
-
provides-extras = ["
|
|
2507
|
+
provides-extras = ["ai", "alpaca", "crypto", "ibkr"]
|
|
2474
2508
|
|
|
2475
2509
|
[package.metadata.requires-dev]
|
|
2476
2510
|
dev = [
|
|
@@ -2481,7 +2515,7 @@ dev = [
|
|
|
2481
2515
|
{ name = "pyright", specifier = ">=1.1.411" },
|
|
2482
2516
|
{ name = "python-dotenv", specifier = ">=1.1.0" },
|
|
2483
2517
|
]
|
|
2484
|
-
talib = [{ name = "ta-lib", specifier = "==0.6.
|
|
2518
|
+
talib = [{ name = "ta-lib", specifier = "==0.6.5" }]
|
|
2485
2519
|
|
|
2486
2520
|
[[package]]
|
|
2487
2521
|
name = "safetensors"
|
|
@@ -2596,13 +2630,34 @@ wheels = [
|
|
|
2596
2630
|
|
|
2597
2631
|
[[package]]
|
|
2598
2632
|
name = "ta-lib"
|
|
2599
|
-
version = "0.6.
|
|
2633
|
+
version = "0.6.5"
|
|
2600
2634
|
source = { registry = "https://pypi.org/simple" }
|
|
2601
2635
|
dependencies = [
|
|
2636
|
+
{ name = "build" },
|
|
2602
2637
|
{ name = "numpy" },
|
|
2603
|
-
{ name = "
|
|
2638
|
+
{ name = "pip" },
|
|
2639
|
+
]
|
|
2640
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b6/38/6ab9976d72eb8c7142a153f922b2addb6eb5f136b825298049743a60cd5a/ta_lib-0.6.5.tar.gz", hash = "sha256:bc3100799b51318c1054f5f5b76f4b0a2f1a6d12625200880e81ea8a8773ff75", size = 379185 }
|
|
2641
|
+
wheels = [
|
|
2642
|
+
{ url = "https://files.pythonhosted.org/packages/05/8e/e69a0eb3286b05979feed3a4dbd2cf55d2a173cda5674f1982ea883a1c5f/ta_lib-0.6.5-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:fe6f65cc2f013765d287d9059c50c52edf0f117305082981e6ac80de11a19aa2", size = 1066189 },
|
|
2643
|
+
{ url = "https://files.pythonhosted.org/packages/01/59/735f6e0b34ad97b9d0fa8ff5a35e6cee4e3776bf68818ee7d7ab90d1c541/ta_lib-0.6.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cf65438c7c4869bfcef6be1a95e1ff212a432201dd4faa0b35a47f2156db8454", size = 979676 },
|
|
2644
|
+
{ url = "https://files.pythonhosted.org/packages/b2/6e/9e844e26dfe5569ec81dce948b13377ce1871073b9fcb811294d6b5177c1/ta_lib-0.6.5-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0d04ec78a33c3d35a32f3aed8d320be404eda2a95ec3d17d3aa8dbf96e311a9f", size = 3936782 },
|
|
2645
|
+
{ url = "https://files.pythonhosted.org/packages/06/c3/325be4e35ac718f2149ff1670f903950bd4fffc273557a6d59c7376a95f3/ta_lib-0.6.5-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:585a84b9fb0415dc88abbc09afb4b285d27137f7dab4b6a5c1e255afc1ea5ed0", size = 4058477 },
|
|
2646
|
+
{ url = "https://files.pythonhosted.org/packages/8e/8f/feee96b0ecdd4debfe4f0182ed0f3575248297de3f3b34c9335fa46e1714/ta_lib-0.6.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9588a6f05291a14de8f2167018a1150a05fd26f4a298484b0e8476421c156bd0", size = 3556370 },
|
|
2647
|
+
{ url = "https://files.pythonhosted.org/packages/2f/b5/9682bc2e79eded4a4c293b66a459e223e70d298fb088aa6378464f21f99e/ta_lib-0.6.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:393583526a37d55c2557688bd9f6cf66c95eee87f24ca58cc1136ef42266e2f8", size = 3681265 },
|
|
2648
|
+
{ url = "https://files.pythonhosted.org/packages/75/fe/8d9a555a286cba0c9d0cbb49ce20af2cf64a1eb34b8e5d549bd2d253b1f6/ta_lib-0.6.5-cp312-cp312-win32.whl", hash = "sha256:feb356b6be4fbbebc11eb6b636b41d783575ab8e6c8762963d6c5d5f348b1634", size = 766831 },
|
|
2649
|
+
{ url = "https://files.pythonhosted.org/packages/ce/20/e349b435276554bd4facff10a05eb0584d5e6714aadfd1b0b7777d662525/ta_lib-0.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:666c4043511dfa26748215aadba4f297589a87387f56276d35e555a6f74dc802", size = 883440 },
|
|
2650
|
+
{ url = "https://files.pythonhosted.org/packages/eb/77/02feec8a83dd12488cb68c42494fcbbbac39f745b0501f8071ef38baacfe/ta_lib-0.6.5-cp312-cp312-win_arm64.whl", hash = "sha256:461a7cbe14f42c2637d94667f4bf55bb55ef92dd1504a2286670769947e28c52", size = 749131 },
|
|
2651
|
+
{ url = "https://files.pythonhosted.org/packages/71/d5/1fad28aff4de0ecea599e97fdc91fdfc0f397fabde1b41a6e54cd64ea710/ta_lib-0.6.5-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:b1572653d0ea27d9961f579e929bdcedde928a4c3db44c25f1387e93440b34c2", size = 1065359 },
|
|
2652
|
+
{ url = "https://files.pythonhosted.org/packages/7c/d0/85022658ead1458203deb196e3312046646fa7bfa404bbfc19456080f046/ta_lib-0.6.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:60ead0fdd7547e0e6cf6db87190bef34e3a039106a9135fea3f3ccb9056e68b1", size = 979947 },
|
|
2653
|
+
{ url = "https://files.pythonhosted.org/packages/d4/0f/e8250c1a1ca6fca049297a48d654449e4d85e3198cd664a23711168c03f3/ta_lib-0.6.5-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:40d31e6c1ff9646870affc59d077dd340f4ccef6ae79de4e98625c06fbc702f2", size = 3943714 },
|
|
2654
|
+
{ url = "https://files.pythonhosted.org/packages/82/63/476c38b32bf6527d05ca2dfd0922b01b66373cf6f6bbd7a539ba6a0ffd9b/ta_lib-0.6.5-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ce4b4277448e0622b6a2d0f3b9833eddc5d9ca5eafb026d528ba6dadaea0c8a4", size = 4022662 },
|
|
2655
|
+
{ url = "https://files.pythonhosted.org/packages/5e/87/61aa73b65a2d421b197921db0c9a14ba8cb2f4d8645847df7957e5cbe2d9/ta_lib-0.6.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f4aff21bafafcf49192d30a8d6c2db6fd1b569065a47577cf42f227cd8dfccb", size = 3544944 },
|
|
2656
|
+
{ url = "https://files.pythonhosted.org/packages/1d/ca/6e0459b0356af41c11e1cc133cc526ba01ac43c83446f729d544ae969215/ta_lib-0.6.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe1159baf26129d7dbb9013e4ff71a73c40b4e089d0db9105011da65e5f52946", size = 3638748 },
|
|
2657
|
+
{ url = "https://files.pythonhosted.org/packages/08/fe/4df00c95b7a7c11abebaf79a85540ecdc1f659e4b88cc7238e63222e4f86/ta_lib-0.6.5-cp313-cp313-win32.whl", hash = "sha256:5a40df4f0af832dc41353af9459df90fcada959e229a0509b28f9871de4d887b", size = 766798 },
|
|
2658
|
+
{ url = "https://files.pythonhosted.org/packages/3c/a6/851c73dc796426c501371283f63b8a723ee9ce62dedb7281e7efcf9c7f58/ta_lib-0.6.5-cp313-cp313-win_amd64.whl", hash = "sha256:393339212cdc07779d68ad7868a2f380dfbea8e42b3fc77cbfce775142688404", size = 882811 },
|
|
2659
|
+
{ url = "https://files.pythonhosted.org/packages/c8/8c/d79a402c06280a67d24672b8ac54daa7ac926a07fe540b344393fc036e9d/ta_lib-0.6.5-cp313-cp313-win_arm64.whl", hash = "sha256:c5b55a1bc8ba8b5e7c6a810ce09f8e5e1011085740b244b6b203e47907f7a1e2", size = 749270 },
|
|
2604
2660
|
]
|
|
2605
|
-
sdist = { url = "https://files.pythonhosted.org/packages/ba/97/a49816dd468a18ee080cf3a04640772a9f6321790d4049cece2490c4b7ad/ta_lib-0.6.4.tar.gz", hash = "sha256:08f55bc5771a6d1ceb1a2b713aad7b05f04eb0061e980c9113571c532d32e9cb", size = 381774 }
|
|
2606
2661
|
|
|
2607
2662
|
[[package]]
|
|
2608
2663
|
name = "tensorboard"
|
roboquant-2.1.2/docs/DESIGN.md
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|