quantnodes 3.0.0__py3-none-any.whl

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 (399) hide show
  1. QuantNodes/__init__.py +15 -0
  2. QuantNodes/__main__.py +14 -0
  3. QuantNodes/agent/__init__.py +158 -0
  4. QuantNodes/agent/agents/__init__.py +13 -0
  5. QuantNodes/agent/agents/definition.py +180 -0
  6. QuantNodes/agent/agents/manager.py +73 -0
  7. QuantNodes/agent/config/__init__.py +34 -0
  8. QuantNodes/agent/config/executor.py +958 -0
  9. QuantNodes/agent/config/loader.py +427 -0
  10. QuantNodes/agent/config/templates/bollinger_bands.yaml +84 -0
  11. QuantNodes/agent/config/templates/dual_ma.yaml +72 -0
  12. QuantNodes/agent/config/templates/empty.yaml +56 -0
  13. QuantNodes/agent/config/templates/mean_reversion.yaml +47 -0
  14. QuantNodes/agent/config/templates/mean_reversion_zscore.yaml +90 -0
  15. QuantNodes/agent/config/templates/momentum.yaml +81 -0
  16. QuantNodes/agent/config/templates/momentum_breakout.yaml +84 -0
  17. QuantNodes/agent/config/templates/rsi_strategy.yaml +72 -0
  18. QuantNodes/agent/config/templates/volume_price.yaml +86 -0
  19. QuantNodes/agent/config/types.py +156 -0
  20. QuantNodes/agent/config_mapper.py +293 -0
  21. QuantNodes/agent/core/__init__.py +19 -0
  22. QuantNodes/agent/core/dream.py +47 -0
  23. QuantNodes/agent/core/quant_dream.py +274 -0
  24. QuantNodes/agent/cron_jobs.py +314 -0
  25. QuantNodes/agent/nanobot_bridge.py +242 -0
  26. QuantNodes/agent/permission/__init__.py +30 -0
  27. QuantNodes/agent/permission/defaults.py +36 -0
  28. QuantNodes/agent/permission/evaluate.py +41 -0
  29. QuantNodes/agent/permission/models.py +59 -0
  30. QuantNodes/agent/permission/service.py +133 -0
  31. QuantNodes/agent/providers/__init__.py +11 -0
  32. QuantNodes/agent/providers/base.py +102 -0
  33. QuantNodes/agent/providers/quantnodes.py +610 -0
  34. QuantNodes/agent/providers/rate_limiter.py +326 -0
  35. QuantNodes/agent/providers/registry.py +163 -0
  36. QuantNodes/agent/skills/__init__.py +20 -0
  37. QuantNodes/agent/skills/base.py +118 -0
  38. QuantNodes/agent/skills/bridge.py +73 -0
  39. QuantNodes/agent/skills/factor/__init__.py +14 -0
  40. QuantNodes/agent/skills/factor/correlation.py +99 -0
  41. QuantNodes/agent/skills/factor/group_backtest.py +114 -0
  42. QuantNodes/agent/skills/factor/ic_analysis.py +106 -0
  43. QuantNodes/agent/skills/loader.py +107 -0
  44. QuantNodes/agent/skills/registry.py +105 -0
  45. QuantNodes/agent/skills/strategy/__init__.py +16 -0
  46. QuantNodes/agent/skills/strategy/bollinger.py +86 -0
  47. QuantNodes/agent/skills/strategy/dual_ma.py +82 -0
  48. QuantNodes/agent/skills/strategy/momentum.py +74 -0
  49. QuantNodes/agent/skills/strategy/rsi_reversal.py +99 -0
  50. QuantNodes/agent/skills_quant/__init__.py +14 -0
  51. QuantNodes/agent/skills_quant/backtest-analyze/SKILL.md +42 -0
  52. QuantNodes/agent/skills_quant/config-driven/SKILL.md +72 -0
  53. QuantNodes/agent/skills_quant/factor-research/SKILL.md +40 -0
  54. QuantNodes/agent/skills_quant/quant-dream/SKILL.md +55 -0
  55. QuantNodes/agent/skills_quant/risk-management/SKILL.md +45 -0
  56. QuantNodes/agent/skills_quant/strategy-design/SKILL.md +43 -0
  57. QuantNodes/agent/templates/__init__.py +4 -0
  58. QuantNodes/agent/tools/__init__.py +173 -0
  59. QuantNodes/agent/tools/_workspace.py +51 -0
  60. QuantNodes/agent/tools/alpha_backtest.py +328 -0
  61. QuantNodes/agent/tools/alpha_evaluate.py +493 -0
  62. QuantNodes/agent/tools/backtest.py +226 -0
  63. QuantNodes/agent/tools/base.py +133 -0
  64. QuantNodes/agent/tools/code_search.py +207 -0
  65. QuantNodes/agent/tools/config_backtest.py +401 -0
  66. QuantNodes/agent/tools/context.py +97 -0
  67. QuantNodes/agent/tools/dream_skill.py +77 -0
  68. QuantNodes/agent/tools/echo.py +38 -0
  69. QuantNodes/agent/tools/factor.py +231 -0
  70. QuantNodes/agent/tools/file_ops.py +201 -0
  71. QuantNodes/agent/tools/git_ops.py +190 -0
  72. QuantNodes/agent/tools/operator_lookup.py +218 -0
  73. QuantNodes/agent/tools/output_truncation.py +77 -0
  74. QuantNodes/agent/tools/path_check.py +43 -0
  75. QuantNodes/agent/tools/pipeline.py +62 -0
  76. QuantNodes/agent/tools/registry.py +150 -0
  77. QuantNodes/agent/tools/sandbox.py +62 -0
  78. QuantNodes/agent/tools/shell_safety.py +63 -0
  79. QuantNodes/agent/tools/strategy.py +106 -0
  80. QuantNodes/agent/tools/task.py +171 -0
  81. QuantNodes/agent/tools/web_fetch.py +142 -0
  82. QuantNodes/agent/tools/web_search.py +114 -0
  83. QuantNodes/agent/tools/wiki.py +370 -0
  84. QuantNodes/agent/utils/__init__.py +11 -0
  85. QuantNodes/agent/utils/helpers.py +43 -0
  86. QuantNodes/agent/utils/prompt_templates.py +30 -0
  87. QuantNodes/agent/workflows/__init__.py +20 -0
  88. QuantNodes/agent/workflows/implementations/__init__.py +8 -0
  89. QuantNodes/agent/workflows/implementations/alpha_gpt.py +508 -0
  90. QuantNodes/agent/workflows/implementations/mcts.py +442 -0
  91. QuantNodes/agent/workflows/parsers.py +44 -0
  92. QuantNodes/agent/workflows/registry.py +119 -0
  93. QuantNodes/agent/workflows/step_agent.py +219 -0
  94. QuantNodes/agent/workflows/tool.py +198 -0
  95. QuantNodes/ai/__init__.py +93 -0
  96. QuantNodes/ai/llm/__init__.py +75 -0
  97. QuantNodes/ai/llm/base.py +233 -0
  98. QuantNodes/ai/llm/decorators.py +281 -0
  99. QuantNodes/ai/llm/gateway.py +571 -0
  100. QuantNodes/ai/llm/null.py +76 -0
  101. QuantNodes/ai/llm/openai.py +435 -0
  102. QuantNodes/ai/optimizer.py +405 -0
  103. QuantNodes/ai/prompts/__init__.py +229 -0
  104. QuantNodes/ai/sandbox.py +371 -0
  105. QuantNodes/ai/sandbox_pandas_bridge.py +150 -0
  106. QuantNodes/ai/strategy_gen.py +396 -0
  107. QuantNodes/backtest/__init__.py +64 -0
  108. QuantNodes/backtest/backtest_node.py +188 -0
  109. QuantNodes/backtest/broker_node.py +378 -0
  110. QuantNodes/backtest/config_runner.py +397 -0
  111. QuantNodes/backtest/config_strategy.py +64 -0
  112. QuantNodes/backtest/risk_node.py +360 -0
  113. QuantNodes/backtest/strategy_node.py +268 -0
  114. QuantNodes/cache_node/__init__.py +19 -0
  115. QuantNodes/cache_node/base.py +244 -0
  116. QuantNodes/cache_node/cache_store.py +99 -0
  117. QuantNodes/cache_node/metadata.py +100 -0
  118. QuantNodes/cli/__init__.py +109 -0
  119. QuantNodes/cli/_helpers.py +511 -0
  120. QuantNodes/cli/command.py +110 -0
  121. QuantNodes/cli/commands/__init__.py +69 -0
  122. QuantNodes/cli/commands/agent.py +158 -0
  123. QuantNodes/cli/commands/alpha.py +951 -0
  124. QuantNodes/cli/commands/chat.py +38 -0
  125. QuantNodes/cli/commands/evolve.py +120 -0
  126. QuantNodes/cli/commands/factor.py +569 -0
  127. QuantNodes/cli/commands/init.py +190 -0
  128. QuantNodes/cli/commands/run.py +259 -0
  129. QuantNodes/cli/commands/serve.py +398 -0
  130. QuantNodes/cli/commands/version.py +120 -0
  131. QuantNodes/cli/enhanced.py +146 -0
  132. QuantNodes/conf_node/__init__.py +37 -0
  133. QuantNodes/conf_node/base.py +120 -0
  134. QuantNodes/conf_node/env_config.py +132 -0
  135. QuantNodes/conf_node/ini_config.py +70 -0
  136. QuantNodes/conf_node/json_config.py +69 -0
  137. QuantNodes/conf_node/yaml_config.py +78 -0
  138. QuantNodes/constants.py +17 -0
  139. QuantNodes/core/__init__.py +196 -0
  140. QuantNodes/core/_lookback_helpers.py +49 -0
  141. QuantNodes/core/ast_parser.py +198 -0
  142. QuantNodes/core/base.py +61 -0
  143. QuantNodes/core/cache_manager.py +344 -0
  144. QuantNodes/core/cache_utils.py +150 -0
  145. QuantNodes/core/cond_builder.py +53 -0
  146. QuantNodes/core/config.py +170 -0
  147. QuantNodes/core/constants.py +48 -0
  148. QuantNodes/core/control.py +412 -0
  149. QuantNodes/core/data_preprocessing.py +453 -0
  150. QuantNodes/core/data_source.py +46 -0
  151. QuantNodes/core/events.py +178 -0
  152. QuantNodes/core/evolution/__init__.py +22 -0
  153. QuantNodes/core/evolution/loop.py +583 -0
  154. QuantNodes/core/evolution/operators.py +289 -0
  155. QuantNodes/core/evolution/settings.py +44 -0
  156. QuantNodes/core/expression.py +841 -0
  157. QuantNodes/core/feedback/__init__.py +38 -0
  158. QuantNodes/core/feedback/channels.py +182 -0
  159. QuantNodes/core/feedback/collector.py +91 -0
  160. QuantNodes/core/feedback/dataclass.py +239 -0
  161. QuantNodes/core/feedback/llm_judge.py +138 -0
  162. QuantNodes/core/knowledge/__init__.py +69 -0
  163. QuantNodes/core/knowledge/knowledge_base.py +217 -0
  164. QuantNodes/core/knowledge/lineage_compress.py +196 -0
  165. QuantNodes/core/knowledge/lineage_expand.py +123 -0
  166. QuantNodes/core/knowledge/metrics/__init__.py +43 -0
  167. QuantNodes/core/knowledge/metrics/evaluator.py +176 -0
  168. QuantNodes/core/knowledge/metrics/metrics.py +220 -0
  169. QuantNodes/core/knowledge/rag_prompt.py +196 -0
  170. QuantNodes/core/knowledge/retriever.py +209 -0
  171. QuantNodes/core/lambda_node.py +81 -0
  172. QuantNodes/core/monitoring/__init__.py +22 -0
  173. QuantNodes/core/monitoring/collector.py +292 -0
  174. QuantNodes/core/monitoring/dashboard.py +365 -0
  175. QuantNodes/core/node.py +375 -0
  176. QuantNodes/core/pandas_utils.py +504 -0
  177. QuantNodes/core/parallel/__init__.py +15 -0
  178. QuantNodes/core/parallel/worker.py +140 -0
  179. QuantNodes/core/parallel/worker_process.py +265 -0
  180. QuantNodes/core/path_utils.py +73 -0
  181. QuantNodes/core/pipeline.py +328 -0
  182. QuantNodes/core/plugin.py +135 -0
  183. QuantNodes/core/quality_gate/__init__.py +32 -0
  184. QuantNodes/core/quality_gate/complexity.py +94 -0
  185. QuantNodes/core/quality_gate/consistency.py +26 -0
  186. QuantNodes/core/quality_gate/node.py +97 -0
  187. QuantNodes/core/quality_gate/redundancy.py +51 -0
  188. QuantNodes/core/quality_gate/settings.py +43 -0
  189. QuantNodes/core/quality_gate/zoo.py +98 -0
  190. QuantNodes/core/serializable.py +116 -0
  191. QuantNodes/core/serialization.py +673 -0
  192. QuantNodes/core/tools.py +333 -0
  193. QuantNodes/core/trajectory/__init__.py +25 -0
  194. QuantNodes/core/trajectory/entry.py +116 -0
  195. QuantNodes/core/trajectory/lineage.py +67 -0
  196. QuantNodes/core/trajectory/pool.py +211 -0
  197. QuantNodes/core/trajectory/selector.py +140 -0
  198. QuantNodes/core/visualization/__init__.py +33 -0
  199. QuantNodes/core/visualization/builder.py +233 -0
  200. QuantNodes/core/visualization/gate_breakdown.py +140 -0
  201. QuantNodes/core/visualization/lineage_dag.py +203 -0
  202. QuantNodes/core/visualization/metric_distribution.py +125 -0
  203. QuantNodes/core/visualization/report.py +68 -0
  204. QuantNodes/database_node/__init__.py +69 -0
  205. QuantNodes/database_node/base.py +135 -0
  206. QuantNodes/database_node/clickhouse_node.py +272 -0
  207. QuantNodes/database_node/csv_node.py +83 -0
  208. QuantNodes/database_node/duckdb_node.py +86 -0
  209. QuantNodes/database_node/factory.py +83 -0
  210. QuantNodes/database_node/mysql_node.py +100 -0
  211. QuantNodes/database_node/parquet_node.py +75 -0
  212. QuantNodes/database_node/sqlite_node.py +67 -0
  213. QuantNodes/factor_node/__init__.py +50 -0
  214. QuantNodes/factor_node/factor.py +563 -0
  215. QuantNodes/factor_node/factor_db.py +421 -0
  216. QuantNodes/factor_node/factor_functions/__init__.py +252 -0
  217. QuantNodes/factor_node/factor_functions/_helpers.py +358 -0
  218. QuantNodes/factor_node/factor_functions/_helpers_debug.py +317 -0
  219. QuantNodes/factor_node/factor_functions/composite_ops.py +136 -0
  220. QuantNodes/factor_node/factor_functions/math_ops.py +433 -0
  221. QuantNodes/factor_node/factor_functions/section_ops.py +290 -0
  222. QuantNodes/factor_node/factor_functions/talib_ops.py +1293 -0
  223. QuantNodes/factor_node/factor_functions/time_ops.py +535 -0
  224. QuantNodes/factor_node/factor_operation.py +1115 -0
  225. QuantNodes/factor_node/factor_table.py +1073 -0
  226. QuantNodes/factor_node/quant_nodes_object.py +60 -0
  227. QuantNodes/mcp_server/__init__.py +27 -0
  228. QuantNodes/mcp_server/__main__.py +4 -0
  229. QuantNodes/mcp_server/server.py +272 -0
  230. QuantNodes/methods/__init__.py +28 -0
  231. QuantNodes/methods/pipeline.py +100 -0
  232. QuantNodes/methods/sandbox.py +102 -0
  233. QuantNodes/monitor/__init__.py +27 -0
  234. QuantNodes/monitor/agent_tools/__init__.py +5 -0
  235. QuantNodes/monitor/agent_tools/monitor_tool.py +98 -0
  236. QuantNodes/monitor/agent_tools/schedule_tool.py +98 -0
  237. QuantNodes/monitor/agent_tools/version_tool.py +133 -0
  238. QuantNodes/monitor/monitor/__init__.py +6 -0
  239. QuantNodes/monitor/monitor/alerter.py +60 -0
  240. QuantNodes/monitor/monitor/collector.py +164 -0
  241. QuantNodes/monitor/monitor/dashboard.py +115 -0
  242. QuantNodes/monitor/monitor/drift.py +190 -0
  243. QuantNodes/monitor/scheduler/__init__.py +4 -0
  244. QuantNodes/monitor/scheduler/runner.py +133 -0
  245. QuantNodes/monitor/scheduler/scheduler.py +184 -0
  246. QuantNodes/monitor/storage/__init__.py +16 -0
  247. QuantNodes/monitor/storage/models.py +70 -0
  248. QuantNodes/monitor/storage/repository.py +407 -0
  249. QuantNodes/monitor/version/__init__.py +4 -0
  250. QuantNodes/monitor/version/diff.py +81 -0
  251. QuantNodes/monitor/version/version_manager.py +182 -0
  252. QuantNodes/operator_node/__init__.py +28 -0
  253. QuantNodes/operator_node/base.py +97 -0
  254. QuantNodes/operator_node/query_node.py +129 -0
  255. QuantNodes/operator_node/sql_builder.py +125 -0
  256. QuantNodes/operator_node/sql_utils.py +172 -0
  257. QuantNodes/operator_node/transform.py +130 -0
  258. QuantNodes/operators/__init__.py +90 -0
  259. QuantNodes/operators/_engine.py +108 -0
  260. QuantNodes/operators/composite.py +161 -0
  261. QuantNodes/operators/composite_dag.py +667 -0
  262. QuantNodes/operators/composite_dag_ops.py +343 -0
  263. QuantNodes/operators/composite_dag_pandas_ops.py +382 -0
  264. QuantNodes/operators/custom.py +408 -0
  265. QuantNodes/operators/facade.py +164 -0
  266. QuantNodes/operators/math.py +163 -0
  267. QuantNodes/operators/proxy.py +29 -0
  268. QuantNodes/operators/registry.py +144 -0
  269. QuantNodes/operators/section.py +99 -0
  270. QuantNodes/operators/talib.py +757 -0
  271. QuantNodes/operators/templates.py +95 -0
  272. QuantNodes/operators/time_series.py +136 -0
  273. QuantNodes/prompts/__init__.py +20 -0
  274. QuantNodes/prompts/backtest/__init__.py +12 -0
  275. QuantNodes/prompts/backtest/factor_based.py +86 -0
  276. QuantNodes/prompts/backtest/standard.py +73 -0
  277. QuantNodes/prompts/factor/__init__.py +14 -0
  278. QuantNodes/prompts/factor/correlation.py +77 -0
  279. QuantNodes/prompts/factor/group_backtest.py +86 -0
  280. QuantNodes/prompts/factor/ic_analysis.py +91 -0
  281. QuantNodes/prompts/strategy/__init__.py +18 -0
  282. QuantNodes/prompts/strategy/market_neutral.py +96 -0
  283. QuantNodes/prompts/strategy/mean_reversion.py +107 -0
  284. QuantNodes/prompts/strategy/momentum.py +160 -0
  285. QuantNodes/prompts/strategy/pairs_trading.py +107 -0
  286. QuantNodes/prompts/strategy/trend_following.py +96 -0
  287. QuantNodes/research/README.md +106 -0
  288. QuantNodes/research/__init__.py +154 -0
  289. QuantNodes/research/_legacy_3c/__init__.py +61 -0
  290. QuantNodes/research/_legacy_3c/auto_researcher.py +289 -0
  291. QuantNodes/research/_legacy_3c/factor_evaluator.py +560 -0
  292. QuantNodes/research/_legacy_3c/factor_miner.py +318 -0
  293. QuantNodes/research/_legacy_3c/mcts_search.py +324 -0
  294. QuantNodes/research/factor_test/__init__.py +25 -0
  295. QuantNodes/research/factor_test/config.py +184 -0
  296. QuantNodes/research/factor_test/config_builder.py +276 -0
  297. QuantNodes/research/factor_test/e2e/data_prep.py +163 -0
  298. QuantNodes/research/factor_test/e2e/run_evolution_e2e.py +309 -0
  299. QuantNodes/research/factor_test/evolution_adapter.py +231 -0
  300. QuantNodes/research/factor_test/feedback_wrapper.py +102 -0
  301. QuantNodes/research/factor_test/ifind_db/__init__.py +7 -0
  302. QuantNodes/research/factor_test/ifind_db/fetcher.py +224 -0
  303. QuantNodes/research/factor_test/ifind_db/ifind_database.py +689 -0
  304. QuantNodes/research/factor_test/nodes/__init__.py +1 -0
  305. QuantNodes/research/factor_test/nodes/_base.py +91 -0
  306. QuantNodes/research/factor_test/nodes/adjust_date_node.py +48 -0
  307. QuantNodes/research/factor_test/nodes/configs.py +240 -0
  308. QuantNodes/research/factor_test/nodes/factor_neutralize_node.py +87 -0
  309. QuantNodes/research/factor_test/nodes/factor_preprocess_node.py +222 -0
  310. QuantNodes/research/factor_test/nodes/factor_score_node.py +141 -0
  311. QuantNodes/research/factor_test/nodes/factor_test_report_node.py +153 -0
  312. QuantNodes/research/factor_test/nodes/group_analyzer_node.py +317 -0
  313. QuantNodes/research/factor_test/nodes/ic_analyzer_node.py +112 -0
  314. QuantNodes/research/factor_test/nodes/load_data_node.py +100 -0
  315. QuantNodes/research/factor_test/nodes/long_short_node.py +93 -0
  316. QuantNodes/research/factor_test/nodes/neutralizers.py +222 -0
  317. QuantNodes/research/factor_test/nodes/preprocess_strategies.py +277 -0
  318. QuantNodes/research/factor_test/nodes/risk_correlation_node.py +112 -0
  319. QuantNodes/research/factor_test/nodes/sample_pool_filter_node.py +110 -0
  320. QuantNodes/research/factor_test/nodes/tradability_filter_node.py +92 -0
  321. QuantNodes/research/factor_test/pipeline_runner.py +305 -0
  322. QuantNodes/research/factor_test/pipeline_spec.py +216 -0
  323. QuantNodes/research/factor_test/utils/__init__.py +26 -0
  324. QuantNodes/research/factor_test/utils/constants.py +86 -0
  325. QuantNodes/research/factor_test/utils/data_loader.py +141 -0
  326. QuantNodes/research/factor_test/utils/date_utils.py +232 -0
  327. QuantNodes/research/factor_test/utils/file_loaders.py +150 -0
  328. QuantNodes/research/factor_test/utils/labels.py +37 -0
  329. QuantNodes/research/factor_test/utils/metrics_extractor.py +55 -0
  330. QuantNodes/research/factor_test/utils/performance_metrics.py +175 -0
  331. QuantNodes/research/factor_test/utils/safe_load.py +106 -0
  332. QuantNodes/research/quant_alpha/CHANGELOG.md +80 -0
  333. QuantNodes/research/quant_alpha/README.md +142 -0
  334. QuantNodes/research/quant_alpha/__init__.py +45 -0
  335. QuantNodes/research/quant_alpha/adapters/__init__.py +99 -0
  336. QuantNodes/research/quant_alpha/adapters/calculator.py +503 -0
  337. QuantNodes/research/quant_alpha/adapters/expression.py +387 -0
  338. QuantNodes/research/quant_alpha/alpha101_design/__init__.py +50 -0
  339. QuantNodes/research/quant_alpha/alpha101_design/few_shot_examples.py +243 -0
  340. QuantNodes/research/quant_alpha/alpha101_design/philosophy.py +474 -0
  341. QuantNodes/research/quant_alpha/alpha158_design/__init__.py +63 -0
  342. QuantNodes/research/quant_alpha/alpha158_design/few_shot_examples.py +219 -0
  343. QuantNodes/research/quant_alpha/alpha158_design/philosophy.py +240 -0
  344. QuantNodes/research/quant_alpha/evaluation/__init__.py +47 -0
  345. QuantNodes/research/quant_alpha/evaluation/baselines/__init__.py +8 -0
  346. QuantNodes/research/quant_alpha/evaluation/baselines/g1_handcrafted.py +135 -0
  347. QuantNodes/research/quant_alpha/evaluation/baselines/g2_llm_only.py +269 -0
  348. QuantNodes/research/quant_alpha/evaluation/baselines/g3_alpha_gpt.py +152 -0
  349. QuantNodes/research/quant_alpha/evaluation/clickhouse_data_loader.py +227 -0
  350. QuantNodes/research/quant_alpha/evaluation/contracts.py +376 -0
  351. QuantNodes/research/quant_alpha/evaluation/evaluators/__init__.py +6 -0
  352. QuantNodes/research/quant_alpha/evaluation/evaluators/polars_evaluator.py +545 -0
  353. QuantNodes/research/quant_alpha/evaluation/mock_data_loader.py +226 -0
  354. QuantNodes/research/quant_alpha/evaluation/runner.py +243 -0
  355. QuantNodes/research/quant_alpha/llm/__init__.py +38 -0
  356. QuantNodes/research/quant_alpha/llm/parser.py +681 -0
  357. QuantNodes/research/quant_alpha/logic_driven_pipeline.py +411 -0
  358. QuantNodes/research/quant_alpha/logic_mining/__init__.py +74 -0
  359. QuantNodes/research/quant_alpha/logic_mining/compiler.py +457 -0
  360. QuantNodes/research/quant_alpha/logic_mining/generator.py +366 -0
  361. QuantNodes/research/quant_alpha/logic_mining/models.py +252 -0
  362. QuantNodes/research/quant_alpha/logic_mining/parser.py +287 -0
  363. QuantNodes/research/quant_alpha/logic_mining/pipelines.py +297 -0
  364. QuantNodes/research/quant_alpha/logic_mining/sources.py +149 -0
  365. QuantNodes/research/quant_alpha/mcts/__init__.py +66 -0
  366. QuantNodes/research/quant_alpha/mcts/cache.py +262 -0
  367. QuantNodes/research/quant_alpha/mcts/extension_ops.py +320 -0
  368. QuantNodes/research/quant_alpha/mcts/feedback.py +825 -0
  369. QuantNodes/research/quant_alpha/mcts/op_prior.py +180 -0
  370. QuantNodes/research/quant_alpha/mcts/search.py +540 -0
  371. QuantNodes/research/quant_alpha/mcts/tree.py +201 -0
  372. QuantNodes/research/quant_alpha/operator_vocab/__init__.py +50 -0
  373. QuantNodes/research/quant_alpha/operator_vocab/config.py +54 -0
  374. QuantNodes/research/quant_alpha/operator_vocab/metadata.py +263 -0
  375. QuantNodes/research/quant_alpha/operator_vocab/vocabulary.py +481 -0
  376. QuantNodes/research/quant_alpha/pipeline.py +1027 -0
  377. QuantNodes/research/quant_alpha/types/__init__.py +27 -0
  378. QuantNodes/research/quant_alpha/types/constants.py +28 -0
  379. QuantNodes/research/quant_alpha/types/state.py +205 -0
  380. QuantNodes/research/quant_alpha/workflow/__init__.py +32 -0
  381. QuantNodes/research/quant_alpha/workflow/alpha_gpt.py +911 -0
  382. QuantNodes/research/quant_alpha/workflow/alpha_logics.py +416 -0
  383. QuantNodes/research/quant_alpha/workflow/state.py +27 -0
  384. QuantNodes/research/report_reproducer.py +485 -0
  385. QuantNodes/research/wiki.py +1155 -0
  386. QuantNodes/symbolic/__init__.py +51 -0
  387. QuantNodes/symbolic/compiler.py +113 -0
  388. QuantNodes/symbolic/dialect.py +260 -0
  389. QuantNodes/symbolic/executor.py +147 -0
  390. QuantNodes/symbolic/expression.py +234 -0
  391. QuantNodes/symbolic/functions.py +433 -0
  392. QuantNodes/symbolic/optimizer.py +165 -0
  393. QuantNodes/ui_node/__init__.py +30 -0
  394. QuantNodes/ui_node/base.py +222 -0
  395. quantnodes-3.0.0.dist-info/METADATA +463 -0
  396. quantnodes-3.0.0.dist-info/RECORD +399 -0
  397. quantnodes-3.0.0.dist-info/WHEEL +5 -0
  398. quantnodes-3.0.0.dist-info/entry_points.txt +24 -0
  399. quantnodes-3.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,163 @@
1
+ # coding=utf-8
2
+ """
3
+ 数学算子(代理层)
4
+
5
+ 基于 factor_functions/math_ops.py 的实现,提供统一的类接口。
6
+
7
+ Available Operators:
8
+ - add: 加法
9
+ - sub: 减法
10
+ - mul: 乘法
11
+ - div: 除法
12
+ - log: 对数
13
+ - abs: 绝对值
14
+ - pow: 幂运算
15
+ - sqrt: 平方根
16
+ - sign: 符号
17
+ - clip: 裁剪
18
+ - fill_null: 填充空值
19
+ - nan_to_null: NaN 转 null
20
+
21
+ Usage:
22
+ >>> math.add(pl.col("factor"), 1.0)
23
+ >>> math.mul(pl.col("factor"), 0.5)
24
+ >>> math.log(pl.col("factor"))
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ from typing import Union, Optional
30
+
31
+ import polars as pl
32
+ from polars import Expr
33
+
34
+ from QuantNodes.factor_node.factor_functions.math_ops import (
35
+ log as _log,
36
+ log1p as _log1p,
37
+ abs as _abs,
38
+ sqrt as _sqrt,
39
+ sign as _sign,
40
+ pow as _pow,
41
+ clip as _clip,
42
+ fill_null as _fill_null,
43
+ fill_zero as _fill_zero,
44
+ nan_to_null as _nan_to_null,
45
+ ceil as _ceil,
46
+ floor as _floor,
47
+ sin as _sin,
48
+ cos as _cos,
49
+ tan as _tan,
50
+ arcsin as _arcsin,
51
+ arccos as _arccos,
52
+ arctan as _arctan,
53
+ )
54
+
55
+
56
+ class MathOperators:
57
+ """数学算子(代理层)"""
58
+
59
+ @staticmethod
60
+ def add(expr: Union[Expr, str], value: Union[float, Expr]) -> Expr:
61
+ if isinstance(expr, str):
62
+ expr = pl.col(expr)
63
+ return expr + value
64
+
65
+ @staticmethod
66
+ def sub(expr: Union[Expr, str], value: Union[float, Expr]) -> Expr:
67
+ if isinstance(expr, str):
68
+ expr = pl.col(expr)
69
+ return expr - value
70
+
71
+ @staticmethod
72
+ def mul(expr: Union[Expr, str], value: Union[float, Expr]) -> Expr:
73
+ if isinstance(expr, str):
74
+ expr = pl.col(expr)
75
+ return expr * value
76
+
77
+ @staticmethod
78
+ def div(expr: Union[Expr, str], value: Union[float, Expr]) -> Expr:
79
+ if isinstance(expr, str):
80
+ expr = pl.col(expr)
81
+ if isinstance(value, (int, float)):
82
+ return expr / (value + 1e-10)
83
+ else:
84
+ return expr / (value + 1e-10)
85
+
86
+ @staticmethod
87
+ def log(expr: Union[Expr, str], base: Optional[str] = None) -> Expr:
88
+ return _log(expr, base=base)
89
+
90
+ @staticmethod
91
+ def log1p(expr: Union[Expr, str]) -> Expr:
92
+ return _log1p(expr)
93
+
94
+ @staticmethod
95
+ def abs(expr: Union[Expr, str]) -> Expr:
96
+ return _abs(expr)
97
+
98
+ @staticmethod
99
+ def sqrt(expr: Union[Expr, str]) -> Expr:
100
+ return _sqrt(expr)
101
+
102
+ @staticmethod
103
+ def sign(expr: Union[Expr, str]) -> Expr:
104
+ return _sign(expr)
105
+
106
+ @staticmethod
107
+ def pow(expr: Union[Expr, str], exponent: float = 2.0) -> Expr:
108
+ return _pow(expr, exponent=exponent)
109
+
110
+ @staticmethod
111
+ def clip(expr: Union[Expr, str], lower: Optional[float] = None,
112
+ upper: Optional[float] = None) -> Expr:
113
+ return _clip(expr, lower=lower, upper=upper)
114
+
115
+ @staticmethod
116
+ def floor(expr: Union[Expr, str]) -> Expr:
117
+ return _floor(expr)
118
+
119
+ @staticmethod
120
+ def ceil(expr: Union[Expr, str]) -> Expr:
121
+ return _ceil(expr)
122
+
123
+ @staticmethod
124
+ def nan_to_null(expr: Union[Expr, str]) -> Expr:
125
+ return _nan_to_null(expr)
126
+
127
+ @staticmethod
128
+ def fill_null(expr: Union[Expr, str], value: Union[float, str] = 0.0) -> Expr:
129
+ return _fill_null(expr, value=value)
130
+
131
+ @staticmethod
132
+ def fill_zero(expr: Union[Expr, str]) -> Expr:
133
+ return _fill_zero(expr)
134
+
135
+ @staticmethod
136
+ def round(expr: Union[Expr, str], decimals: int = 0) -> Expr:
137
+ if isinstance(expr, str):
138
+ expr = pl.col(expr)
139
+ return expr.round(decimals)
140
+
141
+ @staticmethod
142
+ def sin(expr: Union[Expr, str]) -> Expr:
143
+ return _sin(expr)
144
+
145
+ @staticmethod
146
+ def cos(expr: Union[Expr, str]) -> Expr:
147
+ return _cos(expr)
148
+
149
+ @staticmethod
150
+ def tan(expr: Union[Expr, str]) -> Expr:
151
+ return _tan(expr)
152
+
153
+ @staticmethod
154
+ def arcsin(expr: Union[Expr, str]) -> Expr:
155
+ return _arcsin(expr)
156
+
157
+ @staticmethod
158
+ def arccos(expr: Union[Expr, str]) -> Expr:
159
+ return _arccos(expr)
160
+
161
+ @staticmethod
162
+ def arctan(expr: Union[Expr, str]) -> Expr:
163
+ return _arctan(expr)
@@ -0,0 +1,29 @@
1
+ # coding=utf-8
2
+ """
3
+ operators.proxy - 统一代理层
4
+
5
+ 本模块从 factor_functions 导出注册表 API,
6
+ 作为 operators 模块的统一代理入口。
7
+
8
+ Agent 系统应从本模块导入,而非直接从 factor_functions 导入。
9
+ """
10
+
11
+ from QuantNodes.factor_node.factor_functions import (
12
+ list_operators,
13
+ get_operator,
14
+ register_operator,
15
+ operator_info,
16
+ generate_documentation,
17
+ OperatorCategory,
18
+ _OPERATOR_REGISTRY,
19
+ )
20
+
21
+ __all__ = [
22
+ "list_operators",
23
+ "get_operator",
24
+ "register_operator",
25
+ "operator_info",
26
+ "generate_documentation",
27
+ "OperatorCategory",
28
+ "_OPERATOR_REGISTRY",
29
+ ]
@@ -0,0 +1,144 @@
1
+ # coding=utf-8
2
+ """
3
+ operators.registry - 用户自定义算子隔离注册表
4
+
5
+ 用户通过 CustomOperator 注册的算子存储在此注册表,
6
+ 与内置 _OPERATOR_REGISTRY 完全隔离。
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import inspect
12
+ from typing import Any, Callable, Dict, List, Optional, Tuple
13
+
14
+
15
+ class _CustomOperatorRegistry:
16
+ """用户自定义算子隔离注册表"""
17
+
18
+ _registry: Dict[str, Dict[str, Dict[str, Any]]] = {
19
+ "point": {},
20
+ "time": {},
21
+ "section": {},
22
+ "multi_section": {},
23
+ "talib": {},
24
+ }
25
+ _aliases: Dict[str, Tuple[str, str]] = {}
26
+
27
+ @classmethod
28
+ def register(
29
+ cls,
30
+ category: str,
31
+ name: str,
32
+ func: Callable,
33
+ doc: str = "",
34
+ params: Optional[Dict[str, Any]] = None,
35
+ aliases: Optional[List[str]] = None,
36
+ ) -> None:
37
+ """注册算子到隔离注册表"""
38
+ try:
39
+ source = inspect.getsource(func)
40
+ except (OSError, TypeError):
41
+ source = ""
42
+
43
+ cls._registry.setdefault(category, {})
44
+ cls._registry[category][name] = {
45
+ "name": name,
46
+ "category": category,
47
+ "func": func,
48
+ "doc": doc or inspect.getdoc(func) or "",
49
+ "params": params or {},
50
+ "source": source,
51
+ }
52
+
53
+ for alias in (aliases or []):
54
+ cls._aliases[alias] = (name, category)
55
+
56
+ @classmethod
57
+ def register_alias(cls, alias: str, name: str, category: str) -> None:
58
+ """注册别名"""
59
+ cls._aliases[alias] = (name, category)
60
+
61
+ @classmethod
62
+ def get(cls, name: str, category: Optional[str] = None) -> Optional[Callable]:
63
+ """获取算子函数(支持别名)"""
64
+ if name in cls._aliases:
65
+ name, category = cls._aliases[name]
66
+
67
+ if category:
68
+ return cls._registry.get(category, {}).get(name, {}).get("func")
69
+
70
+ for cat in cls._registry:
71
+ if name in cls._registry[cat]:
72
+ return cls._registry[cat][name]["func"]
73
+ return None
74
+
75
+ @classmethod
76
+ def list(cls, category: Optional[str] = None) -> List[str]:
77
+ """列出算子名称"""
78
+ if category:
79
+ return list(cls._registry.get(category, {}).keys())
80
+ return [name for cat in cls._registry for name in cls._registry[cat]]
81
+
82
+ @classmethod
83
+ def info(cls, name: str) -> Optional[Dict[str, Any]]:
84
+ """获取算子详细信息"""
85
+ if name in cls._aliases:
86
+ name, category = cls._aliases[name]
87
+ for cat in cls._registry:
88
+ if name in cls._registry[cat]:
89
+ return cls._registry[cat][name]
90
+ return None
91
+
92
+ @classmethod
93
+ def unregister(cls, name: str, category: Optional[str] = None) -> bool:
94
+ """注销算子"""
95
+ if name in cls._aliases:
96
+ _, cat = cls._aliases.pop(name)
97
+ cls._registry.get(cat, {}).pop(name, None)
98
+ return True
99
+
100
+ if category:
101
+ removed = cls._registry.get(category, {}).pop(name, None)
102
+ return removed is not None
103
+
104
+ for cat in cls._registry:
105
+ if cls._registry[cat].pop(name, None):
106
+ return True
107
+ return False
108
+
109
+ @classmethod
110
+ def unregister_all(cls) -> int:
111
+ """注销所有自定义算子,返回数量"""
112
+ count = 0
113
+ for cat in cls._registry:
114
+ count += len(cls._registry[cat])
115
+ cls._registry[cat].clear()
116
+ cls._aliases.clear()
117
+ return count
118
+
119
+ @classmethod
120
+ def export_dict(cls) -> Dict[str, Dict[str, Dict[str, Any]]]:
121
+ """导出为字典"""
122
+ return cls._registry
123
+
124
+ @classmethod
125
+ def import_dict(cls, data: Dict[str, Dict[str, Dict[str, Any]]]) -> int:
126
+ """从字典导入,返回导入数量"""
127
+ count = 0
128
+ for category, operators in data.items():
129
+ for name, info in operators.items():
130
+ if "func" in info:
131
+ cls.register(
132
+ category,
133
+ name,
134
+ info["func"],
135
+ info.get("doc", ""),
136
+ info.get("params", {}),
137
+ )
138
+ count += 1
139
+ return count
140
+
141
+ @classmethod
142
+ def count(cls) -> int:
143
+ """返回注册的自定义算子数量"""
144
+ return len(cls.list())
@@ -0,0 +1,99 @@
1
+ # coding=utf-8
2
+ """
3
+ 截面算子(代理层)
4
+
5
+ 基于 factor_functions/section_ops.py 的实现,提供统一的类接口。
6
+
7
+ Available Operators:
8
+ - rank: 截面排名
9
+ - zscore: Z-score 标准化
10
+ - winsorize: 去极值
11
+ - neutralize: 行业中性
12
+ - neutralize_market: 市场中性
13
+ - scale: 归一化
14
+ - percentile: 百分位排名
15
+ - ic: 信息系数
16
+ - rank_ic: 秩信息系数
17
+ - group_norm: 分组标准化
18
+ - group_winsorize: 分组去极值
19
+
20
+ Usage:
21
+ >>> sec.rank(pl.col("factor"))
22
+ >>> sec.zscore(pl.col("factor"))
23
+ >>> sec.winsorize(pl.col("factor"), 0.01, 0.01)
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ from typing import TYPE_CHECKING, Union
29
+
30
+ import polars as pl
31
+ from polars import Expr
32
+
33
+ if TYPE_CHECKING:
34
+ pass
35
+
36
+ from QuantNodes.factor_node.factor_functions.section_ops import (
37
+ rank as _rank,
38
+ zscore as _zscore,
39
+ winsorize as _winsorize,
40
+ neutralize as _neutralize,
41
+ neutralize_market as _neutralize_market,
42
+ scale as _scale,
43
+ ic as _ic,
44
+ rank_ic as _rank_ic,
45
+ group_norm as _group_norm,
46
+ group_winsorize as _group_winsorize,
47
+ )
48
+
49
+
50
+ class SectionOperators:
51
+ """截面算子(代理层)"""
52
+
53
+ @staticmethod
54
+ def rank(expr: Union[Expr, str], method: str = "dense") -> Expr:
55
+ return _rank(expr, method=method)
56
+
57
+ @staticmethod
58
+ def zscore(expr: Union[Expr, str], eps: float = 1e-8) -> Expr:
59
+ return _zscore(expr, eps=eps)
60
+
61
+ @staticmethod
62
+ def winsorize(expr: Union[Expr, str], lower: float = 0.01, upper: float = 0.01,
63
+ method: str = "quantile") -> Expr:
64
+ return _winsorize(expr, lower=lower, upper=upper, method=method)
65
+
66
+ @staticmethod
67
+ def neutralize(expr: Union[Expr, str], group: Union[Expr, str]) -> Expr:
68
+ return _neutralize(expr, group=group)
69
+
70
+ @staticmethod
71
+ def neutralize_market(expr: Union[Expr, str]) -> Expr:
72
+ return _neutralize_market(expr)
73
+
74
+ @staticmethod
75
+ def scale(expr: Union[Expr, str], method: str = "zscore") -> Expr:
76
+ return _scale(expr, method=method)
77
+
78
+ @staticmethod
79
+ def percentile(expr: Union[Expr, str]) -> Expr:
80
+ e = expr if isinstance(expr, Expr) else pl.col(expr)
81
+ col_name = expr if isinstance(expr, str) else "percentile"
82
+ return (e.rank() / e.count()).alias(col_name)
83
+
84
+ @staticmethod
85
+ def rank_ic(expr: Union[Expr, str], target: Union[Expr, str]) -> Expr:
86
+ return _rank_ic(expr, target=target)
87
+
88
+ @staticmethod
89
+ def ic(expr: Union[Expr, str], target: Union[Expr, str]) -> Expr:
90
+ return _ic(expr, target=target)
91
+
92
+ @staticmethod
93
+ def group_norm(expr: Union[Expr, str], group: Union[Expr, str], method: str = "zscore") -> Expr:
94
+ return _group_norm(expr, group=group, method=method)
95
+
96
+ @staticmethod
97
+ def group_winsorize(expr: Union[Expr, str], group: Union[Expr, str],
98
+ lower: float = 0.01, upper: float = 0.01) -> Expr:
99
+ return _group_winsorize(expr, group=group, lower=lower, upper=upper)