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.
Files changed (142) hide show
  1. {roboquant-2.1.2 → roboquant-2.2.0}/.github/workflows/verify.yml +3 -0
  2. {roboquant-2.1.2 → roboquant-2.2.0}/LICENSE +1 -1
  3. {roboquant-2.1.2 → roboquant-2.2.0}/PKG-INFO +20 -20
  4. {roboquant-2.1.2 → roboquant-2.2.0}/README.md +13 -14
  5. roboquant-2.2.0/docs/DESIGN.md +85 -0
  6. {roboquant-2.1.2 → roboquant-2.2.0}/pyproject.toml +3 -2
  7. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/__init__.py +2 -3
  8. roboquant-2.2.0/roboquant/ai/__init__.py +6 -0
  9. {roboquant-2.1.2/roboquant/ml → roboquant-2.2.0/roboquant/ai}/features.py +1 -1
  10. {roboquant-2.1.2/roboquant/ml → roboquant-2.2.0/roboquant/ai}/rl.py +2 -2
  11. {roboquant-2.1.2/roboquant/ml → roboquant-2.2.0/roboquant/ai}/strategies.py +1 -1
  12. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/brokers/broker.py +2 -2
  13. roboquant-2.2.0/roboquant/crypto/__init__.py +3 -0
  14. {roboquant-2.1.2 → roboquant-2.2.0}/tests/integration/test_ccxt.py +1 -1
  15. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/crypto_backtest.py +1 -1
  16. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/sb3_strategy.py +2 -2
  17. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/sb3_strategy_quotes.py +2 -2
  18. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/talib_feature.py +1 -1
  19. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/talib_strategy.py +0 -1
  20. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/torch_lstm.py +2 -2
  21. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/torch_transformer.py +2 -2
  22. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_features.py +1 -1
  23. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_rnn.py +2 -2
  24. {roboquant-2.1.2 → roboquant-2.2.0}/uv.lock +70 -15
  25. roboquant-2.1.2/docs/DESIGN.md +0 -0
  26. roboquant-2.1.2/tests/unit/__init__.py +0 -0
  27. {roboquant-2.1.2 → roboquant-2.2.0}/.gitignore +0 -0
  28. {roboquant-2.1.2 → roboquant-2.2.0}/.vscode/settings.json +0 -0
  29. {roboquant-2.1.2 → roboquant-2.2.0}/.zed/settings.json +0 -0
  30. {roboquant-2.1.2 → roboquant-2.2.0}/.zed/tasks.json +0 -0
  31. {roboquant-2.1.2 → roboquant-2.2.0}/bin/local_install.sh +0 -0
  32. {roboquant-2.1.2 → roboquant-2.2.0}/bin/publish.sh +0 -0
  33. {roboquant-2.1.2 → roboquant-2.2.0}/bin/verify.sh +0 -0
  34. {roboquant-2.1.2 → roboquant-2.2.0}/docs/roboquant_header.png +0 -0
  35. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/account.py +0 -0
  36. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/alpaca/__init__.py +0 -0
  37. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/alpaca/broker.py +0 -0
  38. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/alpaca/feed.py +0 -0
  39. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/asset.py +0 -0
  40. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/brokers/__init__.py +0 -0
  41. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/brokers/simbroker.py +0 -0
  42. {roboquant-2.1.2/roboquant/brokers → roboquant-2.2.0/roboquant/crypto}/cryptobroker.py +0 -0
  43. {roboquant-2.1.2/roboquant/feeds → roboquant-2.2.0/roboquant/crypto}/cryptofeed.py +0 -0
  44. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/event.py +0 -0
  45. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/__init__.py +0 -0
  46. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/csvfeed.py +0 -0
  47. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/feed.py +0 -0
  48. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/historic.py +0 -0
  49. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/live.py +0 -0
  50. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/parquet.py +0 -0
  51. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/randomwalk.py +0 -0
  52. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/resources/us10.parquet +0 -0
  53. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/sql.py +0 -0
  54. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/util.py +0 -0
  55. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/feeds/yahoo.py +0 -0
  56. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/ibkr/__init__.py +0 -0
  57. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/ibkr/broker.py +0 -0
  58. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/ibkr/types.py +0 -0
  59. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/__init__.py +0 -0
  60. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/alphabeta.py +0 -0
  61. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/basicjournal.py +0 -0
  62. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/feedmetric.py +0 -0
  63. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/journal.py +0 -0
  64. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/marketmetric.py +0 -0
  65. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/metric.py +0 -0
  66. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/metricsjournal.py +0 -0
  67. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/pnlmetric.py +0 -0
  68. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/pricemetric.py +0 -0
  69. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/runmetric.py +0 -0
  70. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/scorecard.py +0 -0
  71. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/journals/tensorboard.py +0 -0
  72. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/monetary.py +0 -0
  73. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/order.py +0 -0
  74. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/run.py +0 -0
  75. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/signal.py +0 -0
  76. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/__init__.py +0 -0
  77. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/buffer.py +0 -0
  78. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/cachedstrategy.py +0 -0
  79. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/emacrossover.py +0 -0
  80. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/ibsstrategy.py +0 -0
  81. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/multistrategy.py +0 -0
  82. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/strategy.py +0 -0
  83. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/strategies/tastrategy.py +0 -0
  84. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/ta/__init__.py +0 -0
  85. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/timeframe.py +0 -0
  86. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/traders/__init__.py +0 -0
  87. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/traders/flextrader.py +0 -0
  88. {roboquant-2.1.2 → roboquant-2.2.0}/roboquant/traders/trader.py +0 -0
  89. {roboquant-2.1.2/roboquant/ml → roboquant-2.2.0/tests}/__init__.py +0 -0
  90. {roboquant-2.1.2 → roboquant-2.2.0}/tests/common.py +0 -0
  91. {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/stooq/5_min/ibm.us.txt +0 -0
  92. {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/stooq/daily/ibm.us.txt +0 -0
  93. {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/yahoo/AAPL.csv +0 -0
  94. {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/yahoo/AMZN.csv +0 -0
  95. {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/yahoo/META.csv +0 -0
  96. {roboquant-2.1.2 → roboquant-2.2.0}/tests/data/yahoo/TSLA.csv +0 -0
  97. {roboquant-2.1.2/tests → roboquant-2.2.0/tests/integration}/__init__.py +0 -0
  98. {roboquant-2.1.2 → roboquant-2.2.0}/tests/integration/test_alpaca.py +0 -0
  99. {roboquant-2.1.2 → roboquant-2.2.0}/tests/integration/test_ibkr.py +0 -0
  100. {roboquant-2.1.2 → roboquant-2.2.0}/tests/integration/test_yahoo.py +0 -0
  101. {roboquant-2.1.2/tests/integration → roboquant-2.2.0/tests/performance}/__init__.py +0 -0
  102. {roboquant-2.1.2 → roboquant-2.2.0}/tests/performance/test_bigfeed.py +0 -0
  103. {roboquant-2.1.2 → roboquant-2.2.0}/tests/performance/test_delay.py +0 -0
  104. {roboquant-2.1.2 → roboquant-2.2.0}/tests/performance/test_profiling.py +0 -0
  105. {roboquant-2.1.2/tests/performance → roboquant-2.2.0/tests/samples}/__init__.py +0 -0
  106. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_forwardtest_bars.py +0 -0
  107. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_forwardtest_trades.py +0 -0
  108. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_live_feed.py +0 -0
  109. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_papertrade.py +0 -0
  110. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/alpaca_record.py +0 -0
  111. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/charts.py +0 -0
  112. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/chronos_prediction.py +0 -0
  113. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/extra_logging.py +0 -0
  114. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/ibkr_close_positions.py +0 -0
  115. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/monetary.py +0 -0
  116. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/pandas_dataframe.py +0 -0
  117. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/parquet_csv.py +0 -0
  118. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/parquet_csv_large.py +0 -0
  119. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/parquet_yahoo.py +0 -0
  120. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/tensorboard_metrics.py +0 -0
  121. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/yahoo_backtest.py +0 -0
  122. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/yahoo_walkforward.py +0 -0
  123. {roboquant-2.1.2 → roboquant-2.2.0}/tests/samples/yahoo_walkforward_multiprocess.py +0 -0
  124. {roboquant-2.1.2/tests/samples → roboquant-2.2.0/tests/unit}/__init__.py +0 -0
  125. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_account.py +0 -0
  126. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_asset.py +0 -0
  127. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_buffer.py +0 -0
  128. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_csvfeed.py +0 -0
  129. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_feedutil.py +0 -0
  130. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_journal.py +0 -0
  131. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_monetary.py +0 -0
  132. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_order.py +0 -0
  133. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_parquetfeed.py +0 -0
  134. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_randomwalk.py +0 -0
  135. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_run.py +0 -0
  136. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_signal.py +0 -0
  137. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_simbroker.py +0 -0
  138. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_sqlfeed.py +0 -0
  139. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_strategy.py +0 -0
  140. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_tastrategy.py +0 -0
  141. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_tensorboard.py +0 -0
  142. {roboquant-2.1.2 → roboquant-2.2.0}/tests/unit/test_timeframe.py +0 -0
@@ -8,6 +8,9 @@ on:
8
8
  pull_request:
9
9
  branches: [ "main" ]
10
10
 
11
+ env:
12
+ PYRIGHT_PYTHON_FORCE_VERSION: latest
13
+
11
14
  jobs:
12
15
  verify:
13
16
 
@@ -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.1.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
  # ![roboquant logo](https://github.com/neurallayer/roboquant.py/raw/main/docs/roboquant_header.png)
44
45
 
45
- ![PyPI - Version](https://img.shields.io/pypi/v/roboquant)
46
- ![PyPI - License](https://img.shields.io/pypi/l/roboquant)
47
- ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/roboquant)
48
- ![PyPI - Status](https://img.shields.io/pypi/status/roboquant)
46
+ ![PyPI - Version](https://img.shields.io/pypi/v/roboquant?)
47
+ ![PyPI - License](https://img.shields.io/pypi/l/roboquant?)
48
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/roboquant?)
49
+ ![PyPI - Status](https://img.shields.io/pypi/status/roboquant?)
49
50
  ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/neurallayer/roboquant.py/verify.yml)
50
51
  [![discord](https://img.shields.io/discord/954650958300856340?label=discord)](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.11 or higher installed.
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
- # PyTorch based strategies using RNNStrategy
81
- python3 -m pip install --upgrade "roboquant[torch]"
80
+ # AI based strategies using Torch and SB3
81
+ python3 -m pip install --upgrade "roboquant[ai]"
82
82
 
83
- # Integration with Interactive Brokers using IBKRBroker
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
  # ![roboquant logo](https://github.com/neurallayer/roboquant.py/raw/main/docs/roboquant_header.png)
3
3
 
4
- ![PyPI - Version](https://img.shields.io/pypi/v/roboquant)
5
- ![PyPI - License](https://img.shields.io/pypi/l/roboquant)
6
- ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/roboquant)
7
- ![PyPI - Status](https://img.shields.io/pypi/status/roboquant)
4
+ ![PyPI - Version](https://img.shields.io/pypi/v/roboquant?)
5
+ ![PyPI - License](https://img.shields.io/pypi/l/roboquant?)
6
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/roboquant?)
7
+ ![PyPI - Status](https://img.shields.io/pypi/status/roboquant?)
8
8
  ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/neurallayer/roboquant.py/verify.yml)
9
9
  [![discord](https://img.shields.io/discord/954650958300856340?label=discord)](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.11 or higher installed.
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
- # PyTorch based strategies using RNNStrategy
40
- python3 -m pip install --upgrade "roboquant[torch]"
38
+ # AI based strategies using Torch and SB3
39
+ python3 -m pip install --upgrade "roboquant[ai]"
41
40
 
42
- # Integration with Interactive Brokers using IBKRBroker
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
- torch = [
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.4"]
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.1.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
- from roboquant import ml
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.ml.features import Feature
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.ml.envs:StrategyEnv")
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.ml.features import Feature, NormalizeFeature
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), # Negative size for sell orders
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
 
@@ -0,0 +1,3 @@
1
+ from roboquant.crypto import CryptoFeed, CryptoBroker
2
+
3
+ __all__ = ["CryptoFeed", "CryptoBroker"]
@@ -3,7 +3,7 @@ import ccxt
3
3
  from datetime import datetime
4
4
 
5
5
  from roboquant.asset import Crypto
6
- from roboquant.feeds.cryptofeed import CryptoFeed
6
+ from roboquant.crypto.cryptofeed import CryptoFeed
7
7
  from tests.common import run_price_item_feed
8
8
 
9
9
 
@@ -4,7 +4,7 @@
4
4
  # %%
5
5
  import ccxt
6
6
  import roboquant as rq
7
- from roboquant.feeds.cryptofeed import CryptoFeed
7
+ from roboquant.crypto.cryptofeed import CryptoFeed
8
8
 
9
9
  # %%
10
10
  exchange = ccxt.binance()
@@ -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.ml.features import BarFeature, EquityFeature, CombinedFeature, SMAFeature, PriceFeature
7
- from roboquant.ml.rl import TradingEnv, SB3PolicyStrategy
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.ml.features import EquityFeature, QuoteFeature
8
- from roboquant.ml.rl import TradingEnv, SB3PolicyStrategy
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,7 @@
3
3
  import roboquant.ta as ta
4
4
  import roboquant as rq
5
5
  from roboquant.asset import Asset
6
- from roboquant.ml.features import TaFeature
6
+ from roboquant.ai.features import TaFeature
7
7
  from roboquant.strategies.buffer import OHLCVBuffer
8
8
 
9
9
  # %%
@@ -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.ml.features import BarFeature, CombinedFeature, MaxReturnFeature, PriceFeature, SMAFeature
10
- from roboquant.ml.strategies import TimeSeriesStrategy, logger
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.ml.features import BarFeature, CombinedFeature, MaxReturnFeature, PriceFeature, SMAFeature, DayOfMonthFeature
10
- from roboquant.ml.strategies import TimeSeriesStrategy, logger
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
  # %%
@@ -4,7 +4,7 @@ import unittest
4
4
  import numpy as np
5
5
  from roboquant.event import Event
6
6
 
7
- from roboquant.ml.features import (
7
+ from roboquant.ai.features import (
8
8
  CacheFeature,
9
9
  CombinedFeature,
10
10
  NormalizeFeature,
@@ -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.ml.features import BarFeature, CombinedFeature, PriceFeature, SMAFeature
10
- from roboquant.ml.strategies import TimeSeriesStrategy, SequenceDataset
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 == 'torch'", specifier = ">=2.9.0" },
2468
- { name = "stable-baselines3", marker = "extra == 'torch'", specifier = ">=2.9.0" },
2469
- { name = "tensorboard", marker = "extra == 'torch'", specifier = ">=2.21.0" },
2470
- { name = "torch", marker = "extra == 'torch'", specifier = ">=2.9.0" },
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 = ["alpaca", "crypto", "ibkr", "torch"]
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.4" }]
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.4"
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 = "setuptools" },
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"
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