trade-learn 0.2.0.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.

Potentially problematic release.


This version of trade-learn might be problematic. Click here for more details.

Files changed (139) hide show
  1. trade_learn-0.2.0.0/Cargo.lock +269 -0
  2. trade_learn-0.2.0.0/Cargo.toml +3 -0
  3. trade_learn-0.2.0.0/LICENSE +17 -0
  4. trade_learn-0.2.0.0/NOTICE +19 -0
  5. trade_learn-0.2.0.0/PKG-INFO +369 -0
  6. trade_learn-0.2.0.0/README.md +296 -0
  7. trade_learn-0.2.0.0/pyproject.toml +146 -0
  8. trade_learn-0.2.0.0/rust/tradelearn-rust/Cargo.toml +21 -0
  9. trade_learn-0.2.0.0/rust/tradelearn-rust/src/engine.rs +471 -0
  10. trade_learn-0.2.0.0/rust/tradelearn-rust/src/lib.rs +549 -0
  11. trade_learn-0.2.0.0/rust/tradelearn-rust/src/matching.rs +300 -0
  12. trade_learn-0.2.0.0/rust/tradelearn-rust/src/resampler.rs +101 -0
  13. trade_learn-0.2.0.0/rust/tradelearn-rust/src/runner.rs +395 -0
  14. trade_learn-0.2.0.0/rust/tradelearn-rust/src/types.rs +460 -0
  15. trade_learn-0.2.0.0/rust/tradelearn-rust/tests/arrow_callback.rs +65 -0
  16. trade_learn-0.2.0.0/rust/tradelearn-rust/tests/core_contracts.rs +119 -0
  17. trade_learn-0.2.0.0/rust/tradelearn-rust/tests/matching.rs +191 -0
  18. trade_learn-0.2.0.0/rust/tradelearn-rust/tests/multi_data_feed.rs +64 -0
  19. trade_learn-0.2.0.0/rust/tradelearn-rust/tests/portfolio.rs +128 -0
  20. trade_learn-0.2.0.0/tradelearn/__init__.py +39 -0
  21. trade_learn-0.2.0.0/tradelearn/backtest/__init__.py +47 -0
  22. trade_learn-0.2.0.0/tradelearn/backtest/_optimize.py +14 -0
  23. trade_learn-0.2.0.0/tradelearn/backtest/broker.py +935 -0
  24. trade_learn-0.2.0.0/tradelearn/backtest/data.py +199 -0
  25. trade_learn-0.2.0.0/tradelearn/backtest/engine.py +989 -0
  26. trade_learn-0.2.0.0/tradelearn/backtest/event_runner.py +173 -0
  27. trade_learn-0.2.0.0/tradelearn/backtest/feed.py +185 -0
  28. trade_learn-0.2.0.0/tradelearn/backtest/history.py +51 -0
  29. trade_learn-0.2.0.0/tradelearn/backtest/indicator_cache.py +235 -0
  30. trade_learn-0.2.0.0/tradelearn/backtest/lines.py +250 -0
  31. trade_learn-0.2.0.0/tradelearn/backtest/models.py +365 -0
  32. trade_learn-0.2.0.0/tradelearn/backtest/reporting.py +33 -0
  33. trade_learn-0.2.0.0/tradelearn/backtest/runtime_config.py +46 -0
  34. trade_learn-0.2.0.0/tradelearn/backtest/sizer.py +30 -0
  35. trade_learn-0.2.0.0/tradelearn/backtest/strategy.py +465 -0
  36. trade_learn-0.2.0.0/tradelearn/backtest/targets.py +125 -0
  37. trade_learn-0.2.0.0/tradelearn/cli/__init__.py +287 -0
  38. trade_learn-0.2.0.0/tradelearn/core/__init__.py +55 -0
  39. trade_learn-0.2.0.0/tradelearn/core/broker_contracts.py +93 -0
  40. trade_learn-0.2.0.0/tradelearn/core/broker_events.py +113 -0
  41. trade_learn-0.2.0.0/tradelearn/core/config.py +152 -0
  42. trade_learn-0.2.0.0/tradelearn/core/contracts.py +157 -0
  43. trade_learn-0.2.0.0/tradelearn/core/errors.py +21 -0
  44. trade_learn-0.2.0.0/tradelearn/core/logging.py +26 -0
  45. trade_learn-0.2.0.0/tradelearn/core/progress.py +24 -0
  46. trade_learn-0.2.0.0/tradelearn/core/seed.py +38 -0
  47. trade_learn-0.2.0.0/tradelearn/core/time.py +26 -0
  48. trade_learn-0.2.0.0/tradelearn/data/__init__.py +22 -0
  49. trade_learn-0.2.0.0/tradelearn/data/bars.py +121 -0
  50. trade_learn-0.2.0.0/tradelearn/data/cache.py +179 -0
  51. trade_learn-0.2.0.0/tradelearn/data/duckdb_backend.py +237 -0
  52. trade_learn-0.2.0.0/tradelearn/data/explorer.py +273 -0
  53. trade_learn-0.2.0.0/tradelearn/data/providers.py +502 -0
  54. trade_learn-0.2.0.0/tradelearn/data/resampler.py +150 -0
  55. trade_learn-0.2.0.0/tradelearn/engine/__init__.py +126 -0
  56. trade_learn-0.2.0.0/tradelearn/engine/analyzer.py +85 -0
  57. trade_learn-0.2.0.0/tradelearn/engine/analyzers/__init__.py +8 -0
  58. trade_learn-0.2.0.0/tradelearn/engine/analyzers/drawdown.py +9 -0
  59. trade_learn-0.2.0.0/tradelearn/engine/analyzers/mlflow.py +187 -0
  60. trade_learn-0.2.0.0/tradelearn/engine/analyzers/returns.py +9 -0
  61. trade_learn-0.2.0.0/tradelearn/engine/analyzers/sharpe.py +10 -0
  62. trade_learn-0.2.0.0/tradelearn/engine/base.py +320 -0
  63. trade_learn-0.2.0.0/tradelearn/engine/cerebro.py +508 -0
  64. trade_learn-0.2.0.0/tradelearn/engine/datafeed.py +28 -0
  65. trade_learn-0.2.0.0/tradelearn/engine/feeds.py +47 -0
  66. trade_learn-0.2.0.0/tradelearn/engine/grid.py +53 -0
  67. trade_learn-0.2.0.0/tradelearn/engine/indicators.py +134 -0
  68. trade_learn-0.2.0.0/tradelearn/engine/observers.py +120 -0
  69. trade_learn-0.2.0.0/tradelearn/engine/signal.py +225 -0
  70. trade_learn-0.2.0.0/tradelearn/engine/sizers.py +46 -0
  71. trade_learn-0.2.0.0/tradelearn/engine/strategy.py +185 -0
  72. trade_learn-0.2.0.0/tradelearn/factor/__init__.py +24 -0
  73. trade_learn-0.2.0.0/tradelearn/factor/alpha/__init__.py +9 -0
  74. trade_learn-0.2.0.0/tradelearn/factor/alpha/alpha101.py +1024 -0
  75. trade_learn-0.2.0.0/tradelearn/factor/alpha/alpha191.py +1958 -0
  76. trade_learn-0.2.0.0/tradelearn/factor/analyzer.py +813 -0
  77. trade_learn-0.2.0.0/tradelearn/factor/risk_model.py +207 -0
  78. trade_learn-0.2.0.0/tradelearn/indicators/__init__.py +48 -0
  79. trade_learn-0.2.0.0/tradelearn/indicators/base.py +162 -0
  80. trade_learn-0.2.0.0/tradelearn/indicators/core/__init__.py +9 -0
  81. trade_learn-0.2.0.0/tradelearn/indicators/core/momentum.py +18 -0
  82. trade_learn-0.2.0.0/tradelearn/indicators/core/overlap.py +62 -0
  83. trade_learn-0.2.0.0/tradelearn/indicators/core/trend.py +42 -0
  84. trade_learn-0.2.0.0/tradelearn/indicators/core/volatility.py +23 -0
  85. trade_learn-0.2.0.0/tradelearn/indicators/core/volume.py +23 -0
  86. trade_learn-0.2.0.0/tradelearn/indicators/pta/__init__.py +21 -0
  87. trade_learn-0.2.0.0/tradelearn/indicators/pta/pandas_ta_adapter.py +41 -0
  88. trade_learn-0.2.0.0/tradelearn/indicators/talib/__init__.py +25 -0
  89. trade_learn-0.2.0.0/tradelearn/indicators/talib/ta_lib_adapter.py +70 -0
  90. trade_learn-0.2.0.0/tradelearn/indicators/tdx/__init__.py +136 -0
  91. trade_learn-0.2.0.0/tradelearn/indicators/tdx/mytt_adapter.py +936 -0
  92. trade_learn-0.2.0.0/tradelearn/indicators/tv/__init__.py +244 -0
  93. trade_learn-0.2.0.0/tradelearn/indicators/tv/pynecore_adapter.py +535 -0
  94. trade_learn-0.2.0.0/tradelearn/lab/__init__.py +27 -0
  95. trade_learn-0.2.0.0/tradelearn/lab/runtime.py +263 -0
  96. trade_learn-0.2.0.0/tradelearn/lite/__init__.py +33 -0
  97. trade_learn-0.2.0.0/tradelearn/lite/backtest.py +276 -0
  98. trade_learn-0.2.0.0/tradelearn/lite/data.py +130 -0
  99. trade_learn-0.2.0.0/tradelearn/lite/indicator.py +188 -0
  100. trade_learn-0.2.0.0/tradelearn/lite/mlflow.py +134 -0
  101. trade_learn-0.2.0.0/tradelearn/lite/position.py +114 -0
  102. trade_learn-0.2.0.0/tradelearn/lite/strategy.py +636 -0
  103. trade_learn-0.2.0.0/tradelearn/mcp/__init__.py +7 -0
  104. trade_learn-0.2.0.0/tradelearn/mcp/server.py +305 -0
  105. trade_learn-0.2.0.0/tradelearn/metrics/__init__.py +79 -0
  106. trade_learn-0.2.0.0/tradelearn/metrics/_common.py +31 -0
  107. trade_learn-0.2.0.0/tradelearn/metrics/engine.py +74 -0
  108. trade_learn-0.2.0.0/tradelearn/metrics/factor.py +587 -0
  109. trade_learn-0.2.0.0/tradelearn/metrics/returns.py +160 -0
  110. trade_learn-0.2.0.0/tradelearn/metrics/risk.py +519 -0
  111. trade_learn-0.2.0.0/tradelearn/metrics/trade.py +208 -0
  112. trade_learn-0.2.0.0/tradelearn/ml/__init__.py +22 -0
  113. trade_learn-0.2.0.0/tradelearn/ml/_lazy_predict.py +665 -0
  114. trade_learn-0.2.0.0/tradelearn/ml/automl.py +58 -0
  115. trade_learn-0.2.0.0/tradelearn/ml/causal.py +183 -0
  116. trade_learn-0.2.0.0/tradelearn/ml/registry.py +56 -0
  117. trade_learn-0.2.0.0/tradelearn/optimize.py +153 -0
  118. trade_learn-0.2.0.0/tradelearn/report/__init__.py +6 -0
  119. trade_learn-0.2.0.0/tradelearn/report/analytics.py +241 -0
  120. trade_learn-0.2.0.0/tradelearn/report/artifacts.py +243 -0
  121. trade_learn-0.2.0.0/tradelearn/report/charts/__init__.py +79 -0
  122. trade_learn-0.2.0.0/tradelearn/report/charts/core.py +1716 -0
  123. trade_learn-0.2.0.0/tradelearn/report/excel.py +251 -0
  124. trade_learn-0.2.0.0/tradelearn/report/explore.py +18 -0
  125. trade_learn-0.2.0.0/tradelearn/report/html.py +494 -0
  126. trade_learn-0.2.0.0/tradelearn/report/mlflow.py +216 -0
  127. trade_learn-0.2.0.0/tradelearn/report/reporter.py +595 -0
  128. trade_learn-0.2.0.0/tradelearn/report/sections.py +127 -0
  129. trade_learn-0.2.0.0/tradelearn/report/templates/tear_sheet.html +298 -0
  130. trade_learn-0.2.0.0/tradelearn/research/__init__.py +34 -0
  131. trade_learn-0.2.0.0/tradelearn/research/derive.py +122 -0
  132. trade_learn-0.2.0.0/tradelearn/research/explore.py +100 -0
  133. trade_learn-0.2.0.0/tradelearn/research/features.py +95 -0
  134. trade_learn-0.2.0.0/tradelearn/research/pipeline.py +97 -0
  135. trade_learn-0.2.0.0/tradelearn/research/portfolio.py +530 -0
  136. trade_learn-0.2.0.0/tradelearn/research/preprocess.py +630 -0
  137. trade_learn-0.2.0.0/tradelearn/research/run.py +509 -0
  138. trade_learn-0.2.0.0/tradelearn/research/scoring.py +46 -0
  139. trade_learn-0.2.0.0/tradelearn/research/split.py +94 -0
@@ -0,0 +1,269 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "autocfg"
7
+ version = "1.5.0"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
10
+
11
+ [[package]]
12
+ name = "cfg-if"
13
+ version = "1.0.4"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
16
+
17
+ [[package]]
18
+ name = "heck"
19
+ version = "0.5.0"
20
+ source = "registry+https://github.com/rust-lang/crates.io-index"
21
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
22
+
23
+ [[package]]
24
+ name = "indoc"
25
+ version = "2.0.7"
26
+ source = "registry+https://github.com/rust-lang/crates.io-index"
27
+ checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
28
+ dependencies = [
29
+ "rustversion",
30
+ ]
31
+
32
+ [[package]]
33
+ name = "libc"
34
+ version = "0.2.186"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
37
+
38
+ [[package]]
39
+ name = "matrixmultiply"
40
+ version = "0.3.10"
41
+ source = "registry+https://github.com/rust-lang/crates.io-index"
42
+ checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08"
43
+ dependencies = [
44
+ "autocfg",
45
+ "rawpointer",
46
+ ]
47
+
48
+ [[package]]
49
+ name = "memoffset"
50
+ version = "0.9.1"
51
+ source = "registry+https://github.com/rust-lang/crates.io-index"
52
+ checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
53
+ dependencies = [
54
+ "autocfg",
55
+ ]
56
+
57
+ [[package]]
58
+ name = "ndarray"
59
+ version = "0.16.1"
60
+ source = "registry+https://github.com/rust-lang/crates.io-index"
61
+ checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841"
62
+ dependencies = [
63
+ "matrixmultiply",
64
+ "num-complex",
65
+ "num-integer",
66
+ "num-traits",
67
+ "portable-atomic",
68
+ "portable-atomic-util",
69
+ "rawpointer",
70
+ ]
71
+
72
+ [[package]]
73
+ name = "num-complex"
74
+ version = "0.4.6"
75
+ source = "registry+https://github.com/rust-lang/crates.io-index"
76
+ checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
77
+ dependencies = [
78
+ "num-traits",
79
+ ]
80
+
81
+ [[package]]
82
+ name = "num-integer"
83
+ version = "0.1.46"
84
+ source = "registry+https://github.com/rust-lang/crates.io-index"
85
+ checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
86
+ dependencies = [
87
+ "num-traits",
88
+ ]
89
+
90
+ [[package]]
91
+ name = "num-traits"
92
+ version = "0.2.19"
93
+ source = "registry+https://github.com/rust-lang/crates.io-index"
94
+ checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
95
+ dependencies = [
96
+ "autocfg",
97
+ ]
98
+
99
+ [[package]]
100
+ name = "numpy"
101
+ version = "0.23.0"
102
+ source = "registry+https://github.com/rust-lang/crates.io-index"
103
+ checksum = "b94caae805f998a07d33af06e6a3891e38556051b8045c615470a71590e13e78"
104
+ dependencies = [
105
+ "libc",
106
+ "ndarray",
107
+ "num-complex",
108
+ "num-integer",
109
+ "num-traits",
110
+ "pyo3",
111
+ "rustc-hash",
112
+ ]
113
+
114
+ [[package]]
115
+ name = "once_cell"
116
+ version = "1.21.4"
117
+ source = "registry+https://github.com/rust-lang/crates.io-index"
118
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
119
+
120
+ [[package]]
121
+ name = "portable-atomic"
122
+ version = "1.13.1"
123
+ source = "registry+https://github.com/rust-lang/crates.io-index"
124
+ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
125
+
126
+ [[package]]
127
+ name = "portable-atomic-util"
128
+ version = "0.2.7"
129
+ source = "registry+https://github.com/rust-lang/crates.io-index"
130
+ checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
131
+ dependencies = [
132
+ "portable-atomic",
133
+ ]
134
+
135
+ [[package]]
136
+ name = "proc-macro2"
137
+ version = "1.0.106"
138
+ source = "registry+https://github.com/rust-lang/crates.io-index"
139
+ checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
140
+ dependencies = [
141
+ "unicode-ident",
142
+ ]
143
+
144
+ [[package]]
145
+ name = "pyo3"
146
+ version = "0.23.5"
147
+ source = "registry+https://github.com/rust-lang/crates.io-index"
148
+ checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872"
149
+ dependencies = [
150
+ "cfg-if",
151
+ "indoc",
152
+ "libc",
153
+ "memoffset",
154
+ "once_cell",
155
+ "portable-atomic",
156
+ "pyo3-build-config",
157
+ "pyo3-ffi",
158
+ "pyo3-macros",
159
+ "unindent",
160
+ ]
161
+
162
+ [[package]]
163
+ name = "pyo3-build-config"
164
+ version = "0.23.5"
165
+ source = "registry+https://github.com/rust-lang/crates.io-index"
166
+ checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb"
167
+ dependencies = [
168
+ "once_cell",
169
+ "target-lexicon",
170
+ ]
171
+
172
+ [[package]]
173
+ name = "pyo3-ffi"
174
+ version = "0.23.5"
175
+ source = "registry+https://github.com/rust-lang/crates.io-index"
176
+ checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d"
177
+ dependencies = [
178
+ "libc",
179
+ "pyo3-build-config",
180
+ ]
181
+
182
+ [[package]]
183
+ name = "pyo3-macros"
184
+ version = "0.23.5"
185
+ source = "registry+https://github.com/rust-lang/crates.io-index"
186
+ checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da"
187
+ dependencies = [
188
+ "proc-macro2",
189
+ "pyo3-macros-backend",
190
+ "quote",
191
+ "syn",
192
+ ]
193
+
194
+ [[package]]
195
+ name = "pyo3-macros-backend"
196
+ version = "0.23.5"
197
+ source = "registry+https://github.com/rust-lang/crates.io-index"
198
+ checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028"
199
+ dependencies = [
200
+ "heck",
201
+ "proc-macro2",
202
+ "pyo3-build-config",
203
+ "quote",
204
+ "syn",
205
+ ]
206
+
207
+ [[package]]
208
+ name = "quote"
209
+ version = "1.0.45"
210
+ source = "registry+https://github.com/rust-lang/crates.io-index"
211
+ checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
212
+ dependencies = [
213
+ "proc-macro2",
214
+ ]
215
+
216
+ [[package]]
217
+ name = "rawpointer"
218
+ version = "0.2.1"
219
+ source = "registry+https://github.com/rust-lang/crates.io-index"
220
+ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
221
+
222
+ [[package]]
223
+ name = "rustc-hash"
224
+ version = "2.1.2"
225
+ source = "registry+https://github.com/rust-lang/crates.io-index"
226
+ checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
227
+
228
+ [[package]]
229
+ name = "rustversion"
230
+ version = "1.0.22"
231
+ source = "registry+https://github.com/rust-lang/crates.io-index"
232
+ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
233
+
234
+ [[package]]
235
+ name = "syn"
236
+ version = "2.0.117"
237
+ source = "registry+https://github.com/rust-lang/crates.io-index"
238
+ checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
239
+ dependencies = [
240
+ "proc-macro2",
241
+ "quote",
242
+ "unicode-ident",
243
+ ]
244
+
245
+ [[package]]
246
+ name = "target-lexicon"
247
+ version = "0.12.16"
248
+ source = "registry+https://github.com/rust-lang/crates.io-index"
249
+ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
250
+
251
+ [[package]]
252
+ name = "tradelearn-rust"
253
+ version = "0.2.0"
254
+ dependencies = [
255
+ "numpy",
256
+ "pyo3",
257
+ ]
258
+
259
+ [[package]]
260
+ name = "unicode-ident"
261
+ version = "1.0.24"
262
+ source = "registry+https://github.com/rust-lang/crates.io-index"
263
+ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
264
+
265
+ [[package]]
266
+ name = "unindent"
267
+ version = "0.2.4"
268
+ source = "registry+https://github.com/rust-lang/crates.io-index"
269
+ checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
@@ -0,0 +1,3 @@
1
+ [workspace]
2
+ members = ["rust/tradelearn-rust"]
3
+ resolver = "2"
@@ -0,0 +1,17 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Copyright 2026 trade-learn contributors
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
@@ -0,0 +1,19 @@
1
+ trade-learn
2
+ Copyright 2026 trade-learn contributors
3
+
4
+ This product is licensed under the Apache License, Version 2.0.
5
+
6
+ Attribution register:
7
+
8
+ - empyrical (Apache-2.0): semantic reference for returns and risk metrics.
9
+ - alphalens (Apache-2.0): semantic reference for factor analysis reports.
10
+ - pyfolio (Apache-2.0): semantic reference for tear-sheet style reporting.
11
+ - quantstats: semantic reference for selected report views.
12
+ - MyTT (MIT): TDX-style indicator formulas.
13
+ - DolphinDB wq101alpha: Alpha101/191 formula reference.
14
+ - pyneCore: TradingView-compatible indicator backend reference.
15
+ - backtesting.py (AGPL-3.0): inspired-by reference for clean-room design notes only.
16
+ - backtrader (GPL-3.0): public API compatibility target only; no source copying.
17
+ - causallearn (MIT): causal discovery dependency.
18
+ - mlflow (Apache-2.0): experiment tracking client dependency.
19
+ - pandas-ta-classic (MIT): pandas-ta style indicator backend.
@@ -0,0 +1,369 @@
1
+ Metadata-Version: 2.4
2
+ Name: trade-learn
3
+ Version: 0.2.0.0
4
+ Classifier: Development Status :: 3 - Alpha
5
+ Classifier: Intended Audience :: Financial and Insurance Industry
6
+ Classifier: License :: OSI Approved :: Apache Software License
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: Programming Language :: Python :: 3.10
9
+ Classifier: Programming Language :: Python :: 3.11
10
+ Classifier: Programming Language :: Python :: 3.12
11
+ Classifier: Operating System :: OS Independent
12
+ Requires-Dist: numpy>=1.26
13
+ Requires-Dist: pandas
14
+ Requires-Dist: scipy
15
+ Requires-Dist: statsmodels
16
+ Requires-Dist: scikit-learn
17
+ Requires-Dist: opentdx ; python_full_version >= '3.12'
18
+ Requires-Dist: pyarrow
19
+ Requires-Dist: pandas-ta-classic
20
+ Requires-Dist: ta-lib
21
+ Requires-Dist: pynesys-pynecore ; python_full_version >= '3.11'
22
+ Requires-Dist: xlsxwriter
23
+ Requires-Dist: bokeh
24
+ Requires-Dist: causal-learn
25
+ Requires-Dist: httpx
26
+ Requires-Dist: tqdm
27
+ Requires-Dist: typer
28
+ Requires-Dist: pydantic
29
+ Requires-Dist: pyyaml
30
+ Requires-Dist: jupyterlab ; extra == 'all'
31
+ Requires-Dist: jupyterlab-git ; extra == 'all'
32
+ Requires-Dist: ipywidgets ; extra == 'all'
33
+ Requires-Dist: jupyter-ai ; extra == 'all'
34
+ Requires-Dist: pygwalker ; extra == 'all'
35
+ Requires-Dist: mcp>=1.8.0 ; extra == 'all'
36
+ Requires-Dist: mlflow ; extra == 'all'
37
+ Requires-Dist: tradingview-datafeed ; extra == 'all'
38
+ Requires-Dist: riskfolio-lib ; extra == 'all'
39
+ Requires-Dist: optuna ; extra == 'all'
40
+ Requires-Dist: duckdb ; extra == 'all'
41
+ Requires-Dist: pytest ; extra == 'dev'
42
+ Requires-Dist: pytest-cov ; extra == 'dev'
43
+ Requires-Dist: ruff ; extra == 'dev'
44
+ Requires-Dist: interrogate ; extra == 'dev'
45
+ Requires-Dist: cibuildwheel ; extra == 'dev'
46
+ Requires-Dist: mkdocs-material ; extra == 'docs'
47
+ Requires-Dist: mkdocstrings-python ; extra == 'docs'
48
+ Requires-Dist: jupyterlab ; extra == 'lab'
49
+ Requires-Dist: jupyterlab-git ; extra == 'lab'
50
+ Requires-Dist: ipywidgets ; extra == 'lab'
51
+ Requires-Dist: jupyter-ai ; extra == 'lab'
52
+ Requires-Dist: pygwalker ; extra == 'lab'
53
+ Requires-Dist: mcp>=1.8.0 ; extra == 'lab'
54
+ Requires-Dist: mlflow ; extra == 'mlflow'
55
+ Requires-Dist: tradingview-datafeed ; extra == 'tv'
56
+ Provides-Extra: all
57
+ Provides-Extra: dev
58
+ Provides-Extra: docs
59
+ Provides-Extra: lab
60
+ Provides-Extra: mlflow
61
+ Provides-Extra: tv
62
+ License-File: LICENSE
63
+ License-File: NOTICE
64
+ Summary: Python quantitative research framework for traditional and ML strategies.
65
+ Home-Page: https://github.com/MuuYesen/trade-learn
66
+ Author: trade-learn contributors
67
+ License: Apache-2.0
68
+ Requires-Python: >=3.10
69
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
70
+ Project-URL: Documentation, https://muuyesen.github.io/trade-learn/
71
+ Project-URL: Homepage, https://github.com/MuuYesen/trade-learn
72
+
73
+ <p align="center">
74
+ <img src="docs/tradelearn-logo.png" alt="trade-learn logo" width="600" />
75
+ </p>
76
+
77
+ <p align="center">
78
+ <strong>Python 写策略与投研流程,Rust 扛事件驱动回测内核。</strong>
79
+ </p>
80
+
81
+ <p align="center">
82
+ <a href="./README_en.md">English version</a>
83
+ </p>
84
+
85
+ **trade-learn** 是一个把 **trade** 和 **learn** 放在同一条链路里的量化框架:面向指数增强、量化研究、机器学习策略和事件驱动回测。Python 保留策略表达、因子研究和模型实验的灵活性,Rust 承担撮合、订单推进、portfolio 计算这类高频回测内核;从研究、回测到报告和实验追踪,都围绕同一套可复现 workflow 展开。
86
+
87
+ 当前 wheel 版本为 **`0.2.0.0`**,对应 trade-learn **2.0 架构**;历史 `0.1.1.8` 仅作为 demo / 1.x 迁移参考。
88
+
89
+ 它想解决的不是"怎么跑一段回测",而是把一条完整的策略研发链路接起来:
90
+
91
+ <p align="center">
92
+ <img src="docs/research-flow.png" alt="trade-learn research flow" width="100%" />
93
+ </p>
94
+
95
+ trade-learn 的实现路径是先用 Engine 对齐专业 Backtrader 语义,再在同一套 runtime 上构建 Lite。这样 Lite 写起来短,但不是"另起一套简化撮合":它通过 Engine / Backtrader 这条桥验证底层有效性,也让快速写法和专业写法共享同一套 Stats、撮合和报告口径。
96
+
97
+ 你可以像写 Backtrader 一样写专业策略,也可以用 Lite API 快速验证一个想法;可以接入 TDX、TA-Lib、TradingView、pandas-ta-classic 等指标生态,也可以把因子分析、因果特征筛选、Optuna 参数优化、组合权重、回测报告和实验记录放进同一条工作流。
98
+
99
+ ## 核心亮点
100
+
101
+ - **Lite 是推荐起点**:更短的写法,适合快速验证、教学、1.x 风格迁移和多资产目标权重;不是另一套撮合逻辑,是同一 runtime 的轻量语法。
102
+ - **Backtrader 风格 Engine**:成熟事件驱动模型,适合复杂策略、组合策略、Analyzer / Sizer / Signal 和未来 paper / live adapter。Engine 先对齐 Backtrader,Lite 再复用 Engine 底层内核,这是正确性来源。
103
+ - **Rust single / multi-data runner**:单标的是一条数据流逐 bar 推进;多标的 panel 是同一个交易日推进全部 active symbols,适合指数增强和组合调仓。用户仍然只写 `next()`,runner 由数据形态自动选择。
104
+ - **性能基线透明**:本机基线(Backtrader 为 1.0x):
105
+ - 55 万 bar 单标的:Lite 约 **27.9x**、Engine 约 **11.0x**
106
+ - 1000 标的 20 年目标权重:Lite 约 **119.1x**、Engine 约 **69.7x**
107
+ - **双市场指标生态**:A 股偏 TDX / MyTT 口径(`tl.tdx` / `bt.tdx`),海外偏 TradingView(`tl.tv` / `bt.tv`)+ pandas-ta-classic / TA-Lib(`tl.pta` / `tl.talib`),口径**显式选择**。
108
+ - **Pipeline 投研流水线**:`FeatureSet` / `Pipeline` / `CausalSelector` / `ResearchRun` / `Allocator` 把训练 / 测试 / 预处理 / 评分 / 权重 / 回测连成一条链。
109
+ - **因子与报告**:alphalens / pyfolio 风格分析,HTML 报告、交互式 plot、CSV / XLSX artifacts。
110
+ - **MLflow / JupyterLab / MCP**:实验追踪、交互研究、自动化工具集成开箱即用。
111
+
112
+ ## 适合谁
113
+
114
+ - 已经会 Backtrader,但希望有更现代的报告、研究流水线和 Rust 回测内核
115
+ - 在做因子研究,希望从 alphalens 风格分析自然走到事件驱动回测
116
+ - 在做机器学习策略,希望把 train / test、预处理、因果筛选、评分、权重、回测和 MLflow 记录连起来
117
+ - 同时覆盖 A 股和海外市场,不想让指标口径、数据形态和报告体系割裂
118
+ - 同时维护规则策略和模型策略,不想让两套策略使用完全不同的数据、报告和实验体系
119
+
120
+ ## 安装
121
+
122
+ ```bash
123
+ pip install trade-learn
124
+ ```
125
+
126
+ 获取最新版本:
127
+
128
+ ```bash
129
+ pip install git+https://github.com/MuuYesen/trade-learn.git@master
130
+ ```
131
+
132
+ 可选 extras:
133
+
134
+ | extra | 用途 |
135
+ |---|---|
136
+ | `[lab]` | JupyterLab / Jupyter AI / MCP / Pygwalker 交互研究环境 |
137
+ | `[mlflow]` | MLflow tracking server 与实验 artifact 记录 |
138
+ | `[all]` | Lab、MLflow、Riskfolio-Lib、Optuna、DuckDB 等完整研究环境 |
139
+ | `[docs]` | 本地构建技术手册网站 |
140
+ | `[dev]` | 测试、lint、wheel 构建工具 |
141
+
142
+ ## 快速上手
143
+
144
+ **Lite——最短路径**(适合快速验证、教学、多资产目标权重):
145
+
146
+ ```python
147
+ import tradelearn.lite as tl
148
+ from tradelearn.data import TradingViewProvider
149
+
150
+
151
+ class LiteSmaCross(tl.Strategy):
152
+ fast = 10
153
+ slow = 20
154
+
155
+ def init(self):
156
+ self.fast_ma = tl.tdx.MA(self.data.close, N=self.fast)
157
+ self.slow_ma = tl.tdx.MA(self.data.close, N=self.slow)
158
+ self.start_on_bar(self.slow + 1)
159
+
160
+ def next(self):
161
+ if self.fast_ma[0] > self.slow_ma[0] and not self.position():
162
+ self.buy(size=100)
163
+ elif self.fast_ma[0] < self.slow_ma[0] and self.position():
164
+ self.position().close()
165
+
166
+
167
+ provider = TradingViewProvider(n_bars=500)
168
+ bars = provider.history_ohlc("NASDAQ:AAPL", start="2023-01-01", end="2024-01-01")
169
+
170
+ bt = tl.Backtest(bars, LiteSmaCross, cash=100_000, commission=0.0003, trade_on_close=True)
171
+ stats = bt.run()
172
+
173
+ print(stats.summary)
174
+ bt.plot("plot.html")
175
+ bt.report("report.html")
176
+ ```
177
+
178
+ **Engine——Backtrader 风格**(适合复杂 / 组合策略与未来 paper / live 模式):
179
+
180
+ ```python
181
+ import tradelearn.engine as bt
182
+ from tradelearn.data import TradingViewProvider
183
+
184
+
185
+ class SmaCross(bt.Strategy):
186
+ params = (("fast", 10), ("slow", 20))
187
+
188
+ def __init__(self):
189
+ self.fast = bt.tdx.MA(self.data.close, N=self.p.fast)
190
+ self.slow = bt.tdx.MA(self.data.close, N=self.p.slow)
191
+
192
+ def next(self):
193
+ if not self.position and self.fast[0] > self.slow[0]:
194
+ self.buy(size=100)
195
+ elif self.position and self.fast[0] < self.slow[0]:
196
+ self.close()
197
+
198
+
199
+ provider = TradingViewProvider(n_bars=500)
200
+ bars = provider.history_ohlc("NASDAQ:AAPL", start="2023-01-01", end="2024-01-01")
201
+
202
+ cerebro = bt.Cerebro(trade_on_close=True)
203
+ cerebro.setcash(100_000)
204
+ cerebro.setcommission(0.0003)
205
+ cerebro.adddata(bars, name="AAPL")
206
+ cerebro.addstrategy(SmaCross)
207
+
208
+ [strategy] = cerebro.run()
209
+ print(strategy.stats.summary)
210
+ ```
211
+
212
+ ## 投研流水线示例
213
+
214
+ README 只放最短可读版本,完整脚本见 [`examples/research/index_enhance_lite_pipeline.py`](./examples/research/index_enhance_lite_pipeline.py) 和 [`examples/research/index_enhance_engine_pipeline.py`](./examples/research/index_enhance_engine_pipeline.py)。
215
+
216
+ **1. Research:从原始行情生成特征、切分训练集 / 测试集**
217
+
218
+ ```python
219
+ import tradelearn.research as research
220
+ import tradelearn.research.preprocess as pp
221
+
222
+ feature_set = research.FeatureSet(
223
+ {
224
+ "alpha": lambda p: p.close.pct_change(20)
225
+ / p.close.pct_change().rolling(20).std(),
226
+ "size": lambda p: p.close,
227
+ },
228
+ target={"label": lambda p: p.close.shift(-20) / p.close - 1.0},
229
+ )
230
+
231
+ features = feature_set.fit_transform(bars, include_target=True).dropna()
232
+ train, test = research.time_split(features, split="2023-09-01", level="timestamp")
233
+ ```
234
+
235
+ **2. Pipeline:预处理、模型打分、生成权重**
236
+
237
+ ```python
238
+ from sklearn.ensemble import GradientBoostingRegressor
239
+ import tradelearn.research.portfolio as pf
240
+
241
+ pipe = research.Pipeline(
242
+ [
243
+ pp.Winsorizer(columns=["alpha"], limits=(0.05, 0.95)),
244
+ pp.Neutralizer(columns=["alpha"], exposures=["size"]),
245
+ pp.StandardScaler(columns=["alpha"]),
246
+ ]
247
+ )
248
+ train = pipe.fit_transform(train)
249
+ test = pipe.transform(test)
250
+
251
+ model = GradientBoostingRegressor(random_state=7)
252
+ model.fit(train[["alpha"]], train["label"])
253
+ scores = research.ModelScorer(model, features=("alpha",), current=False).predict(test)
254
+
255
+ weights = pf.Allocator(
256
+ select=pf.TopK(k=2),
257
+ weight=pf.EqualWeight(gross=0.95),
258
+ constrain=pf.Constraints(max_weight=0.5, normalize=True),
259
+ ).build(scores)
260
+ ```
261
+
262
+ **3. Portfolio:把目标权重交给 Lite / Engine 执行**
263
+
264
+ ```python
265
+ class LitePortfolio(tl.Strategy):
266
+ def next(self):
267
+ if len(self.data) % 20 == 0:
268
+ self.target_weights(self.research_result.weights[0], close_missing=True)
269
+
270
+
271
+ test_bars = research.split_bars(bars, split="2023-09-01")
272
+ stats = tl.Backtest(test_bars, LitePortfolio, cash=100_000).run(
273
+ research_result=research_result
274
+ )
275
+ ```
276
+
277
+ **4. Live-style:在策略里只用当前可见窗口推理**
278
+
279
+ 投研流水线适合离线训练和复盘;如果要让策略语义更接近 paper / live,可以把模型和 allocator 放进策略参数,在 `next()` 中用 `history_panel()` 只读取当前已经发生的窗口。
280
+
281
+ ```python
282
+ class LiveStylePortfolio(tl.Strategy):
283
+ lookback = 20
284
+
285
+ def init(self):
286
+ self.start_on_bar(self.lookback)
287
+
288
+ def next(self):
289
+ if len(self.data) % 20 != 0:
290
+ return
291
+
292
+ panel = self.history_panel(self.lookback)
293
+ features = self.feature_set.transform(panel).dropna()
294
+ scores = self.scorer.predict(features)
295
+ weights = self.allocator.build(scores)
296
+ self.target_weights(weights, close_missing=True)
297
+ ```
298
+
299
+ 完整版本:
300
+
301
+ | 目标 | 完整脚本 |
302
+ |---|---|
303
+ | Lite 投研 + 回测 + report + MLflow | [`examples/research/index_enhance_lite_pipeline.py`](./examples/research/index_enhance_lite_pipeline.py) |
304
+ | Engine 投研 + 回测 + report + MLflow | [`examples/research/index_enhance_engine_pipeline.py`](./examples/research/index_enhance_engine_pipeline.py) |
305
+ | Lite live-style 当前窗口推理 | [`examples/research/index_enhance_lite_live.py`](./examples/research/index_enhance_lite_live.py) |
306
+ | Engine live-style 当前窗口推理 | [`examples/research/index_enhance_engine_live.py`](./examples/research/index_enhance_engine_live.py) |
307
+ | Engine Backtrader 风格组合调仓 | [`examples/engine/11_target_percent_portfolio.py`](./examples/engine/11_target_percent_portfolio.py) |
308
+ | 资产类别组合策略 | [`examples/engine/12_asset_class_portfolios.py`](./examples/engine/12_asset_class_portfolios.py) |
309
+
310
+
311
+ ## 对齐与性能
312
+
313
+ 本机基线只看两个问题:结果是否对齐、吞吐是否明显快于 Backtrader。完整复现命令见 [性能基准](./docs/benchmarks.md)。
314
+
315
+ | 场景 | 引擎 | 数据量 | 耗时 | bars/s | 加速比 | 对齐值 |
316
+ |---|---|---:|---:|---:|---:|---:|
317
+ | 单标的 SMA | Lite | 550,000 bars | 1.3253s | 414,990 | 27.9x | Final Value 118,399.33 |
318
+ | 单标的 SMA | Engine | 550,000 bars | 3.3767s | 162,883 | 11.0x | Final Value 118,399.33 |
319
+ | 单标的 SMA | Backtrader | 550,000 bars | 37.0270s | 14,854 | 1.0x | Final Value 118,399.33 |
320
+ | 1000 标的 top-50 目标权重 | Lite | 5,040,000 bars | 2.407s | 2,094,237 | 119.1x | Final Value 4,199,638.26 |
321
+ | 1000 标的 top-50 目标权重 | Engine | 5,040,000 bars | 4.112s | 1,225,594 | 69.7x | Final Value 4,199,638.26 |
322
+ | 1000 标的 top-50 目标权重 | Backtrader | 5,040,000 bars | 286.538s | 17,589 | 1.0x | Final Value 4,199,638.26 |
323
+
324
+ ## 一致性承诺
325
+
326
+ trade-learn 把"对照基线"当作工程纪律:
327
+
328
+ - `metrics`(sharpe / max_dd / sortino / ...)对 empyrical:`rtol=1e-10`
329
+ - `tl.pta` / `bt.pta` 对 pandas-ta-classic:`rtol=1e-10`
330
+ - `tl.tdx` / `bt.tdx` 对 MyTT:`rtol=1e-10`
331
+ - `tl.tv` / `bt.tv` 对 pyneCore / TradingView:`rtol=1e-6`
332
+ - 回测 **trades**(决策层)对 Backtrader oracle:**0 差异**(时间 / 方向 / size)
333
+ - 回测 equity 对 oracle:`rtol=1e-6`,summary:`rtol=1e-4`,每条差异都登记在案
334
+
335
+ 详见 [设计笔记 → 与外部库的语义一致性](docs/internals/consistency.md)。
336
+
337
+ ## 完整文档
338
+
339
+ 完整技术手册(mkdocs 站点):[`docs/`](./docs/README.md)
340
+
341
+ | 主题 | 入口 |
342
+ |---|-------------------------------------------------------------------------|
343
+ | 30 行走通第一个回测 | [快速开始](./docs/quickstart.md) |
344
+ | Lite / Engine 用法 | [Lite 指南](./docs/guides/lite.md) · [Engine 指南](./docs/guides/engine.md) |
345
+ | 架构与边界 | [架构](./docs/concepts/architecture.md) |
346
+ | 因子 / ML / 权重研究流水线 | [Research 指南](./docs/guides/research.md) |
347
+ | 双口径指标(`tl.talib` / `tl.pta` / `tl.tdx` / `tl.tv`) | [Indicators 指南](./docs/guides/indicators.md) |
348
+ | 性能基线 | [性能基准](./docs/benchmarks.md) |
349
+ | 内核(契约 / 撮合 / portfolio / 事件循环) | [设计笔记](./docs/internals/contracts.md) |
350
+ | 完整 API | [API 参考](./docs/api/reference.md) |
351
+
352
+ 本地预览:
353
+
354
+ ```bash
355
+ uv run mkdocs serve
356
+ ```
357
+
358
+ ## 协议
359
+
360
+ Apache-2.0。融合的上游署名见 [`NOTICE`](./NOTICE):empyrical / alphalens / pyfolio / quantstats / MyTT / pandas-ta-classic / pyneCore / causallearn / DolphinDB。backtesting.py 与 backtrader 标注为"inspired by"——不复制源码。
361
+
362
+ ## 致谢
363
+
364
+ [Quantopian](https://github.com/quantopian) · [Trevor Stephens](https://github.com/trevorstephens) · [PyWhy](https://github.com/py-why) · [dodid](https://github.com/dodid) · [DolphinDB](https://github.com/dolphindb) · [happydasch](https://github.com/happydasch) · [mpquant](https://github.com/mpquant) · [baobao1997](https://github.com/baobao1997)
365
+
366
+ ## 联系方式
367
+
368
+ 微信公众号:知守溪的收纳屋 · 邮箱:muyes88@gmail.com
369
+