ml4t-data 0.2.0__tar.gz → 0.3.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.
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/PKG-INFO +9 -7
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/README.md +1 -1
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/pyproject.toml +11 -4
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/_version.py +2 -2
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/adjustments/__init__.py +6 -0
- ml4t_data-0.3.0/src/ml4t/data/adjustments/_history_factors.py +110 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/adjustments/core.py +17 -10
- ml4t_data-0.3.0/src/ml4t/data/adjustments/history.py +554 -0
- ml4t_data-0.3.0/src/ml4t/data/adjustments/inputs.py +336 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/__init__.py +2 -0
- ml4t_data-0.3.0/src/ml4t/data/assets/registry.py +300 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/validation.py +55 -46
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/calendar/crypto.py +39 -15
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cli/batch.py +1 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cli/core.py +8 -1
- ml4t_data-0.3.0/src/ml4t/data/compat/__init__.py +1 -0
- ml4t_data-0.3.0/src/ml4t/data/compat/empyrical.py +240 -0
- ml4t_data-0.3.0/src/ml4t/data/compat/zipline.py +535 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/config/models.py +13 -1
- ml4t_data-0.3.0/src/ml4t/data/core/feeds.py +26 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/core/models.py +67 -2
- ml4t_data-0.3.0/src/ml4t/data/core/revisions.py +101 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/data_manager.py +44 -40
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/__init__.py +3 -0
- ml4t_data-0.3.0/src/ml4t/data/futures/inputs.py +678 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/roll.py +164 -27
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/macro/downloader.py +10 -1
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/bulk_manager.py +6 -2
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/metadata_manager.py +16 -27
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/storage_manager.py +137 -33
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/AGENTS.md +1 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/__init__.py +12 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/base.py +122 -7
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/databento.py +62 -6
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/fama_french.py +125 -25
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/finnhub.py +18 -6
- ml4t_data-0.3.0/src/ml4t/data/providers/forecastex.py +438 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/fred.py +146 -7
- ml4t_data-0.3.0/src/ml4t/data/providers/kalshi.py +1634 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/polygon.py +22 -1
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/polymarket.py +740 -6
- ml4t_data-0.3.0/src/ml4t/data/providers/polymarket_us.py +431 -0
- ml4t_data-0.3.0/src/ml4t/data/providers/prediction_markets.py +136 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/protocols.py +17 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/registry.py +16 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/yahoo.py +87 -15
- ml4t_data-0.3.0/src/ml4t/data/sessions/_cme_crypto.py +85 -0
- ml4t_data-0.3.0/src/ml4t/data/sessions/assigner.py +458 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/sessions/completer.py +74 -145
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/__init__.py +5 -0
- ml4t_data-0.3.0/src/ml4t/data/storage/_temporal.py +80 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/flat.py +5 -31
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/hive.py +51 -47
- ml4t_data-0.3.0/src/ml4t/data/storage/snapshot.py +423 -0
- ml4t_data-0.3.0/src/ml4t/data/update_manager.py +1280 -0
- ml4t_data-0.3.0/src/ml4t/data/utils/atomic.py +31 -0
- ml4t_data-0.3.0/src/ml4t/data/utils/conversion.py +323 -0
- ml4t_data-0.3.0/src/ml4t/data/utils/gaps.py +492 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/validation/cross_validation.py +74 -40
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/validation/rules.py +45 -4
- ml4t_data-0.3.0/tests/_zipline_bundle_fixture.py +156 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/assets/test_validation.py +37 -7
- ml4t_data-0.3.0/tests/fixtures/acquisition/F-F_Momentum_Factor_CSV.zip +0 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/F-F_Momentum_Factor_daily_CSV.zip +0 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/F-F_Research_Data_5_Factors_2x3_daily_CSV.zip +0 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/F-F_Research_Data_Factors_CSV.zip +0 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/F-F_Research_Data_Factors_daily_CSV.zip +0 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/famafrench-provider-response.json +75 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/fred-dgs3mo.csv +4 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/provenance.json +21 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/yahoo-adjustment-provider.json +139 -0
- ml4t_data-0.3.0/tests/fixtures/acquisition/yahoo-dst-provider.json +123 -0
- ml4t_data-0.3.0/tests/futures/test_prepared_inputs.py +973 -0
- ml4t_data-0.3.0/tests/futures/test_scheduled_roll_workflow.py +103 -0
- ml4t_data-0.3.0/tests/integration/test_forecastex.py +34 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_kalshi.py +66 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_polymarket.py +57 -0
- ml4t_data-0.3.0/tests/integration/test_polymarket_us.py +35 -0
- ml4t_data-0.3.0/tests/providers/conftest.py +43 -0
- ml4t_data-0.3.0/tests/providers/fixtures/polymarket/clob_prices_history.json +106 -0
- ml4t_data-0.3.0/tests/providers/fixtures/polymarket/data_api_trades.json +413 -0
- ml4t_data-0.3.0/tests/providers/fixtures/polymarket/gamma_keyset_active.json +198 -0
- ml4t_data-0.3.0/tests/providers/fixtures/polymarket/gamma_keyset_closed.json +1224 -0
- ml4t_data-0.3.0/tests/providers/test_forecastex_provider.py +295 -0
- ml4t_data-0.3.0/tests/providers/test_kalshi_history.py +819 -0
- ml4t_data-0.3.0/tests/providers/test_polymarket_history.py +408 -0
- ml4t_data-0.3.0/tests/providers/test_polymarket_us_provider.py +323 -0
- ml4t_data-0.3.0/tests/test_acquisition_atomic_flush.py +41 -0
- ml4t_data-0.3.0/tests/test_acquisition_migration.py +893 -0
- ml4t_data-0.3.0/tests/test_acquisition_warning_contract.py +19 -0
- ml4t_data-0.3.0/tests/test_action_inputs.py +332 -0
- ml4t_data-0.3.0/tests/test_adjusted_history.py +428 -0
- ml4t_data-0.3.0/tests/test_calendar_backfill_ranges.py +205 -0
- ml4t_data-0.3.0/tests/test_calendar_frame_bounds.py +210 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_cli_batch.py +3 -1
- ml4t_data-0.3.0/tests/test_cme_crypto_cutover.py +168 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_conversion.py +80 -10
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_crypto_assets.py +45 -1
- ml4t_data-0.3.0/tests/test_daily_session_gaps.py +157 -0
- ml4t_data-0.3.0/tests/test_daily_timestamp_declarations.py +180 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_data_manager_storage.py +4 -1
- ml4t_data-0.3.0/tests/test_dated_inputs.py +206 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_fama_french_provider.py +32 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_finnhub_provider.py +15 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_gaps.py +27 -30
- ml4t_data-0.3.0/tests/test_history_factors.py +272 -0
- ml4t_data-0.3.0/tests/test_history_identity.py +249 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_incremental_update_system.py +13 -3
- ml4t_data-0.3.0/tests/test_ingestion_calendar_declarations.py +197 -0
- ml4t_data-0.3.0/tests/test_intraday_schedule_gaps.py +381 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_macro_downloader.py +2 -1
- ml4t_data-0.3.0/tests/test_market_input_handoff.py +456 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_polygon_provider.py +24 -0
- ml4t_data-0.3.0/tests/test_portable_snapshot.py +465 -0
- ml4t_data-0.3.0/tests/test_portable_snapshot_example.py +29 -0
- ml4t_data-0.3.0/tests/test_preserve_market_absences.py +161 -0
- ml4t_data-0.3.0/tests/test_provider_tls_trust.py +28 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_release_pipeline.py +107 -1
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_release_workflows.py +4 -0
- ml4t_data-0.3.0/tests/test_session_calendar_contract.py +380 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_sessions.py +28 -36
- ml4t_data-0.3.0/tests/test_source_reference_contract.py +99 -0
- ml4t_data-0.3.0/tests/test_stored_gap_report.py +409 -0
- ml4t_data-0.3.0/tests/test_targeted_databento_acquisition.py +480 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_update_manager.py +48 -13
- ml4t_data-0.3.0/tests/test_update_provider_reuse.py +48 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_utils_gaps.py +73 -138
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_validation.py +1 -1
- ml4t_data-0.3.0/tests/test_validation_calendar_contract.py +280 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_validation_rules.py +5 -5
- ml4t_data-0.3.0/tests/test_zipline_bundle_exchange.py +374 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/validation/test_rules.py +3 -3
- ml4t_data-0.2.0/src/ml4t/data/providers/kalshi.py +0 -832
- ml4t_data-0.2.0/src/ml4t/data/sessions/assigner.py +0 -287
- ml4t_data-0.2.0/src/ml4t/data/update_manager.py +0 -851
- ml4t_data-0.2.0/src/ml4t/data/utils/conversion.py +0 -138
- ml4t_data-0.2.0/src/ml4t/data/utils/gaps.py +0 -329
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/.gitignore +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/LICENSE +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/scripts/verify_distribution.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/scripts/verify_provider_contract_runs.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/AGENTS.md +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/anomaly/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/anomaly/base.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/anomaly/config.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/anomaly/detectors.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/anomaly/manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/asset_class.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/contracts.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/data/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/data/crypto_top100.json +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/data/forex_majors.json +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/data/nasdaq100.json +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/data/sp500.json +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/assets/schemas.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/calendar/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cli/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cli/config.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cli/cot.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cli/futures.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cli/utils.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cli_interface.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/config/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/config/_serialization.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/config/loader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/config/validator.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/core/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/core/config.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/core/exceptions.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/core/schemas.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cot/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cot/fetcher.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/cot/workflow.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/crypto/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/crypto/downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/etfs/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/etfs/downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/export/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/export/formats/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/export/formats/base.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/export/formats/csv.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/export/formats/excel.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/export/formats/json.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/export/manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/AGENTS.md +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/adjustment.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/book_downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/config.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/continuous.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/continuous_downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/databento_parser.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/definitions.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/individual_downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/parser.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/futures/schema.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/macro/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/async_batch.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/batch_manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/config_manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/fetch_manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/managers/provider_manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/provider_updater.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/alpaca.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/aqr.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/async_base.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/binance.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/binance_public.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/coingecko.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/cryptocompare.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/eodhd.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/fundamentals.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/fxmacrodata.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/learned_synthetic.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/mixins/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/mixins/async_session.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/mixins/circuit_breaker.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/mixins/rate_limit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/mixins/retry.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/mixins/session.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/mixins/validation.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/mock.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/nasdaq_itch.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/oanda.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/okx.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/synthetic.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/tiingo.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/twelve_data.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/providers/wiki_prices.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/py.typed +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/security/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/security/path_validator.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/sessions/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/AGENTS.md +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/async_base.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/backend.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/chunked.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/config.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/data_profile.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/keys.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/legacy_migration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/metadata_tracker.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/migration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/storage/protocols.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/synthetic/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/synthetic/ohlcv_utils.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/synthetic/registry.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/universe.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/utils/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/utils/async_rate_limit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/utils/format.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/utils/gap_optimizer.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/utils/global_rate_limit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/utils/locking.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/utils/rate_limit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/utils/retry.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/validation/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/validation/base.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/validation/ohlcv.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/src/ml4t/data/validation/report.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/anomaly/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/anomaly/test_base.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/anomaly/test_config.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/anomaly/test_detectors.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/anomaly/test_manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/assets/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/assets/test_asset_class.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/assets/test_contracts.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/assets/test_schemas.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/conftest.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/core/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/core/test_schemas.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/cot/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/cot/test_fetcher.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/cot/test_workflow.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/futures/test_adjustment.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/futures/test_book_downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/futures/test_continuous.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/futures/test_databento_parser.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/futures/test_downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/futures/test_parser.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/futures/test_roll.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/conftest.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_alpaca.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_binance_public.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_coingecko.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_cryptocompare.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_eodhd.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_factor_providers.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_finnhub.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_fred.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_fxmacrodata.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_oanda.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_polygon.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_real_api_integration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_release_provider_contracts.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_tiingo.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_twelve_data.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_wiki_prices.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/integration/test_yahoo.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/providers/test_nasdaq_itch.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/storage/test_data_profile.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/storage/test_keys.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/storage/test_legacy_migration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/storage/test_metadata_tracker.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/storage/test_migration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/synthetic/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/synthetic/test_learned_synthetic.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/synthetic/test_registry.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_adjustments_core.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_alpaca_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_anomaly/__init__.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_anomaly/test_detectors.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_anomaly/test_manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_aqr_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_aqr_provider_edge_cases.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_async_providers.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_async_providers_extended.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_async_rate_limit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_base_provider_enhanced.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_batch_load.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_batch_load_integration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_batch_load_performance.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_binance.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_binance_public_edge_cases.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_binance_public_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_chunked_storage.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_cli_interface.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_coingecko_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_config.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_config_basics.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_config_integration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_config_loader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_config_models.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_config_validator.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_configuration_authority.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_core_abstractions.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_core_models.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_cot.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_crypto_downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_cryptocompare.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_cryptocompare_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_data_manager.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_data_manager_unit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_data_manager_universe.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_databento_acceptance.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_databento_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_distribution_verification.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_eodhd_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_etf_downloader.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_exceptions.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_export.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_fred_unit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_fundamentals_providers.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_fxmacrodata_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_gap_optimizer.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_global_rate_limit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_global_rate_limiting.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_hive_storage.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_import.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_kalshi_unit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_locking.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_metadata_tracker.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_mock_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_mock_provider_enhanced.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_multi_asset.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_oanda_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_offline_network_policy.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_okx_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_package_metadata.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_polymarket_unit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_provider_consistency.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_provider_contract_verification.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_provider_registration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_provider_registry_contract.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_provider_updater.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_rate_limit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_regenerate_combined.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_retry.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_security.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_simple_utils.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_storage.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_storage_backends.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_storage_config_authority.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_storage_migration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_storage_paths.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_synthetic_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_tiingo_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_twelve_data_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_universe.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_validation_report.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_validation_simple.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_validation_unit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_wiki_prices_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_yahoo_empty_download_reporting.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_yahoo_provider.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_yahoo_provider_edge_cases.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/test_yahoo_provider_unit.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/utils/test_format.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/utils/test_format_integration.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/validation/test_cross_validation.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/validation/test_ohlcv_validator.py +0 -0
- {ml4t_data-0.2.0 → ml4t_data-0.3.0}/tests/validation/test_report.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ml4t-data
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Market data acquisition, storage, and update workflows for machine learning for trading.
|
|
5
5
|
Project-URL: Homepage, https://www.ml4trading.io/
|
|
6
6
|
Project-URL: Documentation, https://www.ml4trading.io/docs/data/
|
|
@@ -29,15 +29,17 @@ Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
|
29
29
|
Classifier: Typing :: Typed
|
|
30
30
|
Requires-Python: <3.15,>=3.12
|
|
31
31
|
Requires-Dist: aiofiles>=23.0.0
|
|
32
|
+
Requires-Dist: certifi>=2026.10.19
|
|
32
33
|
Requires-Dist: click>=8.0.0
|
|
33
34
|
Requires-Dist: filelock>=3.19.1
|
|
34
35
|
Requires-Dist: httpx>=0.25.0
|
|
36
|
+
Requires-Dist: ml4t-specs>=0.2.0
|
|
35
37
|
Requires-Dist: numpy>=1.24.0
|
|
36
38
|
Requires-Dist: openpyxl>=3.1.5
|
|
37
|
-
Requires-Dist: pandas-market-calendars>=4.
|
|
39
|
+
Requires-Dist: pandas-market-calendars>=5.4.0
|
|
38
40
|
Requires-Dist: pandas>=2.0.0
|
|
39
41
|
Requires-Dist: platformdirs>=4.0.0
|
|
40
|
-
Requires-Dist: polars>=
|
|
42
|
+
Requires-Dist: polars>=1.36.1
|
|
41
43
|
Requires-Dist: pybreaker>=1.0.0
|
|
42
44
|
Requires-Dist: pydantic-settings>=2.0.0
|
|
43
45
|
Requires-Dist: pydantic<3,>=2.12
|
|
@@ -68,14 +70,14 @@ Requires-Dist: requests>=2.32.0; extra == 'all'
|
|
|
68
70
|
Requires-Dist: ruff>=0.1.0; extra == 'all'
|
|
69
71
|
Requires-Dist: ty; extra == 'all'
|
|
70
72
|
Requires-Dist: xlsxwriter>=3.1.0; extra == 'all'
|
|
71
|
-
Requires-Dist: yfinance>=
|
|
73
|
+
Requires-Dist: yfinance>=1.5.2; extra == 'all'
|
|
72
74
|
Provides-Extra: all-providers
|
|
73
75
|
Requires-Dist: cot-reports>=0.1.0; extra == 'all-providers'
|
|
74
76
|
Requires-Dist: databento>=0.38.0; extra == 'all-providers'
|
|
75
77
|
Requires-Dist: oandapyv20>=0.7.0; extra == 'all-providers'
|
|
76
78
|
Requires-Dist: pyarrow>=14.0.0; extra == 'all-providers'
|
|
77
79
|
Requires-Dist: requests>=2.32.0; extra == 'all-providers'
|
|
78
|
-
Requires-Dist: yfinance>=
|
|
80
|
+
Requires-Dist: yfinance>=1.5.2; extra == 'all-providers'
|
|
79
81
|
Provides-Extra: cot
|
|
80
82
|
Requires-Dist: cot-reports>=0.1.0; extra == 'cot'
|
|
81
83
|
Provides-Extra: databento
|
|
@@ -104,7 +106,7 @@ Provides-Extra: oanda
|
|
|
104
106
|
Requires-Dist: oandapyv20>=0.7.0; extra == 'oanda'
|
|
105
107
|
Requires-Dist: requests>=2.32.0; extra == 'oanda'
|
|
106
108
|
Provides-Extra: yahoo
|
|
107
|
-
Requires-Dist: yfinance>=
|
|
109
|
+
Requires-Dist: yfinance>=1.5.2; extra == 'yahoo'
|
|
108
110
|
Description-Content-Type: text/markdown
|
|
109
111
|
|
|
110
112
|
# ml4t-data
|
|
@@ -179,7 +181,7 @@ uv run pre-commit install
|
|
|
179
181
|
uv run ruff check src/ tests/
|
|
180
182
|
uv run ruff format --check src/ tests/
|
|
181
183
|
uv run ty check
|
|
182
|
-
uv run pytest tests/ -q
|
|
184
|
+
uv run pytest tests/ -q -ra --cov=ml4t.data --cov-report=term-missing
|
|
183
185
|
uv run mkdocs build --strict
|
|
184
186
|
uv build
|
|
185
187
|
```
|
|
@@ -70,7 +70,7 @@ uv run pre-commit install
|
|
|
70
70
|
uv run ruff check src/ tests/
|
|
71
71
|
uv run ruff format --check src/ tests/
|
|
72
72
|
uv run ty check
|
|
73
|
-
uv run pytest tests/ -q
|
|
73
|
+
uv run pytest tests/ -q -ra --cov=ml4t.data --cov-report=term-missing
|
|
74
74
|
uv run mkdocs build --strict
|
|
75
75
|
uv build
|
|
76
76
|
```
|
|
@@ -8,6 +8,9 @@ build-backend = "hatchling.build"
|
|
|
8
8
|
[tool.hatch.version]
|
|
9
9
|
source = "vcs"
|
|
10
10
|
|
|
11
|
+
[tool.hatch.metadata]
|
|
12
|
+
allow-direct-references = true
|
|
13
|
+
|
|
11
14
|
[tool.hatch.build.hooks.vcs]
|
|
12
15
|
version-file = "src/ml4t/data/_version.py"
|
|
13
16
|
|
|
@@ -74,12 +77,14 @@ requires-python = ">=3.12,<3.15"
|
|
|
74
77
|
|
|
75
78
|
# Core dependencies
|
|
76
79
|
dependencies = [
|
|
80
|
+
"ml4t-specs>=0.2.0",
|
|
77
81
|
# Data processing
|
|
78
|
-
"polars>=
|
|
82
|
+
"polars>=1.36.1",
|
|
79
83
|
"pandas>=2.0.0",
|
|
80
84
|
"numpy>=1.24.0",
|
|
81
85
|
# HTTP and networking
|
|
82
86
|
"httpx>=0.25.0",
|
|
87
|
+
"certifi>=2026.10.19",
|
|
83
88
|
"tenacity>=8.0.0",
|
|
84
89
|
"pybreaker>=1.0.0", # Circuit breaker pattern
|
|
85
90
|
# Configuration and CLI
|
|
@@ -95,14 +100,14 @@ dependencies = [
|
|
|
95
100
|
"rich>=13.0.0",
|
|
96
101
|
"aiofiles>=23.0.0", # Async file I/O for async storage backends
|
|
97
102
|
# Exchange calendars for session-aware operations
|
|
98
|
-
"pandas-market-calendars>=4.
|
|
103
|
+
"pandas-market-calendars>=5.4.0",
|
|
99
104
|
"openpyxl>=3.1.5",
|
|
100
105
|
]
|
|
101
106
|
|
|
102
107
|
[project.optional-dependencies]
|
|
103
108
|
# Provider-specific dependencies
|
|
104
109
|
yahoo = [
|
|
105
|
-
"yfinance>=
|
|
110
|
+
"yfinance>=1.5.2",
|
|
106
111
|
]
|
|
107
112
|
databento = [
|
|
108
113
|
"databento>=0.38.0",
|
|
@@ -181,7 +186,7 @@ dev = [
|
|
|
181
186
|
"twine>=6.0.0",
|
|
182
187
|
"pip-audit>=2.10.1",
|
|
183
188
|
"databento>=0.38.0",
|
|
184
|
-
"yfinance>=
|
|
189
|
+
"yfinance>=1.5.2",
|
|
185
190
|
]
|
|
186
191
|
|
|
187
192
|
[tool.uv]
|
|
@@ -301,6 +306,8 @@ omit = [
|
|
|
301
306
|
]
|
|
302
307
|
|
|
303
308
|
[tool.coverage.report]
|
|
309
|
+
fail_under = 85
|
|
310
|
+
show_missing = true
|
|
304
311
|
exclude_lines = [
|
|
305
312
|
"pragma: no cover",
|
|
306
313
|
"def __repr__",
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.
|
|
22
|
-
__version_tuple__ = version_tuple = (0,
|
|
21
|
+
__version__ = version = '0.3.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 3, 0)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -15,9 +15,15 @@ from .core import (
|
|
|
15
15
|
apply_dividends,
|
|
16
16
|
apply_splits,
|
|
17
17
|
)
|
|
18
|
+
from .history import AdjustedHistory, prepare_adjusted_history
|
|
19
|
+
from .inputs import apply_adjustment_factors, prepare_action_inputs
|
|
18
20
|
|
|
19
21
|
__all__ = [
|
|
20
22
|
"apply_splits",
|
|
21
23
|
"apply_dividends",
|
|
22
24
|
"apply_corporate_actions",
|
|
25
|
+
"apply_adjustment_factors",
|
|
26
|
+
"prepare_action_inputs",
|
|
27
|
+
"AdjustedHistory",
|
|
28
|
+
"prepare_adjusted_history",
|
|
23
29
|
]
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""Select supplied factor curves without recomputing their financial definition."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
import pandas as pd
|
|
7
|
+
import polars as pl
|
|
8
|
+
|
|
9
|
+
from ml4t.data.core.revisions import select_revisions, session_label_at, utc_column, utc_cutoff
|
|
10
|
+
from ml4t.specs import FeedSpec
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def prepare_supplied_factors(
|
|
14
|
+
factors: pl.DataFrame,
|
|
15
|
+
prices: pl.DataFrame,
|
|
16
|
+
actions: pl.DataFrame,
|
|
17
|
+
feed: FeedSpec,
|
|
18
|
+
as_of: datetime | str | None,
|
|
19
|
+
clock_col: str,
|
|
20
|
+
) -> tuple[pl.DataFrame, dict[str, Any]]:
|
|
21
|
+
asset = FeedSpec._coerce_entity_col(feed.entity_col) or "asset"
|
|
22
|
+
keys = [asset, clock_col]
|
|
23
|
+
if "price_adjustment_factor" not in factors.columns:
|
|
24
|
+
raise ValueError("A supplied history requires price_adjustment_factor")
|
|
25
|
+
candidates = factors.join(prices.select(keys).unique(), on=keys, how="semi")
|
|
26
|
+
candidates = utc_column(candidates, "available_at", feed.timezone)
|
|
27
|
+
versioned = {"source", "revision_id"}.issubset(candidates.columns) and all(
|
|
28
|
+
not candidates[name].null_count() for name in ("source", "revision_id")
|
|
29
|
+
)
|
|
30
|
+
selected = (
|
|
31
|
+
select_revisions(candidates, [*keys, "source"], as_of)
|
|
32
|
+
if as_of is not None or versioned
|
|
33
|
+
else candidates
|
|
34
|
+
)
|
|
35
|
+
if selected.select(keys).is_duplicated().any():
|
|
36
|
+
raise ValueError("Choose one supplied factor revision per observation")
|
|
37
|
+
if prices.select(keys).join(selected.select(keys), on=keys, how="anti").height:
|
|
38
|
+
raise ValueError("Supplied factor coverage is incomplete at the requested cutoff")
|
|
39
|
+
if "basis_at" not in selected.columns:
|
|
40
|
+
selected = selected.with_columns(
|
|
41
|
+
pl.lit(None, dtype=pl.Datetime("ns", "UTC")).alias("basis_at")
|
|
42
|
+
)
|
|
43
|
+
if selected.schema["basis_at"] != pl.Date:
|
|
44
|
+
selected = utc_column(selected, "basis_at", feed.timezone)
|
|
45
|
+
if as_of is not None:
|
|
46
|
+
if selected.schema["basis_at"] == pl.Date or selected["basis_at"].null_count():
|
|
47
|
+
raise ValueError("Known basis_at instants are required for causal supplied factors")
|
|
48
|
+
if selected.filter(pl.col("basis_at") > utc_cutoff(as_of)).height:
|
|
49
|
+
raise ValueError("Supplied basis_at cannot be later than the cutoff")
|
|
50
|
+
counts = selected.group_by(asset).agg(pl.col("basis_at").n_unique())
|
|
51
|
+
if counts.filter(pl.col("basis_at") != 1).height:
|
|
52
|
+
raise ValueError("Declare one supplied share basis per asset")
|
|
53
|
+
bases = selected.select(asset, "basis_at").unique()
|
|
54
|
+
if actions.height:
|
|
55
|
+
latest = actions.group_by(asset).agg(
|
|
56
|
+
pl.col("effective_at").max().alias("last_effective_at")
|
|
57
|
+
)
|
|
58
|
+
if actions.schema["effective_at"] == pl.Date:
|
|
59
|
+
stamps = bases["basis_at"].cast(pl.Datetime("ns", "UTC")).cast(pl.Int64)
|
|
60
|
+
labels = [
|
|
61
|
+
session_label_at(pd.Timestamp(value, unit="ns", tz="UTC"), feed)
|
|
62
|
+
for value in stamps
|
|
63
|
+
]
|
|
64
|
+
bases = bases.with_columns(pl.Series("basis_session", labels, dtype=pl.Date))
|
|
65
|
+
checked = bases.join(latest, on=asset, how="left")
|
|
66
|
+
stale = checked.filter(pl.col("last_effective_at") > pl.col("basis_session"))
|
|
67
|
+
else:
|
|
68
|
+
checked = bases.join(latest, on=asset, how="left")
|
|
69
|
+
stale = checked.filter(pl.col("last_effective_at") > pl.col("basis_at"))
|
|
70
|
+
if stale.height:
|
|
71
|
+
raise ValueError("Supplied share basis predates an applicable known source action")
|
|
72
|
+
if "currency" in selected.columns and "currency" in prices.columns:
|
|
73
|
+
units = prices.select(*keys, pl.col("currency").alias("price_currency")).join(
|
|
74
|
+
selected.select(*keys, pl.col("currency").alias("factor_currency")),
|
|
75
|
+
on=keys,
|
|
76
|
+
)
|
|
77
|
+
if units.filter(
|
|
78
|
+
pl.col("price_currency").is_not_null()
|
|
79
|
+
& pl.col("factor_currency").is_not_null()
|
|
80
|
+
& (pl.col("price_currency") != pl.col("factor_currency"))
|
|
81
|
+
).height:
|
|
82
|
+
raise ValueError("Known price and supplied factor currency units conflict")
|
|
83
|
+
numeric = [
|
|
84
|
+
name
|
|
85
|
+
for name in ("price_adjustment_factor", "volume_adjustment_factor")
|
|
86
|
+
if name in selected.columns
|
|
87
|
+
]
|
|
88
|
+
provenance = [name for name in selected.columns if name not in {*keys, *numeric}]
|
|
89
|
+
projected = selected.select(
|
|
90
|
+
*keys,
|
|
91
|
+
*numeric,
|
|
92
|
+
*(pl.col(name).alias(f"factor_{name}") for name in provenance),
|
|
93
|
+
)
|
|
94
|
+
output = (
|
|
95
|
+
prices.select(asset, feed.timestamp_col, clock_col)
|
|
96
|
+
.join(
|
|
97
|
+
projected,
|
|
98
|
+
on=keys,
|
|
99
|
+
how="left",
|
|
100
|
+
validate="1:1",
|
|
101
|
+
)
|
|
102
|
+
.drop(clock_col)
|
|
103
|
+
)
|
|
104
|
+
return output, {
|
|
105
|
+
"factor_revision_identity": "declared" if versioned else "unknown unversioned capture",
|
|
106
|
+
"factor_basis_known": not selected["basis_at"].null_count(),
|
|
107
|
+
"factor_availability_known": not selected["available_at"].null_count(),
|
|
108
|
+
"factor_rows_outside_window": factors.height - candidates.height,
|
|
109
|
+
"volume_factor_supplied": "volume_adjustment_factor" in numeric,
|
|
110
|
+
}
|
|
@@ -47,6 +47,22 @@ def _future_cumulative_product(column: str) -> pl.Expr:
|
|
|
47
47
|
return pl.col(column).shift(-1, fill_value=1.0).reverse().cum_prod().reverse()
|
|
48
48
|
|
|
49
49
|
|
|
50
|
+
def _event_adjustment_factors(
|
|
51
|
+
prices: pl.DataFrame, *, split_col: str, dividend_col: str | None
|
|
52
|
+
) -> pl.DataFrame:
|
|
53
|
+
"""Add canonical local event factors before composing a historical share basis."""
|
|
54
|
+
price_event_factor = (
|
|
55
|
+
pl.col("close")
|
|
56
|
+
/ (pl.col(split_col).cast(pl.Float64) * (pl.col("close") + pl.col(dividend_col)))
|
|
57
|
+
if dividend_col is not None
|
|
58
|
+
else 1.0 / pl.col(split_col).cast(pl.Float64)
|
|
59
|
+
)
|
|
60
|
+
return prices.with_columns(
|
|
61
|
+
price_event_factor.alias("_price_event_factor"),
|
|
62
|
+
pl.col(split_col).cast(pl.Float64).alias("_volume_event_factor"),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
50
66
|
def _apply_canonical_adjustments(
|
|
51
67
|
prices: pl.DataFrame,
|
|
52
68
|
*,
|
|
@@ -64,16 +80,7 @@ def _apply_canonical_adjustments(
|
|
|
64
80
|
)
|
|
65
81
|
df = prices.sort("date").clone()
|
|
66
82
|
|
|
67
|
-
|
|
68
|
-
pl.col("close")
|
|
69
|
-
/ (pl.col(split_col).cast(pl.Float64) * (pl.col("close") + pl.col(dividend_col)))
|
|
70
|
-
if dividend_col is not None
|
|
71
|
-
else 1.0 / pl.col(split_col).cast(pl.Float64)
|
|
72
|
-
)
|
|
73
|
-
df = df.with_columns(
|
|
74
|
-
price_event_factor.alias("_price_event_factor"),
|
|
75
|
-
pl.col(split_col).cast(pl.Float64).alias("_volume_event_factor"),
|
|
76
|
-
).with_columns(
|
|
83
|
+
df = _event_adjustment_factors(df, split_col=split_col, dividend_col=dividend_col).with_columns(
|
|
77
84
|
_future_cumulative_product("_price_event_factor").alias("price_adjustment_factor"),
|
|
78
85
|
_future_cumulative_product("_volume_event_factor").alias("volume_adjustment_factor"),
|
|
79
86
|
)
|