powerquant-cli 0.2.7__tar.gz → 0.2.8__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.
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/PKG-INFO +15 -2
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/README.md +13 -1
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/client.py +19 -1
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/exceptions.py +6 -2
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/pyproject.toml +2 -2
- powerquant_cli-0.2.8/src/quant_cli/app/agent_resource/cli/resource_cli.py +31 -0
- powerquant_cli-0.2.8/src/quant_cli/app/agent_resource/service/resource_service.py +77 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/cli/local_backtest_cli.py +17 -13
- powerquant_cli-0.2.8/src/quant_cli/app/backtest/service/backtest_application_service.py +29 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/config/config_cli.py +7 -5
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/cli/data_cli.py +8 -6
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/data_dependency.py +1 -4
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/factor_definition_cli.py +6 -4
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/local_factor_cli.py +18 -13
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/local_selection_cli.py +10 -19
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/local_factor_dependency.py +1 -1
- powerquant_cli-0.2.8/src/quant_cli/app/factor/service/factor_application_service.py +41 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/cli/local_job_cli.py +9 -9
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/quant_cli.py +25 -3
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/cli/local_research_cli.py +20 -17
- powerquant_cli-0.2.8/src/quant_cli/app/research/service/research_application_service.py +34 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/strategy/cli/strategy_cli.py +11 -10
- powerquant_cli-0.2.8/src/quant_cli/application_container.py +39 -0
- powerquant_cli-0.2.8/src/quant_cli/application_settings.py +11 -0
- powerquant_cli-0.2.8/src/quant_cli/common/command_error_handler.py +43 -0
- powerquant_cli-0.2.8/src/quant_cli/common/command_help.py +45 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/http/definition_client.py +27 -1
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/utils/cli_utils.py +24 -4
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/config/connection_config.py +6 -7
- powerquant_cli-0.2.8/src/quant_cli/resources/prompts/research.md +3 -0
- powerquant_cli-0.2.8/src/quant_cli/resources/skills/pq-connection/SKILL.md +8 -0
- powerquant_cli-0.2.8/src/quant_cli/resources/skills/pq-data-operations/SKILL.md +8 -0
- powerquant_cli-0.2.8/src/quant_cli/resources/skills/pq-research/SKILL.md +8 -0
- powerquant_cli-0.2.8/tests/unit/test_agent_json.py +71 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_connection_config.py +12 -0
- powerquant_cli-0.2.8/tests/unit/test_definition_errors.py +59 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/uv.lock +49 -1
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/.env.example +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/.gitignore +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/LICENSE +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/download.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/adjustment_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/bar_content_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/bar_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/corporate_action_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/history_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/pit_daily_window.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/query_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/quote_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/reference_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/reliability_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/SPEC.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/SPEC.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/backtest_input_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/backtest_run.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/data_guard.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/historical_clock.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/legacy_result_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/metrics.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/performance_report.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/report_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/service/backtest_execution_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/constants.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/domain/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/domain/trading_quantity_value.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/exceptions.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/adjustment_factor_query.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_data_query.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_data_verification.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_event_source.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_revision_query.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_runtime_repository.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_time_slice_source.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/repository/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/adjustment_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/corporate_action_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/event_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/exchange_operating_state.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/exchange_state_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/history_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/instrument_identity.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/market_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/pit_daily_window.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/quote_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/reliability_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/snapshot_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/trading_state_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/calendar_coverage_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/prepared_data_verification_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/prepared_market_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/price_adjustment_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/LICENSE.vnpy +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/builtin/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/builtin/alpha101_recipe.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/builtin/alpha158_recipe.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/builtin/factor_recipe_catalog.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/factor_batch_evaluator.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/factor_expression.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/factor_source_loader.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/operators/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/operators/arithmetic_operator.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/operators/cross_section_operator.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/operators/time_series_operator.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/panel_evaluator.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/panel_expression.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/python_factor_executor.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/universe_filter.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/constants.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/exceptions.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/factor_dependency.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_compute.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_execution.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_local_data.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_panel_compute.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_panel_input.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_query_store.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_diagnostics.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_exposure_query.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_local.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_query.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_selection.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/model/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/repository/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/diagnostic_types.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_artifact_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_computation_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_compute_request.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_contract.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_input_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_panel.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_publication_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_query_result_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_result_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/local_factor_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/panel_policy.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/selection_report.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/selection_types.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_compute_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_diagnostic_runner.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_diagnostics_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_exposure_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_input_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_local_execution_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_panel_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_runtime_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_selection_runner.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/published_factor_execution_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/selection_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/visibility.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/opportunity/SPEC.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/opportunity/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/SPEC.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/bar_matcher.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/constants.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/execution_batch.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/order_entity.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/order_event.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/order_policy.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/order_value.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/fee_model.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/order_account.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/order_trading_rules.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/execution_account.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/order_events.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/order_execution.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/order_runtime.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/order_submission.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/order_event_bus.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/order_execution_dependency.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/order_submission_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/schema/order_request_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/simulation_broker.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/slippage_model.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/tradability_policy.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/validators.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/SPEC.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/entitlement_entity.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/portfolio_entity.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/portfolio_event.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/portfolio_value.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/position_entity.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/reservation_entity.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/interface/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/interface/public/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/interface/public/portfolio.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/interface/public/simulation_account.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/ledger_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/order_account_listener.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/portfolio_dependency.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/portfolio_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/simulated_portfolio.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/SPEC.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/adapter/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/adapter/market_label_query.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/interface/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/interface/research_dataset.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/interface/research_evaluation.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/schema/comparison_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/schema/dataset_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/schema/research_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/service/research_dataset_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/service/research_evaluation_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/service/research_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/SPEC.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/constants.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/exceptions.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/portfolio_construction.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/strategy.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/strategy_market_query.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/strategy_portfolio_reader.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/strategy_factor_reader.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/strategy_order_reader.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/portfolio_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/portfolio_target.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/python_strategy_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/screener_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/signal_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/strategy_publication_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/strategy_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/factor_top_n_strategy.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/portfolio_construction_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/python_strategy_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/screener_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/store_factor_reader.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/strategy_market_view.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/strategy_runtime_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/strategy_scheduler.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/strategies/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/strategies/momentum_volume_breakout.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/strategy_context.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/strategy_dependency.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/SPEC.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/domain/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/daily_state_expand.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/exchange_state_resolver.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/market_runtime_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/market_state_resolver.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/runtime_ports.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/runtime_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/runtime_session.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/strategy_portfolio_adapter.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/trading_rule_book.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/trading_rule_query.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/common/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/common/exceptions/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/common/exceptions/base.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/common/local_run.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/cached_factor_screen.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/ma_close_10.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/max_drawdown_20d.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/momentum_20d.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/multi_intraday_screen.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/risk_adjusted_momentum_20d.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/volume_ratio_5d.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/volume_weighted_close_pressure.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/full_market_screen.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/local_quant_validation.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/published_definition_validation.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/research/factor_pit_coverage.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/research/ipo_first_day.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/README.md +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/backtest.json +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/buy_hold.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/compute.json +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/prepare.json +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/select.json +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/bar_roundtrip.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/buy_and_hold.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/contrarian_timing.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/factor_gate_vwap.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/ipo_next_day_vwap.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/momentum_timing.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/monthly_equal_weight.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/session_roundtrip.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/trend_drawdown_guard.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/weekly_risk_adjusted_rotation.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/unified_snapshot_validation.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/hatch_build.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/licenses/LICENSE.vnpy +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/api.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/cli/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/local_backtest_dependency.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/local_backtest_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/repository/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/repository/backtest_local_repository.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/service/local_backtest_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/config/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/cli/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/repository/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/repository/parquet_repository.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/schema/dataset_audit_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/schema/dataset_request_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/schema/parquet_file_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/bar_cache_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/dataset_audit_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/dataset_load_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/dataset_prepare_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/interface/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/interface/local_selection_store.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/repository/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/repository/factor_local_repository.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/repository/selection_local_repository.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/schema/local_selection_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/factor_data_prepare_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/local_factor_query_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/local_factor_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/local_selection_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/cli/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/schema/local_job_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/service/local_job_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/cli/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/local_research_dependency.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/repository/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/repository/research_local_repository.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/schema/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/schema/local_research_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/service/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/service/local_research_execution_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/service/local_research_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/strategy/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/strategy/cli/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/constants.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/database/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/database/duckdb_connection.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/http/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/utils/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/utils/platform_utils.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/utils/runtime_environment.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/config/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/conftest.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/factor_fixtures.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/integration/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/integration/test_local_quant_storage.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/integration/test_local_selection.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/__init__.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_backtest_reports.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_identity.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_market_input.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_research.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_top_n.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_backtest_run_result.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_bar_cache.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_coarse_execution_capability.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_corporate_action_replay.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_d1_replay_execution_chain.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_daily_state_expand.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_daily_state_snapshot.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_daily_vwap_execution.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_data_guard.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_dataset_audit.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_domain_dependency_boundaries.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_domain_interface_boundary.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_exchange_state_execution.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_exchange_state_replay.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_exchange_state_resolver.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_exchange_state_schema.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_contract.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_diagnostic_runner.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_diagnostics.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_expression.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_local_runner.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_runtime_service.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_selection.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_selection_runner.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_ipo_vwap_study.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_local_quant_boundary.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_market_replay.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_market_trading_state.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_order_domain.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_order_submission.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_portfolio_construction.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_portfolio_contracts.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_python_strategy_runtime.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_replay_state_boundaries.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_risk_adjusted_strategy_example.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_simulated_order_execution.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_simulated_portfolio.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_store_factor_reader.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_strategy_adjusted_view.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_strategy_domain.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_strategy_lifecycle.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_tradability_policy.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_trading_runtime_contracts.py +0 -0
- {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_trading_runtime_session.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: powerquant-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.8
|
|
4
4
|
Summary: Power Quant local research CLI
|
|
5
5
|
Project-URL: Repository, https://github.com/Kepler452Byte/power-quant
|
|
6
6
|
License-Expression: LicenseRef-PowerQuant-Proprietary AND MIT
|
|
@@ -14,6 +14,7 @@ Requires-Dist: numpy<3,>=2
|
|
|
14
14
|
Requires-Dist: pandas<4,>=3
|
|
15
15
|
Requires-Dist: polars<2,>=1.36
|
|
16
16
|
Requires-Dist: pydantic<3,>=2.5
|
|
17
|
+
Requires-Dist: pyyaml<7,>=6
|
|
17
18
|
Requires-Dist: scipy<2,>=1.17
|
|
18
19
|
Requires-Dist: typer>=0.27.2
|
|
19
20
|
Requires-Dist: tzdata>=2026.3
|
|
@@ -51,7 +52,7 @@ pq config show
|
|
|
51
52
|
|
|
52
53
|
家庭 LAN 可配置 `http://192.168.8.142:18026/market/api/v1`;公网 IP 临时入口为 `http://82.157.167.33/market/api/v1`。公网 HTTP 会明文传输 Token,只适合已明确接受风险的临时接入;长期公网访问使用可信 HTTPS 或 SSH/WireGuard 加密链路。直接使用 `https://82.157.167.33` 与现有域名证书不匹配。
|
|
53
54
|
|
|
54
|
-
配置保存在当前系统用户的 `~/.powerquant/config.
|
|
55
|
+
配置保存在当前系统用户的 `~/.powerquant/config.yml`,与工作目录无关,不自动加载 `.env`。这是本地明文配置:POSIX 新目录权限 700、文件权限 600;Windows 依赖用户目录 ACL,不声称加密存储。不要提交或分享该文件。
|
|
55
56
|
|
|
56
57
|
每项配置按环境变量 > 用户文件 > 默认值解析。默认地址为 `http://localhost:8002/api/v1`,默认 Token 为空。环境变量只影响当前终端及其启动的子进程,不改文件;显式空 Token 环境变量会覆盖已保存密钥。
|
|
57
58
|
|
|
@@ -81,6 +82,18 @@ pq data prepare --config prepare.json
|
|
|
81
82
|
|
|
82
83
|
密钥到期或撤销后在线准备会失败,已下载快照仍可离线使用。行情密钥不用于定义发布;发布定义另使用 PQ_QUANT_URL/PQ_QUANT_TOKEN。默认本地目录为 ~/.powerquant。
|
|
83
84
|
|
|
85
|
+
## Agent 使用
|
|
86
|
+
|
|
87
|
+
命令结果与帮助统一输出 JSON;错误以单行 JSON 写入 stderr,保留业务错误码、消息和 request_id,并返回非零退出码。
|
|
88
|
+
|
|
89
|
+
```sh
|
|
90
|
+
pq resource list
|
|
91
|
+
pq resource show skills/pq-connection
|
|
92
|
+
pq resource export --directory pq-agent-resources
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Skill 和提示词仅供按需查看、导出,不自动安装;资源模块可独立移除。行情运维通过 PQData API/MCP 提交任务,不通过本地 CLI 或 SSH 操作服务。
|
|
96
|
+
|
|
84
97
|
## Python
|
|
85
98
|
|
|
86
99
|
公开请求模型与调用入口位于 quant_cli.api,与 CLI 使用同一应用服务。
|
|
@@ -30,7 +30,7 @@ pq config show
|
|
|
30
30
|
|
|
31
31
|
家庭 LAN 可配置 `http://192.168.8.142:18026/market/api/v1`;公网 IP 临时入口为 `http://82.157.167.33/market/api/v1`。公网 HTTP 会明文传输 Token,只适合已明确接受风险的临时接入;长期公网访问使用可信 HTTPS 或 SSH/WireGuard 加密链路。直接使用 `https://82.157.167.33` 与现有域名证书不匹配。
|
|
32
32
|
|
|
33
|
-
配置保存在当前系统用户的 `~/.powerquant/config.
|
|
33
|
+
配置保存在当前系统用户的 `~/.powerquant/config.yml`,与工作目录无关,不自动加载 `.env`。这是本地明文配置:POSIX 新目录权限 700、文件权限 600;Windows 依赖用户目录 ACL,不声称加密存储。不要提交或分享该文件。
|
|
34
34
|
|
|
35
35
|
每项配置按环境变量 > 用户文件 > 默认值解析。默认地址为 `http://localhost:8002/api/v1`,默认 Token 为空。环境变量只影响当前终端及其启动的子进程,不改文件;显式空 Token 环境变量会覆盖已保存密钥。
|
|
36
36
|
|
|
@@ -60,6 +60,18 @@ pq data prepare --config prepare.json
|
|
|
60
60
|
|
|
61
61
|
密钥到期或撤销后在线准备会失败,已下载快照仍可离线使用。行情密钥不用于定义发布;发布定义另使用 PQ_QUANT_URL/PQ_QUANT_TOKEN。默认本地目录为 ~/.powerquant。
|
|
62
62
|
|
|
63
|
+
## Agent 使用
|
|
64
|
+
|
|
65
|
+
命令结果与帮助统一输出 JSON;错误以单行 JSON 写入 stderr,保留业务错误码、消息和 request_id,并返回非零退出码。
|
|
66
|
+
|
|
67
|
+
```sh
|
|
68
|
+
pq resource list
|
|
69
|
+
pq resource show skills/pq-connection
|
|
70
|
+
pq resource export --directory pq-agent-resources
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Skill 和提示词仅供按需查看、导出,不自动安装;资源模块可独立移除。行情运维通过 PQData API/MCP 提交任务,不通过本地 CLI 或 SSH 操作服务。
|
|
74
|
+
|
|
63
75
|
## Python
|
|
64
76
|
|
|
65
77
|
公开请求模型与调用入口位于 quant_cli.api,与 CLI 使用同一应用服务。
|
|
@@ -101,7 +101,25 @@ class MarketClient:
|
|
|
101
101
|
await response.aclose()
|
|
102
102
|
await asyncio.sleep(delay)
|
|
103
103
|
if not response.is_success:
|
|
104
|
-
|
|
104
|
+
code: str | int | None = None
|
|
105
|
+
message: str | None = None
|
|
106
|
+
request_id = response.headers.get("x-request-id")
|
|
107
|
+
if "application/json" in response.headers.get("content-type", ""):
|
|
108
|
+
try:
|
|
109
|
+
error = response.json()
|
|
110
|
+
except ValueError:
|
|
111
|
+
error = None
|
|
112
|
+
if isinstance(error, dict):
|
|
113
|
+
candidate = error.get("error_code", error.get("code"))
|
|
114
|
+
if isinstance(candidate, (str, int)) and not isinstance(candidate, bool):
|
|
115
|
+
code = candidate
|
|
116
|
+
candidate = error.get("message")
|
|
117
|
+
if isinstance(candidate, str) and 0 < len(candidate) <= 512:
|
|
118
|
+
message = candidate
|
|
119
|
+
candidate = error.get("request_id")
|
|
120
|
+
if isinstance(candidate, str) and len(candidate) <= 128:
|
|
121
|
+
request_id = request_id or candidate
|
|
122
|
+
raise MarketAPIError(response.status_code, request_id, code=code, message=message)
|
|
105
123
|
try:
|
|
106
124
|
return TypeAdapter(response_type).validate_json(response.content)
|
|
107
125
|
except ValidationError as error:
|
|
@@ -4,10 +4,14 @@
|
|
|
4
4
|
class MarketAPIError(Exception):
|
|
5
5
|
"""服务拒绝请求;保留状态码和可追踪的请求 ID,不暴露凭据。"""
|
|
6
6
|
|
|
7
|
-
def __init__(self, status_code: int, request_id: str | None = None
|
|
7
|
+
def __init__(self, status_code: int, request_id: str | None = None,
|
|
8
|
+
*, code: str | int | None = None, message: str | None = None) -> None:
|
|
8
9
|
self.status_code = status_code
|
|
9
10
|
self.request_id = request_id
|
|
10
|
-
|
|
11
|
+
self.code = code if code is not None else f"HTTP_{status_code}"
|
|
12
|
+
self.message = message or f"行情请求失败(HTTP {status_code})"
|
|
13
|
+
super().__init__(self.message)
|
|
14
|
+
|
|
11
15
|
|
|
12
16
|
|
|
13
17
|
class MarketProtocolError(Exception):
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "powerquant-cli"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.8"
|
|
4
4
|
description = "Power Quant local research CLI"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
license = "LicenseRef-PowerQuant-Proprietary AND MIT"
|
|
8
8
|
license-files = ["LICENSE", "licenses/LICENSE.vnpy"]
|
|
9
|
-
dependencies = ["pydantic>=2.5,<3", "polars>=1.36,<2", "numpy>=2,<3", "scipy>=1.17,<2", "pandas>=3,<4", "tzdata>=2026.3", "typer>=0.27.2", "httpx>=0.28,<1", "duckdb>=1.4,<2", "filelock>=3.20,<4"]
|
|
9
|
+
dependencies = ["pydantic>=2.5,<3", "polars>=1.36,<2", "numpy>=2,<3", "scipy>=1.17,<2", "pandas>=3,<4", "tzdata>=2026.3", "typer>=0.27.2", "httpx>=0.28,<1", "duckdb>=1.4,<2", "filelock>=3.20,<4", "pyyaml>=6,<7"]
|
|
10
10
|
|
|
11
11
|
[project.urls]
|
|
12
12
|
Repository = "https://github.com/Kepler452Byte/power-quant"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""可移除的资源命令;与核心计算命令无依赖。"""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Annotated
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from quant_cli.app.agent_resource.service.resource_service import ResourceService
|
|
9
|
+
from quant_cli.common.command_error_handler import CommandGroup
|
|
10
|
+
from quant_cli.common.command_help import Command
|
|
11
|
+
from quant_cli.common.utils.cli_utils import cli_errors, output
|
|
12
|
+
|
|
13
|
+
app = typer.Typer(cls=CommandGroup, help="按需查看与导出随包 Skill 和提示词", no_args_is_help=True)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@app.command("list", cls=Command)
|
|
17
|
+
@cli_errors
|
|
18
|
+
def list_resources() -> None:
|
|
19
|
+
output({"items": ResourceService().list()})
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@app.command("show", cls=Command)
|
|
23
|
+
@cli_errors
|
|
24
|
+
def show_resource(name: str) -> None:
|
|
25
|
+
output(ResourceService().show(name))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@app.command("export", cls=Command)
|
|
29
|
+
@cli_errors
|
|
30
|
+
def export_resources(directory: Annotated[Path, typer.Option("--directory")]) -> None:
|
|
31
|
+
output(ResourceService().export(directory))
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""可选 Agent 资源读取与安全导出,不修改 Agent 配置。"""
|
|
2
|
+
|
|
3
|
+
import shutil
|
|
4
|
+
from importlib.resources import files
|
|
5
|
+
from pathlib import Path, PurePosixPath
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ResourceService:
|
|
10
|
+
"""仅管理随包资源,不联网、不读数据库。"""
|
|
11
|
+
|
|
12
|
+
def _root(self) -> Any:
|
|
13
|
+
return files("quant_cli").joinpath("resources")
|
|
14
|
+
|
|
15
|
+
def list(self) -> list[dict[str, str]]:
|
|
16
|
+
result = []
|
|
17
|
+
root = self._root()
|
|
18
|
+
if not root.is_dir():
|
|
19
|
+
return result
|
|
20
|
+
for kind in ("skills", "prompts"):
|
|
21
|
+
folder = root.joinpath(kind)
|
|
22
|
+
if folder.is_dir():
|
|
23
|
+
for item in sorted(folder.iterdir(), key=lambda entry: entry.name):
|
|
24
|
+
path = item.joinpath("SKILL.md") if item.is_dir() else item
|
|
25
|
+
if path.is_file():
|
|
26
|
+
result.append(
|
|
27
|
+
{
|
|
28
|
+
"name": item.name,
|
|
29
|
+
"kind": kind,
|
|
30
|
+
"path": f"{kind}/{item.name}",
|
|
31
|
+
"description": self._description(path.read_text(encoding="utf-8")),
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
return result
|
|
35
|
+
|
|
36
|
+
@staticmethod
|
|
37
|
+
def _description(text: str) -> str:
|
|
38
|
+
for line in text.splitlines():
|
|
39
|
+
if line.startswith("description:"):
|
|
40
|
+
return line.partition(":")[2].strip().strip('"')
|
|
41
|
+
return next((line.lstrip("# ") for line in text.splitlines() if line.strip()), "")
|
|
42
|
+
|
|
43
|
+
def show(self, name: str) -> dict[str, str]:
|
|
44
|
+
path = PurePosixPath(name)
|
|
45
|
+
if (
|
|
46
|
+
path.is_absolute()
|
|
47
|
+
or ".." in path.parts
|
|
48
|
+
or len(path.parts) != 2
|
|
49
|
+
or path.parts[0] not in ("skills", "prompts")
|
|
50
|
+
or "\\" in name
|
|
51
|
+
):
|
|
52
|
+
raise ValueError("资源路径必须是 skills/<名称> 或 prompts/<名称>")
|
|
53
|
+
item = self._root().joinpath(*path.parts)
|
|
54
|
+
content = item.joinpath("SKILL.md") if item.is_dir() else item
|
|
55
|
+
if not content.is_file():
|
|
56
|
+
raise ValueError("资源不存在")
|
|
57
|
+
return {"path": name, "content": content.read_text(encoding="utf-8")}
|
|
58
|
+
|
|
59
|
+
def export(self, destination: Path) -> dict[str, str]:
|
|
60
|
+
# 必须新目录:不覆盖、不合并用户内容。独占创建防止并发覆盖。
|
|
61
|
+
destination.mkdir(parents=True, exist_ok=False)
|
|
62
|
+
try:
|
|
63
|
+
self._copy(self._root(), destination)
|
|
64
|
+
except BaseException:
|
|
65
|
+
shutil.rmtree(destination)
|
|
66
|
+
raise
|
|
67
|
+
return {"directory": str(destination.resolve())}
|
|
68
|
+
|
|
69
|
+
def _copy(self, source: Any, destination: Path) -> None:
|
|
70
|
+
for item in source.iterdir():
|
|
71
|
+
target = destination / item.name
|
|
72
|
+
if item.is_dir():
|
|
73
|
+
target.mkdir()
|
|
74
|
+
self._copy(item, target)
|
|
75
|
+
else:
|
|
76
|
+
with target.open("xb") as stream:
|
|
77
|
+
stream.write(item.read_bytes())
|
{powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/cli/local_backtest_cli.py
RENAMED
|
@@ -7,19 +7,19 @@ from uuid import UUID
|
|
|
7
7
|
|
|
8
8
|
import typer
|
|
9
9
|
|
|
10
|
-
from quant_cli.app.backtest.local_backtest_dependency import build_local_backtest_store
|
|
11
10
|
from quant_cli.app.backtest.local_backtest_schema import LocalBacktestRequest
|
|
12
|
-
from quant_cli.
|
|
13
|
-
from quant_cli.
|
|
11
|
+
from quant_cli.common.command_error_handler import CommandGroup
|
|
12
|
+
from quant_cli.common.command_help import Command
|
|
14
13
|
from quant_cli.common.constants import DEFAULT_DATABASE_PATH
|
|
15
14
|
from quant_cli.common.utils.cli_utils import cli_errors, output
|
|
16
15
|
|
|
17
|
-
app = typer.Typer(help="本地策略回测", no_args_is_help=True)
|
|
16
|
+
app = typer.Typer(cls=CommandGroup, help="本地策略回测", no_args_is_help=True)
|
|
18
17
|
|
|
19
18
|
|
|
20
|
-
@app.command("run")
|
|
19
|
+
@app.command("run", cls=Command)
|
|
21
20
|
@cli_errors
|
|
22
21
|
def run(
|
|
22
|
+
ctx: typer.Context,
|
|
23
23
|
config: Annotated[Path, typer.Option(exists=True)],
|
|
24
24
|
source: Annotated[Path | None, typer.Option(exists=True)] = None,
|
|
25
25
|
database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
|
|
@@ -30,23 +30,26 @@ def run(
|
|
|
30
30
|
if source is not None:
|
|
31
31
|
payload["source"] = source.read_text(encoding="utf-8")
|
|
32
32
|
request = LocalBacktestRequest.model_validate(payload)
|
|
33
|
-
record = asyncio.run(
|
|
34
|
-
|
|
33
|
+
record = asyncio.run(
|
|
34
|
+
ctx.obj.backtest_service.run(request, database, ctx.obj.factor_service.store(database))
|
|
35
|
+
)
|
|
35
36
|
output(record)
|
|
36
37
|
|
|
37
38
|
|
|
38
|
-
@app.command("get")
|
|
39
|
+
@app.command("get", cls=Command)
|
|
39
40
|
@cli_errors
|
|
40
41
|
def get(
|
|
42
|
+
ctx: typer.Context,
|
|
41
43
|
run: Annotated[UUID, typer.Option()],
|
|
42
44
|
database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
|
|
43
45
|
) -> None:
|
|
44
|
-
output(
|
|
46
|
+
output(ctx.obj.backtest_service.store(database).get(run))
|
|
45
47
|
|
|
46
48
|
|
|
47
|
-
@app.command("list")
|
|
49
|
+
@app.command("list", cls=Command)
|
|
48
50
|
@cli_errors
|
|
49
51
|
def list_runs(
|
|
52
|
+
ctx: typer.Context,
|
|
50
53
|
limit: int = 20,
|
|
51
54
|
offset: int = 0,
|
|
52
55
|
database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
|
|
@@ -54,19 +57,20 @@ def list_runs(
|
|
|
54
57
|
output(
|
|
55
58
|
[
|
|
56
59
|
row.model_dump(mode="json")
|
|
57
|
-
for row in
|
|
60
|
+
for row in ctx.obj.backtest_service.store(database).list_runs(limit, offset)
|
|
58
61
|
]
|
|
59
62
|
)
|
|
60
63
|
|
|
61
64
|
|
|
62
|
-
@app.command("compare")
|
|
65
|
+
@app.command("compare", cls=Command)
|
|
63
66
|
@cli_errors
|
|
64
67
|
def compare(
|
|
68
|
+
ctx: typer.Context,
|
|
65
69
|
run: Annotated[list[UUID], typer.Option()],
|
|
66
70
|
database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
|
|
67
71
|
) -> None:
|
|
68
72
|
"""比较多次本地回测。"""
|
|
69
73
|
from quant_cli.app.backtest.service.local_backtest_service import compare_backtest_records
|
|
70
74
|
|
|
71
|
-
store =
|
|
75
|
+
store = ctx.obj.backtest_service.store(database)
|
|
72
76
|
output(compare_backtest_records(tuple(store.get(key) for key in run)))
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Backtest 应用服务组装,存储路径由调用方显式指定。"""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from quant_core.app.factor.interface.public.factor_local import LocalFactorStore
|
|
7
|
+
from quant_core.common.local_run import LocalRunRecord
|
|
8
|
+
|
|
9
|
+
from quant_cli.app.backtest.local_backtest_schema import LocalBacktestRequest
|
|
10
|
+
from quant_cli.app.backtest.repository.backtest_local_repository import BacktestLocalRepository
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class BacktestApplicationService:
|
|
14
|
+
def __init__(self, store_factory: Callable[[Path], BacktestLocalRepository]) -> None:
|
|
15
|
+
self._store_factory = store_factory
|
|
16
|
+
|
|
17
|
+
def store(self, path: Path) -> BacktestLocalRepository:
|
|
18
|
+
"""组装短事务存储,不缓存连接或隐式选择路径。"""
|
|
19
|
+
return self._store_factory(path)
|
|
20
|
+
|
|
21
|
+
async def run(
|
|
22
|
+
self, request: LocalBacktestRequest, path: Path, factor_store: LocalFactorStore
|
|
23
|
+
) -> LocalRunRecord:
|
|
24
|
+
"""回测并归档,因子依赖由组合根显式传入。"""
|
|
25
|
+
from quant_cli.app.backtest.service.local_backtest_service import run_local_backtest
|
|
26
|
+
|
|
27
|
+
record = await run_local_backtest(request, factor_store)
|
|
28
|
+
self.store(path).save(record)
|
|
29
|
+
return record
|
|
@@ -5,6 +5,8 @@ from typing import Annotated
|
|
|
5
5
|
|
|
6
6
|
import typer
|
|
7
7
|
|
|
8
|
+
from quant_cli.common.command_error_handler import CommandGroup
|
|
9
|
+
from quant_cli.common.command_help import Command
|
|
8
10
|
from quant_cli.common.utils.cli_utils import cli_errors, output
|
|
9
11
|
from quant_cli.config.connection_config import (
|
|
10
12
|
get_config_path,
|
|
@@ -13,7 +15,7 @@ from quant_cli.config.connection_config import (
|
|
|
13
15
|
update_saved_config,
|
|
14
16
|
)
|
|
15
17
|
|
|
16
|
-
app = typer.Typer(help="保存和查看当前用户的行情连接配置", no_args_is_help=True)
|
|
18
|
+
app = typer.Typer(cls=CommandGroup, help="保存和查看当前用户的行情连接配置", no_args_is_help=True)
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
class ConfigKey(StrEnum):
|
|
@@ -21,7 +23,7 @@ class ConfigKey(StrEnum):
|
|
|
21
23
|
MARKET_TOKEN = "market-token"
|
|
22
24
|
|
|
23
25
|
|
|
24
|
-
@app.command("set")
|
|
26
|
+
@app.command("set", cls=Command)
|
|
25
27
|
@cli_errors
|
|
26
28
|
def set_config(
|
|
27
29
|
market_url: Annotated[str, typer.Option("--market-url", "--url", help="行情 API 基础地址")],
|
|
@@ -31,7 +33,7 @@ def set_config(
|
|
|
31
33
|
output({"status": "saved", "path": str(get_config_path()), "key": "market_url"})
|
|
32
34
|
|
|
33
35
|
|
|
34
|
-
@app.command("token")
|
|
36
|
+
@app.command("token", cls=Command)
|
|
35
37
|
@cli_errors
|
|
36
38
|
def set_token() -> None:
|
|
37
39
|
"""隐藏输入平台 Token,避免写入命令历史与进程参数。"""
|
|
@@ -40,7 +42,7 @@ def set_token() -> None:
|
|
|
40
42
|
output({"status": "saved", "path": str(get_config_path()), "key": "market_token"})
|
|
41
43
|
|
|
42
44
|
|
|
43
|
-
@app.command("show")
|
|
45
|
+
@app.command("show", cls=Command)
|
|
44
46
|
@cli_errors
|
|
45
47
|
def show_config() -> None:
|
|
46
48
|
"""展示已保存和当前生效的配置、来源;不输出密钥原文或前缀。"""
|
|
@@ -63,7 +65,7 @@ def show_config() -> None:
|
|
|
63
65
|
)
|
|
64
66
|
|
|
65
67
|
|
|
66
|
-
@app.command("unset")
|
|
68
|
+
@app.command("unset", cls=Command)
|
|
67
69
|
@cli_errors
|
|
68
70
|
def unset_config(key: ConfigKey) -> None:
|
|
69
71
|
"""删除一项已保存配置,环境变量覆盖仍然有效。"""
|
|
@@ -6,19 +6,21 @@ from typing import Annotated
|
|
|
6
6
|
|
|
7
7
|
import typer
|
|
8
8
|
|
|
9
|
-
from quant_cli.app.data.data_dependency import build_market_query
|
|
10
9
|
from quant_cli.app.data.schema.dataset_request_schema import DatasetPrepareRequest
|
|
11
10
|
from quant_cli.app.data.service.dataset_load_service import load_dataset
|
|
12
11
|
from quant_cli.app.data.service.dataset_prepare_service import prepare_dataset
|
|
12
|
+
from quant_cli.common.command_error_handler import CommandGroup
|
|
13
|
+
from quant_cli.common.command_help import Command
|
|
13
14
|
from quant_cli.common.constants import DEFAULT_DATASETS_DIR
|
|
14
15
|
from quant_cli.common.utils.cli_utils import cli_errors, output
|
|
15
16
|
|
|
16
|
-
app = typer.Typer(help="行情快照准备与校验", no_args_is_help=True)
|
|
17
|
+
app = typer.Typer(cls=CommandGroup, help="行情快照准备与校验", no_args_is_help=True)
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
@app.command("prepare")
|
|
20
|
+
@app.command("prepare", cls=Command)
|
|
20
21
|
@cli_errors
|
|
21
22
|
def prepare(
|
|
23
|
+
ctx: typer.Context,
|
|
22
24
|
config: Annotated[Path, typer.Option(exists=True)],
|
|
23
25
|
cache_dir: Annotated[Path, typer.Option()] = DEFAULT_DATASETS_DIR,
|
|
24
26
|
) -> None:
|
|
@@ -26,7 +28,7 @@ def prepare(
|
|
|
26
28
|
request = DatasetPrepareRequest.model_validate_json(config.read_text(encoding="utf-8"))
|
|
27
29
|
|
|
28
30
|
async def execute() -> str:
|
|
29
|
-
async with
|
|
31
|
+
async with ctx.obj.market_client() as client:
|
|
30
32
|
result = await prepare_dataset(
|
|
31
33
|
client,
|
|
32
34
|
instrument_ids=request.instrument_ids,
|
|
@@ -45,7 +47,7 @@ def prepare(
|
|
|
45
47
|
output({"manifest_path": asyncio.run(execute())})
|
|
46
48
|
|
|
47
49
|
|
|
48
|
-
@app.command("verify")
|
|
50
|
+
@app.command("verify", cls=Command)
|
|
49
51
|
@cli_errors
|
|
50
52
|
def verify(manifest: Annotated[Path, typer.Option(exists=True)], max_rows: int = 1000000) -> None:
|
|
51
53
|
market, _ = load_dataset(manifest, max_rows)
|
|
@@ -59,7 +61,7 @@ def verify(manifest: Annotated[Path, typer.Option(exists=True)], max_rows: int =
|
|
|
59
61
|
)
|
|
60
62
|
|
|
61
63
|
|
|
62
|
-
@app.command("audit")
|
|
64
|
+
@app.command("audit", cls=Command)
|
|
63
65
|
@cli_errors
|
|
64
66
|
def audit(
|
|
65
67
|
manifest: Annotated[Path, typer.Option(exists=True)],
|
|
@@ -29,7 +29,4 @@ def load_backtest_market(manifest_path: Path, max_rows: int) -> BacktestMarketCo
|
|
|
29
29
|
def build_market_query() -> MarketClient:
|
|
30
30
|
"""显式在线准备入口,配置仅为服务地址与令牌。"""
|
|
31
31
|
connection = resolve_market_connection()
|
|
32
|
-
return MarketClient(
|
|
33
|
-
connection.url,
|
|
34
|
-
token=connection.token,
|
|
35
|
-
)
|
|
32
|
+
return MarketClient(connection.url, token=connection.token)
|
{powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/factor_definition_cli.py
RENAMED
|
@@ -9,15 +9,17 @@ import typer
|
|
|
9
9
|
from quant_core.app.factor.schema.factor_computation_schema import FactorComputationSpec
|
|
10
10
|
from quant_core.app.factor.schema.factor_publication_schema import PublishedFactor
|
|
11
11
|
|
|
12
|
+
from quant_cli.common.command_error_handler import CommandGroup
|
|
13
|
+
from quant_cli.common.command_help import Command
|
|
12
14
|
from quant_cli.common.http.definition_client import request_definition, save_definition
|
|
13
15
|
from quant_cli.common.utils.cli_utils import cli_errors, output
|
|
14
16
|
|
|
15
|
-
app = typer.Typer(help="因子定义发布、查询与获取", no_args_is_help=True)
|
|
17
|
+
app = typer.Typer(cls=CommandGroup, help="因子定义发布、查询与获取", no_args_is_help=True)
|
|
16
18
|
Server = Annotated[str, typer.Option(envvar="PQ_QUANT_URL")]
|
|
17
19
|
Token = Annotated[str, typer.Option(envvar="PQ_QUANT_TOKEN", help="建议由环境变量提供令牌")]
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
@app.command("publish")
|
|
22
|
+
@app.command("publish", cls=Command)
|
|
21
23
|
@cli_errors
|
|
22
24
|
def publish(
|
|
23
25
|
config: Annotated[Path, typer.Option(exists=True)],
|
|
@@ -38,7 +40,7 @@ def publish(
|
|
|
38
40
|
output(result.model_dump(mode="json"))
|
|
39
41
|
|
|
40
42
|
|
|
41
|
-
@app.command("list")
|
|
43
|
+
@app.command("list", cls=Command)
|
|
42
44
|
@cli_errors
|
|
43
45
|
def list_definitions(
|
|
44
46
|
server: Server, token: Token, name: str | None = None, limit: int = 100, offset: int = 0
|
|
@@ -50,7 +52,7 @@ def list_definitions(
|
|
|
50
52
|
output(request_definition(server, token, "GET", "/factor/definitions", params=params))
|
|
51
53
|
|
|
52
54
|
|
|
53
|
-
@app.command("fetch")
|
|
55
|
+
@app.command("fetch", cls=Command)
|
|
54
56
|
@cli_errors
|
|
55
57
|
def fetch(
|
|
56
58
|
name: str,
|
{powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/local_factor_cli.py
RENAMED
|
@@ -10,20 +10,21 @@ from quant_core.app.factor.schema.local_factor_schema import LocalFactorRequest
|
|
|
10
10
|
|
|
11
11
|
from quant_cli.app.factor.cli.factor_definition_cli import app as definitions
|
|
12
12
|
from quant_cli.app.factor.cli.local_selection_cli import register_selection_commands
|
|
13
|
-
from quant_cli.
|
|
14
|
-
from quant_cli.
|
|
13
|
+
from quant_cli.common.command_error_handler import CommandGroup
|
|
14
|
+
from quant_cli.common.command_help import Command
|
|
15
15
|
from quant_cli.common.constants import DEFAULT_DATABASE_PATH
|
|
16
16
|
from quant_cli.common.utils.cli_utils import cli_errors, output
|
|
17
17
|
|
|
18
|
-
app = typer.Typer(help="本地因子计算与归档", no_args_is_help=True)
|
|
18
|
+
app = typer.Typer(cls=CommandGroup, help="本地因子计算与归档", no_args_is_help=True)
|
|
19
19
|
|
|
20
20
|
app.add_typer(definitions, name="definition")
|
|
21
21
|
register_selection_commands(app)
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
@app.command("compute")
|
|
24
|
+
@app.command("compute", cls=Command)
|
|
25
25
|
@cli_errors
|
|
26
26
|
def compute(
|
|
27
|
+
ctx: typer.Context,
|
|
27
28
|
config: Annotated[Path, typer.Option(exists=True)],
|
|
28
29
|
source: Annotated[Path | None, typer.Option(exists=True)] = None,
|
|
29
30
|
definition: Annotated[list[Path] | None, typer.Option(exists=True)] = None,
|
|
@@ -47,21 +48,23 @@ def compute(
|
|
|
47
48
|
for path in definition
|
|
48
49
|
]
|
|
49
50
|
request = LocalFactorRequest.model_validate(payload)
|
|
50
|
-
output(asyncio.run(
|
|
51
|
+
output(asyncio.run(ctx.obj.factor_service.run(request, database)))
|
|
51
52
|
|
|
52
53
|
|
|
53
|
-
@app.command("get")
|
|
54
|
+
@app.command("get", cls=Command)
|
|
54
55
|
@cli_errors
|
|
55
56
|
def get(
|
|
57
|
+
ctx: typer.Context,
|
|
56
58
|
run: Annotated[UUID, typer.Option()],
|
|
57
59
|
database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
|
|
58
60
|
) -> None:
|
|
59
|
-
output(
|
|
61
|
+
output(ctx.obj.factor_service.store(database).get(run))
|
|
60
62
|
|
|
61
63
|
|
|
62
|
-
@app.command("list")
|
|
64
|
+
@app.command("list", cls=Command)
|
|
63
65
|
@cli_errors
|
|
64
66
|
def list_runs(
|
|
67
|
+
ctx: typer.Context,
|
|
65
68
|
limit: int = 20,
|
|
66
69
|
offset: int = 0,
|
|
67
70
|
database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
|
|
@@ -69,14 +72,15 @@ def list_runs(
|
|
|
69
72
|
output(
|
|
70
73
|
[
|
|
71
74
|
row.model_dump(mode="json")
|
|
72
|
-
for row in
|
|
75
|
+
for row in ctx.obj.factor_service.store(database).list_runs(limit, offset)
|
|
73
76
|
]
|
|
74
77
|
)
|
|
75
78
|
|
|
76
79
|
|
|
77
|
-
@app.command("import")
|
|
80
|
+
@app.command("import", cls=Command)
|
|
78
81
|
@cli_errors
|
|
79
82
|
def import_artifact(
|
|
83
|
+
ctx: typer.Context,
|
|
80
84
|
artifact: Annotated[Path, typer.Option(exists=True)],
|
|
81
85
|
database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
|
|
82
86
|
) -> None:
|
|
@@ -85,18 +89,19 @@ def import_artifact(
|
|
|
85
89
|
|
|
86
90
|
output(
|
|
87
91
|
import_factor_artifact(
|
|
88
|
-
artifact.read_text(encoding="utf-8"),
|
|
92
|
+
artifact.read_text(encoding="utf-8"), ctx.obj.factor_service.store(database)
|
|
89
93
|
)
|
|
90
94
|
)
|
|
91
95
|
|
|
92
96
|
|
|
93
|
-
@app.command("values")
|
|
97
|
+
@app.command("values", cls=Command)
|
|
94
98
|
@cli_errors
|
|
95
99
|
def values(
|
|
100
|
+
ctx: typer.Context,
|
|
96
101
|
run: Annotated[UUID, typer.Option()],
|
|
97
102
|
limit: int = 100,
|
|
98
103
|
offset: int = 0,
|
|
99
104
|
database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
|
|
100
105
|
) -> None:
|
|
101
106
|
"""分页查询归档因子值。"""
|
|
102
|
-
output(
|
|
107
|
+
output(ctx.obj.factor_service.store(database).list_values(run, limit, offset))
|