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,165 @@
1
+ # coding=utf-8
2
+ """
3
+ 符号计算引擎 - AST 优化器
4
+
5
+ 对 SQLExpression AST 进行优化,如常量折叠、死代码消除等。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import TYPE_CHECKING, Any, Set
11
+
12
+ if TYPE_CHECKING:
13
+ from QuantNodes.symbolic.expression import SQLExpression
14
+
15
+
16
+ class SQLOptimizer:
17
+ """
18
+ SQL AST 优化器
19
+
20
+ 对表达式进行各种优化:
21
+ - 常量折叠
22
+ - 冗余括号消除
23
+ - 恒等变换
24
+ """
25
+
26
+ def __init__(self):
27
+ self._visited: Set[int] = set()
28
+
29
+ def optimize(self, expr: "SQLExpression") -> "SQLExpression":
30
+ """
31
+ 优化表达式
32
+
33
+ Args:
34
+ expr: 输入表达式
35
+
36
+ Returns:
37
+ 优化后的表达式
38
+ """
39
+ from QuantNodes.symbolic.expression import (
40
+ ColumnRef, LiteralValue, SQLBinaryOp, SQLUnaryOp,
41
+ SQLComparison, SQLLogicalOp, SQLFunction, SQLCase,
42
+ )
43
+
44
+ if id(expr) in self._visited:
45
+ return expr
46
+
47
+ self._visited.add(id(expr))
48
+
49
+ if isinstance(expr, ColumnRef):
50
+ return expr
51
+ if isinstance(expr, LiteralValue):
52
+ return expr
53
+ if isinstance(expr, SQLBinaryOp):
54
+ return self._optimize_binary_op(expr)
55
+ if isinstance(expr, SQLUnaryOp):
56
+ return self._optimize_unary_op(expr)
57
+ if isinstance(expr, SQLComparison):
58
+ return self._optimize_comparison(expr)
59
+ if isinstance(expr, SQLLogicalOp):
60
+ return self._optimize_logical_op(expr)
61
+ if isinstance(expr, SQLFunction):
62
+ return self._optimize_function(expr)
63
+ if isinstance(expr, SQLCase):
64
+ return self._optimize_case(expr)
65
+
66
+ return expr
67
+
68
+ def _optimize_binary_op(self, expr: "SQLBinaryOp") -> "SQLExpression": # noqa: F821
69
+ """优化二元运算"""
70
+ left = self.optimize(expr.left)
71
+ right = self.optimize(expr.right)
72
+
73
+ from QuantNodes.symbolic.expression import LiteralValue, SQLBinaryOp
74
+
75
+ if isinstance(left, LiteralValue) and isinstance(right, LiteralValue):
76
+ return self._fold_binary_op(expr.op, left.value, right.value)
77
+
78
+ if expr.op == "+" and isinstance(right, LiteralValue) and right.value == 0:
79
+ return left
80
+ if expr.op == "-" and isinstance(right, LiteralValue) and right.value == 0:
81
+ return left
82
+ if expr.op == "*" and isinstance(right, LiteralValue) and right.value == 1:
83
+ return left
84
+ if expr.op == "*" and isinstance(left, LiteralValue) and left.value == 1:
85
+ return right
86
+ if expr.op == "/" and isinstance(right, LiteralValue) and right.value == 1:
87
+ return left
88
+
89
+ return SQLBinaryOp(left, expr.op, right)
90
+
91
+ def _optimize_unary_op(self, expr: "SQLUnaryOp") -> "SQLExpression": # noqa: F821
92
+ """优化一元运算"""
93
+ from QuantNodes.symbolic.expression import LiteralValue, SQLUnaryOp
94
+ operand = self.optimize(expr.operand)
95
+
96
+ if isinstance(operand, LiteralValue):
97
+ return self._fold_unary_op(expr.op, operand.value)
98
+
99
+ return SQLUnaryOp(expr.op, operand)
100
+
101
+ def _optimize_comparison(self, expr: "SQLComparison") -> "SQLExpression": # noqa: F821
102
+ """优化比较运算"""
103
+ left = self.optimize(expr.left) # noqa: F841 (placeholder for future folding)
104
+ right = self.optimize(expr.right) # noqa: F841
105
+ return expr
106
+
107
+ def _optimize_logical_op(self, expr: "SQLLogicalOp") -> "SQLExpression": # noqa: F821
108
+ """优化逻辑运算"""
109
+ from QuantNodes.symbolic.expression import LiteralValue, SQLLogicalOp
110
+ operands = [self.optimize(op) for op in expr.operands]
111
+
112
+ if expr.op == "AND":
113
+ for op in operands:
114
+ if isinstance(op, LiteralValue) and not op.value:
115
+ return LiteralValue(False)
116
+ if expr.op == "OR":
117
+ for op in operands:
118
+ if isinstance(op, LiteralValue) and op.value:
119
+ return LiteralValue(True)
120
+
121
+ return SQLLogicalOp(expr.op, *operands)
122
+
123
+ def _optimize_function(self, expr: "SQLFunction") -> "SQLExpression": # noqa: F821
124
+ """优化函数调用"""
125
+ args = [self.optimize(arg) for arg in expr.args] # noqa: F841 (placeholder)
126
+ kwargs = {k: self.optimize(v) for k, v in expr.kwargs.items()} # noqa: F841
127
+ return expr
128
+
129
+ def _optimize_case(self, expr: "SQLCase") -> "SQLExpression": # noqa: F821
130
+ """优化 CASE 表达式"""
131
+ return expr
132
+
133
+ def _fold_binary_op(self, op: str, a: Any, b: Any) -> "SQLExpression":
134
+ """常量折叠 - 二元运算"""
135
+ from QuantNodes.symbolic.expression import LiteralValue
136
+ try:
137
+ if op == "+":
138
+ return LiteralValue(a + b)
139
+ if op == "-":
140
+ return LiteralValue(a - b)
141
+ if op == "*":
142
+ return LiteralValue(a * b)
143
+ if op == "/":
144
+ return LiteralValue(a / b)
145
+ except Exception:
146
+ pass
147
+ return None
148
+
149
+ def _fold_unary_op(self, op: str, a: Any) -> "SQLExpression":
150
+ """常量折叠 - 一元运算"""
151
+ from QuantNodes.symbolic.expression import LiteralValue
152
+ try:
153
+ if op == "-":
154
+ return LiteralValue(-a)
155
+ if op == "+":
156
+ return LiteralValue(+a)
157
+ except Exception:
158
+ pass
159
+ return None
160
+
161
+
162
+ def optimize_expression(expr: "SQLExpression") -> "SQLExpression":
163
+ """便捷函数:优化表达式"""
164
+ optimizer = SQLOptimizer()
165
+ return optimizer.optimize(expr)
@@ -0,0 +1,30 @@
1
+ # coding=utf-8
2
+ """
3
+ DisplayNode - 数据可视化节点模块
4
+
5
+ 提供通用数据可视化节点,用于 Pipeline 中数据预处理。
6
+ """
7
+ from QuantNodes.ui_node.base import (
8
+ VisualizationType,
9
+ VisualizationData,
10
+ DisplayNode,
11
+ TableDisplayNode,
12
+ ChartDisplayNode,
13
+ MetricDisplayNode,
14
+ TextDisplayNode,
15
+ )
16
+
17
+ __all__ = [
18
+ "VisualizationType",
19
+ "VisualizationData",
20
+ "DisplayNode",
21
+ "TableDisplayNode",
22
+ "ChartDisplayNode",
23
+ "MetricDisplayNode",
24
+ "TextDisplayNode",
25
+ ]
26
+
27
+ # 向后兼容别名
28
+ DisplayType = VisualizationType
29
+ UIDisplayResult = VisualizationData
30
+ UINode = DisplayNode
@@ -0,0 +1,222 @@
1
+ # coding=utf-8
2
+ """
3
+ DisplayNode - 数据可视化节点模块
4
+
5
+ 提供通用数据可视化节点,将处理后的数据转换为前端可用的格式。
6
+ 支持表格、图表、指标、文本等可视化类型。
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from abc import ABC, abstractmethod
11
+ from typing import Any, Dict, List, Optional
12
+ from dataclasses import dataclass, field
13
+ from enum import Enum
14
+
15
+ import pandas as pd
16
+
17
+ from QuantNodes.core.node import BaseNode
18
+
19
+
20
+ class VisualizationType(str, Enum):
21
+ """可视化类型枚举"""
22
+ TABLE = "table"
23
+ CHART = "chart"
24
+ METRIC = "metric"
25
+ TEXT = "text"
26
+ IMAGE = "image"
27
+
28
+
29
+ @dataclass
30
+ class VisualizationData:
31
+ """可视化数据容器"""
32
+ viz_type: VisualizationType = VisualizationType.TABLE
33
+ title: str = ""
34
+ data: Any = None
35
+ columns: List[str] = field(default_factory=list)
36
+ metadata: Dict[str, Any] = field(default_factory=dict)
37
+
38
+
39
+ class DisplayNode(BaseNode[Any, VisualizationData], ABC):
40
+ """
41
+ 数据可视化节点基类
42
+
43
+ 提供统一的数据可视化接口,将处理后的数据转换为可视化格式。
44
+
45
+ Subclasses must implement:
46
+ _prepare_data(): 准备可视化数据
47
+ """
48
+
49
+ _enable_validation: bool = False
50
+ _enable_stats: bool = True
51
+
52
+ def __init__(self, name: str = None, config: Dict[str, Any] = None, **kwargs):
53
+ super().__init__(name=name or self.__class__.__name__, config=config, **kwargs)
54
+ self._viz_data: Optional[VisualizationData] = None
55
+
56
+ @abstractmethod
57
+ def _prepare_data(self, input_data: Any, **kwargs) -> VisualizationData:
58
+ """
59
+ 准备可视化数据
60
+
61
+ Args:
62
+ input_data: 输入数据
63
+ **kwargs: 额外参数
64
+
65
+ Returns:
66
+ 可视化数据
67
+ """
68
+ pass
69
+
70
+ def _execute(self, input_data: Any = None, **kwargs) -> VisualizationData:
71
+ """
72
+ 执行可视化数据准备
73
+
74
+ Args:
75
+ input_data: 输入数据
76
+ **kwargs: 额外参数
77
+
78
+ Returns:
79
+ 可视化数据
80
+ """
81
+ self._viz_data = self._prepare_data(input_data, **kwargs)
82
+ return self._viz_data
83
+
84
+
85
+ class TableDisplayNode(DisplayNode):
86
+ """
87
+ 表格显示节点
88
+
89
+ 将 DataFrame 或类表格数据转换为表格可视化格式。
90
+ """
91
+
92
+ def __init__(
93
+ self,
94
+ name: str = None,
95
+ config: Dict[str, Any] = None,
96
+ title: str = "",
97
+ **kwargs
98
+ ):
99
+ super().__init__(name=name or "TableDisplay", config=config, **kwargs)
100
+ self.title = title
101
+
102
+ def _prepare_data(self, input_data: Any, **kwargs) -> VisualizationData:
103
+ """准备表格数据"""
104
+ if isinstance(input_data, pd.DataFrame):
105
+ data = input_data
106
+ columns = list(input_data.columns)
107
+ elif isinstance(input_data, dict):
108
+ data = pd.DataFrame([input_data])
109
+ columns = list(input_data.keys())
110
+ else:
111
+ data = input_data
112
+ columns = []
113
+
114
+ return VisualizationData(
115
+ viz_type=VisualizationType.TABLE,
116
+ title=self.title,
117
+ data=data,
118
+ columns=columns,
119
+ metadata={}
120
+ )
121
+
122
+
123
+ class ChartDisplayNode(DisplayNode):
124
+ """
125
+ 图表显示节点
126
+
127
+ 将数据转换为图表可视化格式(Line/Bar/Area/Pie)。
128
+ """
129
+
130
+ CHART_TYPES = ["line", "bar", "area", "pie", "scatter"]
131
+
132
+ def __init__(
133
+ self,
134
+ name: str = None,
135
+ config: Dict[str, Any] = None,
136
+ title: str = "",
137
+ chart_type: str = "line",
138
+ **kwargs
139
+ ):
140
+ super().__init__(name=name or "ChartDisplay", config=config, **kwargs)
141
+ self.title = title
142
+ self.chart_type = chart_type if chart_type in self.CHART_TYPES else "line"
143
+
144
+ def _prepare_data(self, input_data: Any, **kwargs) -> VisualizationData:
145
+ """准备图表数据"""
146
+ if isinstance(input_data, pd.DataFrame):
147
+ data = input_data
148
+ elif isinstance(input_data, dict):
149
+ data = pd.DataFrame([input_data])
150
+ else:
151
+ data = input_data
152
+
153
+ return VisualizationData(
154
+ viz_type=VisualizationType.CHART,
155
+ title=self.title,
156
+ data=data,
157
+ metadata={"chart_type": self.chart_type}
158
+ )
159
+
160
+
161
+ class MetricDisplayNode(DisplayNode):
162
+ """
163
+ 指标显示节点
164
+
165
+ 将单个或多个指标值转换为指标可视化格式。
166
+ """
167
+
168
+ def __init__(
169
+ self,
170
+ name: str = None,
171
+ config: Dict[str, Any] = None,
172
+ title: str = "",
173
+ **kwargs
174
+ ):
175
+ super().__init__(name=name or "MetricDisplay", config=config, **kwargs)
176
+ self.title = title
177
+
178
+ def _prepare_data(self, input_data: Any, **kwargs) -> VisualizationData:
179
+ """准备指标数据"""
180
+ value = input_data
181
+ metadata = {}
182
+
183
+ if isinstance(input_data, dict):
184
+ value = input_data.get('value', input_data)
185
+ if 'delta' in input_data:
186
+ metadata['delta'] = input_data['delta']
187
+ if 'description' in input_data:
188
+ metadata['description'] = input_data['description']
189
+
190
+ return VisualizationData(
191
+ viz_type=VisualizationType.METRIC,
192
+ title=self.title,
193
+ data=value,
194
+ metadata=metadata
195
+ )
196
+
197
+
198
+ class TextDisplayNode(DisplayNode):
199
+ """
200
+ 文本显示节点
201
+
202
+ 将文本内容转换为文本可视化格式。
203
+ """
204
+
205
+ def __init__(
206
+ self,
207
+ name: str = None,
208
+ config: Dict[str, Any] = None,
209
+ title: str = "",
210
+ **kwargs
211
+ ):
212
+ super().__init__(name=name or "TextDisplay", config=config, **kwargs)
213
+ self.title = title
214
+
215
+ def _prepare_data(self, input_data: Any, **kwargs) -> VisualizationData:
216
+ """准备文本数据"""
217
+ return VisualizationData(
218
+ viz_type=VisualizationType.TEXT,
219
+ title=self.title,
220
+ data=input_data,
221
+ metadata={}
222
+ )