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.
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/.gitignore +1 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/Cargo.lock +35 -1
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/Cargo.toml +9 -2
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/PKG-INFO +1 -1
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/alter.sh +5 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/core_functions.pyi +101 -0
- rust_pyfunc-0.80.0/src/bin/worker_pipeline.rs +101 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/factor_neutralization_io_optimized.rs +37 -25
- rust_pyfunc-0.80.0/src/factor_pipeline.rs +684 -0
- rust_pyfunc-0.80.0/src/fast_csv_reader.rs +822 -0
- rust_pyfunc-0.80.0/src/features.rs +645 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lib.rs +29 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lz_complexity.rs +2 -2
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_pair_metrics.rs +131 -34
- rust_pyfunc-0.80.0/src/order_pair_metrics_pipeline.rs +1968 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/mod.rs +1 -1
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v4_pipeline.rs +4 -3
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/trend_mod.rs +1 -1
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/.factory/settings.json +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/.github/workflows/CI.yml +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/.github/workflows/deploy.yml +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/FACTOR_NEUTRALIZATION_REQUIREMENTS.md +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/README.md +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/agents/skills/agent-trading-builder/SKILL.md +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/PriceTree.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/PriceTreeViz.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/RollingFutureAccessor.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/TRADE_PEAK_ANALYSIS_README.md +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/brachistochrone_curve.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/calculate_shannon_entropy_change.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/calculate_shannon_entropy_change_at_low.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/compute_max_eigenvalue.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dct_basis_functions.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dct_path_patterns.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dct_reconstruction.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dct_visualization.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/dtw_distance.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_follow_volume_sum_same_price.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_follow_volume_sum_same_price_and_flag.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_half_energy_time.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_local_peaks_within_window.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/find_max_range_product.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/identify_segments.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/index.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/jaccard_similarity.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/mark_follow_groups.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/mark_follow_groups_with_flag.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/max_range_loop.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/min_range_loop.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/min_word_edit_distance.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/ols.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/ols_predict.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/ols_residuals.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/parallel_computing_system.md +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/rolling_cv.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/rolling_qcv.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/rolling_volatility.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/rolling_window_stat.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/search_data.json +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/static/search.js +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/static/style.css +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/sum_as_string.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/transfer_entropy.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/trend.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/trend_fast.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/vectorize_sentences.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs/vectorize_sentences_list.html +0 -0
- {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
- {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
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/docs_generator.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/ds_plan_true.md +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/freeze_version.sh +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/hmm_visualizer.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/pyproject.toml +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/__init__.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/__init__.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/abm_analysis.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/agent_simulator.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/agent_trading_daily.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/agent_trading_daily.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/copula.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/factor_task.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/factor_taskd.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/minute_data_reader.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_correlation.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_correlation.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_corrwith.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_extensions.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_merge.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/pandas_rank.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/parallel_computing.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/rolling_future.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/rolling_past.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/statistical_analysis.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/text_analysis.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/theme_cluster_factors.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/theme_feature_expansion.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/theme_feature_expansion_data.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/theme_feature_expansion_data.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/time_series.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/trading_analysis.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/trading_data_utils.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/trading_data_utils.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/trading_day.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/tree_structures.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/treevisual.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/web_manager.py +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/python/rust_pyfunc/web_manager.pyi +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/rust-toolchain.toml +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/abnormal_asks_analyzer.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/acceleration_follow_agent.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/bottom_fishing_agent.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/buy_ratio_agent.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/exhaustion_reversal_agent.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/follow_flow_agent.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/momentum_agent.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/py_bindings.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/simulator.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/trait_def.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/types.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_simulator/utils.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/core.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/metrics.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/py_bindings.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_trading_features/types.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_validation/factors_extra.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_validation/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/agent_validation/py_bindings.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/allo_microstructure.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/allo_microstructure_v2.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/allo_microstructure_v3.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/backup_column_cache.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/backup_reader.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/backup_writer.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/column_correlation.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/copula.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/corr_diff_features.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/cross_stock_regression.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/cross_stock_regression_fast.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/cross_stock_regression_peak.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/dct_transform.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/difference_matrix.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/effective_memory_length.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/entropy_analysis.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/error/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/frontier_dist.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/ghost_market_maker.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/gp_correlation_dimension.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/grouping.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/hawkes_advisor.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/hawkes_analysis.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/illusion_liquidity_distance.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/integer_small_peak_features.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lagged_regression.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lagged_regression_incremental.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lagged_regression_optimized.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lagged_regression_simd.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/limit_order_lifecycle.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/limit_order_lifecycle_v2.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/long_order_analysis.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/lz_complexity_detailed.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/market_correlation.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/microstructure_pattern_features.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/microstructure_pattern_features_optimized.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/microstructure_pattern_features_v2.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/mutual_information.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/mutual_information_2d.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/mutual_information_2d_final.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/mutual_information_2d_fixed.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_contamination.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_neighborhood.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_price_statistics.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_price_statistics_bucketed.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_price_statistics_order_level.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_records_ultra_sorted.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_records_ultra_sorted_bucketed.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_records_ultra_sorted_v2_optimized.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/order_records_ultra_sorted_v3.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/orderbook_volume_cov_factors.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/pandas_ext/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/parallel_computing.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/parallel_computing_date_only.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/passive_order_features.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/permutation_analysis_v0816_fixed.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/personalized_meeting_features.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/price_breakthrough_stats.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/price_cycle_b_segments_enhanced.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/safe_eigenvalue.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/sequence/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/series_rank.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/simple_parallel.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/skewness.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/eigenvalue_analysis.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/eigenvalue_analysis_modified.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/fast_correlation.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/fast_correlation_v2.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/hmm_trend_prediction.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/local_correlation.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_correlation_mean.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_window_core_feature.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_window_core_feature_optimized.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_window_core_feature_simd.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/statistics/rolling_window_core_feature_ultra.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v2_backtest_block.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v2_block_neutralizer.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v2_ic_corr_filter.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tail_v2_rank_roll_factor.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/text/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/text/string_proximity.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/theme_cluster_factors.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/theme_cluster_factors_batch.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/theme_feature_expansion.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_irreversibility.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/fast_extreme.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/lyapunov.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/retreat_advance.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/retreat_advance_v2.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/time_series/super_extreme.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/topk_corr_matrix.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/trade_analysis_ultra_turbo.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/trade_peak_analysis.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/trade_records_ultra_sorted.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/tree/mod.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/vector_similarity.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/vector_similarity_optimized.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/yand_affine_centroid.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/src/yand_divergence.rs +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/templates/base.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/templates/function.html +0 -0
- {rust_pyfunc-0.78.0 → rust_pyfunc-0.80.0}/templates/index.html +0 -0
|
@@ -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.
|
|
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.
|
|
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"
|
|
@@ -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, ¶ms, &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
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
.downcast_ref::<Float64Array>()
|
|
272
|
-
|
|
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> =
|
|
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,
|
|
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..
|
|
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..
|
|
959
|
+
for j in 0..n_features {
|
|
948
960
|
predicted_value += day_data.style_matrix[(style_idx, j)] * beta[j];
|
|
949
961
|
}
|
|
950
962
|
|