rust-pyfunc 0.78.0__tar.gz → 0.80.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/.gitignore +1 -0
  2. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/Cargo.lock +35 -1
  3. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/Cargo.toml +9 -2
  4. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/PKG-INFO +1 -1
  5. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/alter.sh +5 -0
  6. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/core_functions.pyi +101 -0
  7. rust_pyfunc-0.80.0/src/bin/worker_pipeline.rs +101 -0
  8. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/factor_neutralization_io_optimized.rs +37 -25
  9. rust_pyfunc-0.80.0/src/factor_pipeline.rs +684 -0
  10. rust_pyfunc-0.80.0/src/fast_csv_reader.rs +822 -0
  11. rust_pyfunc-0.80.0/src/features.rs +645 -0
  12. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lib.rs +29 -0
  13. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lz_complexity.rs +2 -2
  14. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_pair_metrics.rs +131 -34
  15. rust_pyfunc-0.80.0/src/order_pair_metrics_pipeline.rs +1968 -0
  16. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/mod.rs +1 -1
  17. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v4_pipeline.rs +4 -3
  18. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/trend_mod.rs +1 -1
  19. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/.factory/settings.json +0 -0
  20. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/.github/workflows/CI.yml +0 -0
  21. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/.github/workflows/deploy.yml +0 -0
  22. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/FACTOR_NEUTRALIZATION_REQUIREMENTS.md +0 -0
  23. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/README.md +0 -0
  24. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/agents/skills/agent-trading-builder/SKILL.md +0 -0
  25. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/PriceTree.html +0 -0
  26. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/PriceTreeViz.html +0 -0
  27. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/RollingFutureAccessor.html +0 -0
  28. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/TRADE_PEAK_ANALYSIS_README.md +0 -0
  29. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/brachistochrone_curve.html +0 -0
  30. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/calculate_shannon_entropy_change.html +0 -0
  31. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/calculate_shannon_entropy_change_at_low.html +0 -0
  32. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/compute_max_eigenvalue.html +0 -0
  33. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dct_basis_functions.html +0 -0
  34. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dct_path_patterns.html +0 -0
  35. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dct_reconstruction.html +0 -0
  36. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dct_visualization.py +0 -0
  37. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dtw_distance.html +0 -0
  38. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_follow_volume_sum_same_price.html +0 -0
  39. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_follow_volume_sum_same_price_and_flag.html +0 -0
  40. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_half_energy_time.html +0 -0
  41. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_local_peaks_within_window.html +0 -0
  42. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_max_range_product.html +0 -0
  43. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/identify_segments.html +0 -0
  44. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/index.html +0 -0
  45. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/jaccard_similarity.html +0 -0
  46. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/mark_follow_groups.html +0 -0
  47. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/mark_follow_groups_with_flag.html +0 -0
  48. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/max_range_loop.html +0 -0
  49. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/min_range_loop.html +0 -0
  50. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/min_word_edit_distance.html +0 -0
  51. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/ols.html +0 -0
  52. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/ols_predict.html +0 -0
  53. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/ols_residuals.html +0 -0
  54. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/parallel_computing_system.md +0 -0
  55. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/rolling_cv.html +0 -0
  56. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/rolling_qcv.html +0 -0
  57. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/rolling_volatility.html +0 -0
  58. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/rolling_window_stat.html +0 -0
  59. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/search_data.json +0 -0
  60. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/static/search.js +0 -0
  61. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/static/style.css +0 -0
  62. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/sum_as_string.html +0 -0
  63. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/transfer_entropy.html +0 -0
  64. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/trend.html +0 -0
  65. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/trend_fast.html +0 -0
  66. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/vectorize_sentences.html +0 -0
  67. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/vectorize_sentences_list.html +0 -0
  68. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs//344/275/277/347/224/250/350/257/264/346/230/216.md" +0 -0
  69. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs//345/256/214/346/210/220/346/200/273/347/273/223.md" +0 -0
  70. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs_generator.py +0 -0
  71. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/ds_plan_true.md +0 -0
  72. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/freeze_version.sh +0 -0
  73. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/hmm_visualizer.py +0 -0
  74. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/pyproject.toml +0 -0
  75. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/__init__.py +0 -0
  76. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/__init__.pyi +0 -0
  77. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/abm_analysis.py +0 -0
  78. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/agent_simulator.pyi +0 -0
  79. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/agent_trading_daily.py +0 -0
  80. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/agent_trading_daily.pyi +0 -0
  81. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/copula.pyi +0 -0
  82. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/factor_task.py +0 -0
  83. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/factor_taskd.py +0 -0
  84. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/minute_data_reader.py +0 -0
  85. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_correlation.py +0 -0
  86. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_correlation.pyi +0 -0
  87. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_corrwith.py +0 -0
  88. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_extensions.pyi +0 -0
  89. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_merge.py +0 -0
  90. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_rank.py +0 -0
  91. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/parallel_computing.pyi +0 -0
  92. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/rolling_future.py +0 -0
  93. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/rolling_past.py +0 -0
  94. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/statistical_analysis.pyi +0 -0
  95. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/text_analysis.pyi +0 -0
  96. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/theme_cluster_factors.pyi +0 -0
  97. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/theme_feature_expansion.pyi +0 -0
  98. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/theme_feature_expansion_data.py +0 -0
  99. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/theme_feature_expansion_data.pyi +0 -0
  100. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/time_series.pyi +0 -0
  101. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/trading_analysis.pyi +0 -0
  102. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/trading_data_utils.py +0 -0
  103. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/trading_data_utils.pyi +0 -0
  104. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/trading_day.py +0 -0
  105. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/tree_structures.pyi +0 -0
  106. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/treevisual.py +0 -0
  107. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/web_manager.py +0 -0
  108. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/web_manager.pyi +0 -0
  109. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/rust-toolchain.toml +0 -0
  110. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/abnormal_asks_analyzer.rs +0 -0
  111. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/acceleration_follow_agent.rs +0 -0
  112. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/bottom_fishing_agent.rs +0 -0
  113. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/buy_ratio_agent.rs +0 -0
  114. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/exhaustion_reversal_agent.rs +0 -0
  115. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/follow_flow_agent.rs +0 -0
  116. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/mod.rs +0 -0
  117. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/momentum_agent.rs +0 -0
  118. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/py_bindings.rs +0 -0
  119. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/simulator.rs +0 -0
  120. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/trait_def.rs +0 -0
  121. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/types.rs +0 -0
  122. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/utils.rs +0 -0
  123. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/core.rs +0 -0
  124. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/metrics.rs +0 -0
  125. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/mod.rs +0 -0
  126. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/py_bindings.rs +0 -0
  127. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/types.rs +0 -0
  128. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_validation/factors_extra.rs +0 -0
  129. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_validation/mod.rs +0 -0
  130. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_validation/py_bindings.rs +0 -0
  131. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/allo_microstructure.rs +0 -0
  132. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/allo_microstructure_v2.rs +0 -0
  133. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/allo_microstructure_v3.rs +0 -0
  134. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/backup_column_cache.rs +0 -0
  135. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/backup_reader.rs +0 -0
  136. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/backup_writer.rs +0 -0
  137. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/column_correlation.rs +0 -0
  138. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/copula.rs +0 -0
  139. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/corr_diff_features.rs +0 -0
  140. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/cross_stock_regression.rs +0 -0
  141. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/cross_stock_regression_fast.rs +0 -0
  142. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/cross_stock_regression_peak.rs +0 -0
  143. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/dct_transform.rs +0 -0
  144. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/difference_matrix.rs +0 -0
  145. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/effective_memory_length.rs +0 -0
  146. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/entropy_analysis.rs +0 -0
  147. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/error/mod.rs +0 -0
  148. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/frontier_dist.rs +0 -0
  149. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/ghost_market_maker.rs +0 -0
  150. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/gp_correlation_dimension.rs +0 -0
  151. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/grouping.rs +0 -0
  152. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/hawkes_advisor.rs +0 -0
  153. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/hawkes_analysis.rs +0 -0
  154. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/illusion_liquidity_distance.rs +0 -0
  155. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/integer_small_peak_features.rs +0 -0
  156. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lagged_regression.rs +0 -0
  157. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lagged_regression_incremental.rs +0 -0
  158. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lagged_regression_optimized.rs +0 -0
  159. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lagged_regression_simd.rs +0 -0
  160. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/limit_order_lifecycle.rs +0 -0
  161. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/limit_order_lifecycle_v2.rs +0 -0
  162. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/long_order_analysis.rs +0 -0
  163. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lz_complexity_detailed.rs +0 -0
  164. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/market_correlation.rs +0 -0
  165. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/microstructure_pattern_features.rs +0 -0
  166. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/microstructure_pattern_features_optimized.rs +0 -0
  167. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/microstructure_pattern_features_v2.rs +0 -0
  168. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/mutual_information.rs +0 -0
  169. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/mutual_information_2d.rs +0 -0
  170. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/mutual_information_2d_final.rs +0 -0
  171. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/mutual_information_2d_fixed.rs +0 -0
  172. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_contamination.rs +0 -0
  173. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_neighborhood.rs +0 -0
  174. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_price_statistics.rs +0 -0
  175. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_price_statistics_bucketed.rs +0 -0
  176. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_price_statistics_order_level.rs +0 -0
  177. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_records_ultra_sorted.rs +0 -0
  178. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_records_ultra_sorted_bucketed.rs +0 -0
  179. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_records_ultra_sorted_v2_optimized.rs +0 -0
  180. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_records_ultra_sorted_v3.rs +0 -0
  181. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/orderbook_volume_cov_factors.rs +0 -0
  182. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/pandas_ext/mod.rs +0 -0
  183. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/parallel_computing.rs +0 -0
  184. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/parallel_computing_date_only.rs +0 -0
  185. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/passive_order_features.rs +0 -0
  186. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/permutation_analysis_v0816_fixed.rs +0 -0
  187. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/personalized_meeting_features.rs +0 -0
  188. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/price_breakthrough_stats.rs +0 -0
  189. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/price_cycle_b_segments_enhanced.rs +0 -0
  190. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/safe_eigenvalue.rs +0 -0
  191. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/sequence/mod.rs +0 -0
  192. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/series_rank.rs +0 -0
  193. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/simple_parallel.rs +0 -0
  194. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/skewness.rs +0 -0
  195. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/eigenvalue_analysis.rs +0 -0
  196. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/eigenvalue_analysis_modified.rs +0 -0
  197. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/fast_correlation.rs +0 -0
  198. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/fast_correlation_v2.rs +0 -0
  199. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/hmm_trend_prediction.rs +0 -0
  200. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/local_correlation.rs +0 -0
  201. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_correlation_mean.rs +0 -0
  202. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_window_core_feature.rs +0 -0
  203. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_window_core_feature_optimized.rs +0 -0
  204. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_window_core_feature_simd.rs +0 -0
  205. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_window_core_feature_ultra.rs +0 -0
  206. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v2_backtest_block.rs +0 -0
  207. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v2_block_neutralizer.rs +0 -0
  208. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v2_ic_corr_filter.rs +0 -0
  209. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v2_rank_roll_factor.rs +0 -0
  210. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/text/mod.rs +0 -0
  211. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/text/string_proximity.rs +0 -0
  212. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/theme_cluster_factors.rs +0 -0
  213. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/theme_cluster_factors_batch.rs +0 -0
  214. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/theme_feature_expansion.rs +0 -0
  215. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_irreversibility.rs +0 -0
  216. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/fast_extreme.rs +0 -0
  217. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/lyapunov.rs +0 -0
  218. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/mod.rs +0 -0
  219. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/retreat_advance.rs +0 -0
  220. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/retreat_advance_v2.rs +0 -0
  221. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/super_extreme.rs +0 -0
  222. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/topk_corr_matrix.rs +0 -0
  223. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/trade_analysis_ultra_turbo.rs +0 -0
  224. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/trade_peak_analysis.rs +0 -0
  225. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/trade_records_ultra_sorted.rs +0 -0
  226. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tree/mod.rs +0 -0
  227. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/vector_similarity.rs +0 -0
  228. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/vector_similarity_optimized.rs +0 -0
  229. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/yand_affine_centroid.rs +0 -0
  230. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/yand_divergence.rs +0 -0
  231. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/templates/base.html +0 -0
  232. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/templates/function.html +0 -0
  233. {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/templates/index.html +0 -0
@@ -239,3 +239,4 @@ docs/theme_feature_expansion_explanation.md
239
239
  .mindfs/sessions/session-list.db
240
240
  .maturin_zig/*
241
241
  dist_versions/*
242
+ python/rust_pyfunc/rust_pyfunc_worker
@@ -550,6 +550,17 @@ version = "0.8.7"
550
550
  source = "registry+https://github.com/rust-lang/crates.io-index"
551
551
  checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
552
552
 
553
+ [[package]]
554
+ name = "core_affinity"
555
+ version = "0.8.3"
556
+ source = "registry+https://github.com/rust-lang/crates.io-index"
557
+ checksum = "a034b3a7b624016c6e13f5df875747cc25f884156aad2abd12b6c46797971342"
558
+ dependencies = [
559
+ "libc",
560
+ "num_cpus",
561
+ "winapi",
562
+ ]
563
+
553
564
  [[package]]
554
565
  name = "cpufeatures"
555
566
  version = "0.2.17"
@@ -2181,12 +2192,13 @@ checksum = "082f11ffa03bbef6c2c6ea6bea1acafaade2fd9050ae0234ab44a2153742b058"
2181
2192
 
2182
2193
  [[package]]
2183
2194
  name = "rust_pyfunc"
2184
- version = "0.78.0"
2195
+ version = "0.80.0"
2185
2196
  dependencies = [
2186
2197
  "arrow",
2187
2198
  "base64 0.21.7",
2188
2199
  "bincode",
2189
2200
  "chrono",
2201
+ "core_affinity",
2190
2202
  "criterion",
2191
2203
  "crossbeam",
2192
2204
  "csv",
@@ -2671,6 +2683,22 @@ dependencies = [
2671
2683
  "safe_arch",
2672
2684
  ]
2673
2685
 
2686
+ [[package]]
2687
+ name = "winapi"
2688
+ version = "0.3.9"
2689
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2690
+ checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2691
+ dependencies = [
2692
+ "winapi-i686-pc-windows-gnu",
2693
+ "winapi-x86_64-pc-windows-gnu",
2694
+ ]
2695
+
2696
+ [[package]]
2697
+ name = "winapi-i686-pc-windows-gnu"
2698
+ version = "0.4.0"
2699
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2700
+ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2701
+
2674
2702
  [[package]]
2675
2703
  name = "winapi-util"
2676
2704
  version = "0.1.9"
@@ -2680,6 +2708,12 @@ dependencies = [
2680
2708
  "windows-sys 0.59.0",
2681
2709
  ]
2682
2710
 
2711
+ [[package]]
2712
+ name = "winapi-x86_64-pc-windows-gnu"
2713
+ version = "0.4.0"
2714
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2715
+ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2716
+
2683
2717
  [[package]]
2684
2718
  name = "windows-core"
2685
2719
  version = "0.61.2"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rust_pyfunc"
3
- version = "0.78.0"
3
+ version = "0.80.0"
4
4
  edition = "2021"
5
5
  description = "A collection of high-performance Python functions implemented in Rust"
6
6
  readme = "README.md"
@@ -46,9 +46,15 @@ log = "0.4"
46
46
  once_cell = "1.19"
47
47
  csv = "1.3"
48
48
  ndarray-npy = "0.8"
49
+ core_affinity = "0.8"
49
50
  hdf5-metno = { version = "0.12", features = ["static", "zlib"], optional = true }
50
51
  zstd = "0.13"
51
52
 
53
+ # Worker 二进制(多进程因子流水线)
54
+ [[bin]]
55
+ name = "rust_pyfunc_worker"
56
+ path = "src/bin/worker_pipeline.rs"
57
+
52
58
  [features]
53
59
  default = ["hdf5"]
54
60
  hdf5 = ["hdf5-metno"]
@@ -65,8 +71,9 @@ criterion = "0.5"
65
71
  [profile.release]
66
72
  lto = true
67
73
  codegen-units = 1
68
- panic = "abort"
69
74
  opt-level = 3
75
+ # 注意:不用 panic = "abort",因为 worker bin 需要 catch_unwind 捕获计算 panic,
76
+ # 避免整个 worker 进程崩溃重启。pyo3 0.18 在 unwind 下正常工作。
70
77
 
71
78
  [build-dependencies]
72
79
  pkg-config = "0.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rust_pyfunc
3
- Version: 0.78.0
3
+ Version: 0.80.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -26,5 +26,10 @@ conda activate chenzongwei311
26
26
  export PATH="/home/chenzongwei/.local/bin:$PATH"
27
27
  /home/chenzongwei/.local/bin/mold -run maturin develop --release
28
28
 
29
+ # 5. 编译并部署 worker 二进制(多进程因子流水线 mode="multiprocess" 需要)
30
+ /home/chenzongwei/.local/bin/mold -run cargo build --release --bin rust_pyfunc_worker
31
+ cp target/release/rust_pyfunc_worker python/rust_pyfunc/rust_pyfunc_worker
32
+ echo "✅ worker 二进制已部署到 python/rust_pyfunc/rust_pyfunc_worker"
33
+
29
34
  # 如果需要,你也可以在脚本结束时停用环境
30
35
  # conda deactivate
@@ -2288,3 +2288,104 @@ def compute_ts_stats(series: List[float]) -> List[float]:
2288
2288
  数据不足5个时返回空列表
2289
2289
  """
2290
2290
  ...
2291
+
2292
+
2293
+ def read_trade_fast(
2294
+ code: str,
2295
+ date: int,
2296
+ with_retreat: int = 0,
2297
+ with_afternoon_adjust: bool = False,
2298
+ ) -> NDArray[np.float64]:
2299
+ """高速读取逐笔成交数据(Rust 多线程实现,替代 read_trade 的加速版)。
2300
+
2301
+ 用 memmap2 内存映射文件,大文件按字节块切分并行解析(rayon),
2302
+ 读取时即完成全部预处理:flag!=32 过滤、exchtime 微秒整数→epoch 秒、
2303
+ 可选的下午时段平移(adjust_afternoon)。
2304
+
2305
+ 与 read_trade 的差异:
2306
+ - 直接返回 (n, 7) float64 numpy 数组,跳过 DataFrame 构造与 Timestamp 往返转换
2307
+ - with_afternoon_adjust=True 时在读时一步完成下午时段平移并过滤非盘中数据
2308
+ - time_sec 列为 epoch 秒(与 prepare() 中 exchtime.astype(int64)//1e9 一致)
2309
+
2310
+ 列顺序(n×7 矩阵):
2311
+ [0] time_sec 成交时间,epoch 秒
2312
+ [1] price 成交价
2313
+ [2] volume 成交量
2314
+ [3] turnover 成交额
2315
+ [4] flag 成交标志(66=主买, 83=主卖;32=撤单,已被过滤)
2316
+ [5] bid_order 买方订单号
2317
+ [6] ask_order 卖方订单号
2318
+
2319
+ Parameters
2320
+ ----------
2321
+ code : str
2322
+ 股票代码,如 "000001"
2323
+ date : int
2324
+ 交易日,如 20260605
2325
+ with_retreat : int, 默认 0
2326
+ 1 时保留 flag==32 的撤单记录,0 时过滤(与 read_trade 默认一致)
2327
+ with_afternoon_adjust : bool, 默认 False
2328
+ True 时做 adjust_afternoon 平移:保留 [09:30,11:30],下午 [13:00,14:57]
2329
+ 整体前移 90 分钟,过滤集合竞价前/收盘后的数据
2330
+
2331
+ Returns
2332
+ -------
2333
+ numpy.ndarray
2334
+ (n, 7) float64 数组
2335
+ """
2336
+ ...
2337
+
2338
+
2339
+ def run_factor_pipeline(
2340
+ pipeline: str,
2341
+ tasks: List,
2342
+ n_jobs: int,
2343
+ backup_file: str,
2344
+ expected_result_length: int,
2345
+ trading_days: List[int],
2346
+ params: object = None,
2347
+ update_mode: bool = False,
2348
+ bind_cores: bool = True,
2349
+ backup_batch_size: int = 2000,
2350
+ progress_log: bool = False,
2351
+ ) -> None:
2352
+ """纯 Rust 因子流水线引擎(run_factor_pipeline 优化方案 Phase 3)。
2353
+
2354
+ 把 go 函数(如 hm90.go)的整条链路在 Rust 内部一气呵成,消除 Python worker、
2355
+ pandas、pyo3 往返、msgpack 等所有流转浪费。并行控制采用自适应嵌套并行 + 核绑定,
2356
+ 总线程恒定 = n_jobs。
2357
+
2358
+ backup 格式与现有 run_pools_queue 完全兼容(复用 backup_writer),
2359
+ 后续 query_backup / query_backup_factor_only_ultra_fast 无需改动。
2360
+
2361
+ Parameters
2362
+ ----------
2363
+ pipeline : str
2364
+ 流水线标识,目前支持 "order_pair_hm90"(hm90.go 的 Rust 翻译)
2365
+ tasks : List[[int, str]]
2366
+ 任务列表,每个元素 [date, code]
2367
+ n_jobs : int
2368
+ 并行线程数(总 CPU 占用 ≈ n_jobs × 100%,默认生产用 200)
2369
+ backup_file : str
2370
+ 备份文件路径(与 run_pools_queue 的 backup_file 格式兼容)
2371
+ expected_result_length : int
2372
+ 每个任务的预期结果长度(因子数)
2373
+ trading_days : List[int]
2374
+ 交易日历数组(由 rp.td.trading_days.tolist() 提供,用于 last_trading_day 查找)
2375
+ params : dict, 可选
2376
+ 流水线参数,如 {"tolerance_v1": 0.001, "tolerance_v2": 0.00001}
2377
+ update_mode : bool, 默认 False
2378
+ 断点续算:True 时跳过 backup 中已完成的任务
2379
+ bind_cores : bool, 默认 True
2380
+ 核绑定:把 n_jobs 个线程各绑定到一个物理核,CPU 占用精确稳定
2381
+ backup_batch_size : int, 默认 2000
2382
+ 每攒满 N 个结果写一次 backup(批量 zstd 压缩)
2383
+ progress_log : bool, 默认 False
2384
+ 每 500 个任务打印一次进度
2385
+
2386
+ Notes
2387
+ -----
2388
+ "order_pair_hm90" 流水线关闭了 lyapunov 特征(原 get_features_factors 默认开启,
2389
+ 但花 69% 时间只产生 2.3% 特征)。如需 lyapunov,仍可用原 run_pools_queue。
2390
+ """
2391
+ ...
@@ -0,0 +1,101 @@
1
+ //! rust_pyfunc_worker —— 多进程因子流水线的 worker 二进制入口。
2
+ //!
3
+ //! 由主进程(run_factor_pipeline mode="multiprocess")通过 Command::new spawn。
4
+ //! 通信协议:stdin/stdout pipe + 4字节长度前缀 + bincode。
5
+ //!
6
+ //! 生命周期:
7
+ //! 1. 启动时从环境变量 RUST_PYFUNC_CORE_AFFINITY_IDX 读取核绑定索引(可选)
8
+ //! 2. 读 Init 消息(获取 params、trading_days、expected_len),回复 Ready
9
+ //! 3. while loop { 读 Task → 调 pipeline_order_pair_hm90 → 写 Result }
10
+ //! 4. 收到 Shutdown(长度0)则退出
11
+ //! 5. 计算错误不 panic,回传 Error 消息(避免进程崩溃重启开销)
12
+ use rust_pyfunc::factor_pipeline::{
13
+ ipc_read_result, ipc_read_task, ipc_write, ipc_write_result,
14
+ pipeline_order_pair_hm90, Hm90Params, ResultMessage, TaskMessage,
15
+ };
16
+ use std::io::{BufReader, BufWriter};
17
+
18
+ fn main() {
19
+ // 核绑定(可选)
20
+ if let Ok(idx_str) = std::env::var("RUST_PYFUNC_CORE_AFFINITY_IDX") {
21
+ if let Ok(idx) = idx_str.parse::<usize>() {
22
+ if let Some(cores) = core_affinity::get_core_ids() {
23
+ if idx < cores.len() {
24
+ let _ = core_affinity::set_for_current(cores[idx].clone());
25
+ }
26
+ }
27
+ }
28
+ }
29
+
30
+ let stdin = std::io::stdin();
31
+ let stdout = std::io::stdout();
32
+ // stdin 用锁避免竞争,BufReader 缓冲
33
+ let mut reader = BufReader::new(stdin.lock());
34
+ let mut writer = BufWriter::new(stdout.lock());
35
+
36
+ // 1. 读 Init 消息
37
+ let (params, trading_days, _expected_len) = match ipc_read_task(&mut reader) {
38
+ Ok(Some(TaskMessage::Init { params, trading_days, expected_len })) => {
39
+ (params, trading_days, expected_len)
40
+ }
41
+ _ => {
42
+ eprintln!("worker: 未收到 Init 消息,退出");
43
+ std::process::exit(1);
44
+ }
45
+ };
46
+
47
+ // 回复 Ready
48
+ if ipc_write_result(&mut writer, &ResultMessage::Ready).is_err() {
49
+ eprintln!("worker: 无法回复 Ready,退出");
50
+ std::process::exit(1);
51
+ }
52
+
53
+ // 2. 主循环:读任务 → 计算 → 写结果
54
+ loop {
55
+ let msg = match ipc_read_task(&mut reader) {
56
+ Ok(Some(TaskMessage::Task { date, code })) => (date, code),
57
+ Ok(Some(TaskMessage::Shutdown)) | Ok(None) => {
58
+ // 优雅退出
59
+ break;
60
+ }
61
+ Ok(Some(TaskMessage::Init { .. })) => {
62
+ // 忽略重复 Init
63
+ continue;
64
+ }
65
+ Err(e) => {
66
+ eprintln!("worker: 读取任务失败: {}, 退出", e);
67
+ break;
68
+ }
69
+ };
70
+
71
+ let (date, code) = msg;
72
+
73
+ // 调用流水线计算
74
+ let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
75
+ pipeline_order_pair_hm90(date, &code, &params, &trading_days, 0)
76
+ }));
77
+
78
+ match result {
79
+ Ok(facs) => {
80
+ let task_result = rust_pyfunc::backup_reader::TaskResult {
81
+ date,
82
+ code,
83
+ timestamp: 0,
84
+ facs,
85
+ };
86
+ if ipc_write_result(&mut writer, &ResultMessage::Result(task_result)).is_err() {
87
+ eprintln!("worker: 写结果失败,退出");
88
+ break;
89
+ }
90
+ }
91
+ Err(_) => {
92
+ // panic 被捕获,回传 Error
93
+ let _ = ipc_write_result(&mut writer, &ResultMessage::Error {
94
+ date,
95
+ code,
96
+ msg: "计算 panic".to_string(),
97
+ });
98
+ }
99
+ }
100
+ }
101
+ }
@@ -1,4 +1,4 @@
1
- use arrow::array::{Array, Float64Array, Int32Array, Int64Array, LargeStringArray, StringArray};
1
+ use arrow::array::{Array, Float32Array, Float64Array, Int32Array, Int64Array, LargeStringArray, StringArray};
2
2
  use chrono::Local;
3
3
  use nalgebra::{DMatrix, DVector};
4
4
  use parquet::arrow::arrow_reader::ParquetRecordBatchReaderBuilder;
@@ -262,17 +262,38 @@ impl IOOptimizedStyleData {
262
262
  }
263
263
  };
264
264
 
265
- // 批量提取风格因子列引用
266
- let style_columns: Result<Vec<&Float64Array>, _> = (2..13)
265
+ // 批量提取风格因子列取值闭包: value_0~value_9(Float64) + ind_1~ind_31(Float32) = 41列
266
+ let style_getters: Vec<Box<dyn Fn(usize) -> f64 + Send + Sync>> = (2..43)
267
267
  .map(|i| {
268
- batch
269
- .column(i)
270
- .as_any()
271
- .downcast_ref::<Float64Array>()
272
- .ok_or_else(|| PyRuntimeError::new_err(format!("风格因子列{}类型错误", i - 2)))
268
+ let col = batch.column(i);
269
+ let as_any = col.as_any();
270
+ let getter: Box<dyn Fn(usize) -> f64 + Send + Sync> = if let Some(arr) =
271
+ as_any.downcast_ref::<Float64Array>()
272
+ {
273
+ Box::new(move |row_idx: usize| {
274
+ if arr.is_null(row_idx) {
275
+ f64::NAN
276
+ } else {
277
+ arr.value(row_idx)
278
+ }
279
+ })
280
+ } else if let Some(arr) = as_any.downcast_ref::<Float32Array>() {
281
+ Box::new(move |row_idx: usize| {
282
+ if arr.is_null(row_idx) {
283
+ f64::NAN
284
+ } else {
285
+ arr.value(row_idx) as f64
286
+ }
287
+ })
288
+ } else {
289
+ return Err(PyRuntimeError::new_err(format!(
290
+ "风格因子列{}类型错误:期望Float64或Float32",
291
+ i - 2
292
+ )));
293
+ };
294
+ Ok(getter)
273
295
  })
274
- .collect();
275
- let style_columns = style_columns?;
296
+ .collect::<PyResult<Vec<_>>>()?;
276
297
 
277
298
  // 向量化处理每一行
278
299
  for row_idx in 0..batch.num_rows() {
@@ -280,16 +301,7 @@ impl IOOptimizedStyleData {
280
301
  let stock = get_stock_value(row_idx);
281
302
 
282
303
  // 使用迭代器和collect优化风格值提取
283
- let style_values: Vec<f64> = style_columns
284
- .iter()
285
- .map(|col| {
286
- if col.is_null(row_idx) {
287
- f64::NAN
288
- } else {
289
- col.value(row_idx)
290
- }
291
- })
292
- .collect();
304
+ let style_values: Vec<f64> = style_getters.iter().map(|g| g(row_idx)).collect();
293
305
 
294
306
  data_by_date
295
307
  .entry(date)
@@ -310,19 +322,18 @@ impl IOOptimizedStyleData {
310
322
  // 预分配所有数据结构
311
323
  let mut stocks = Vec::with_capacity(n_stocks);
312
324
  let mut stock_index_map = HashMap::with_capacity(n_stocks);
313
- let mut style_matrix = DMatrix::zeros(n_stocks, 12);
325
+ let mut style_matrix = DMatrix::zeros(n_stocks, 41);
314
326
 
315
- // 单次遍历填充所有数据结构
327
+ // 单次遍历填充所有数据结构(41维风格: 10 barra + 31 行业哑变量, 行业和=1已含截距, 不再加常数项)
316
328
  for (i, (stock, style_values)) in stock_data.into_iter().enumerate() {
317
329
  stock_index_map.insert(stock.clone(), i);
318
330
  stocks.push(stock);
319
331
 
320
332
  // 直接写入矩阵(避免边界检查)
321
333
  unsafe {
322
- for j in 0..11 {
334
+ for j in 0..41 {
323
335
  *style_matrix.get_unchecked_mut((i, j)) = style_values[j];
324
336
  }
325
- *style_matrix.get_unchecked_mut((i, 11)) = 1.0;
326
337
  }
327
338
  }
328
339
 
@@ -939,12 +950,13 @@ fn process_single_date_io_optimized(
939
950
 
940
951
  let beta = &selected_regression_matrix * &aligned_y_vector;
941
952
 
953
+ let n_features = day_data.style_matrix.ncols();
942
954
  let mut result_values = Vec::new();
943
955
  for (i, &union_idx) in valid_union_indices.iter().enumerate() {
944
956
  let style_idx = valid_style_indices[i];
945
957
 
946
958
  let mut predicted_value = 0.0;
947
- for j in 0..12 {
959
+ for j in 0..n_features {
948
960
  predicted_value += day_data.style_matrix[(style_idx, j)] * beta[j];
949
961
  }
950
962