exness-data-preprocess 0.6.0__tar.gz → 0.7.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.
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.cz.toml +1 -1
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/AUTHORS.md +1 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/CHANGELOG.md +11 -2
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/CLAUDE.md +16 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/CONTRIBUTING.md +7 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/DOCUMENTATION.md +30 -4
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/GITHUB_PYPI_SETUP.md +38 -1
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/PKG-INFO +5 -1
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/README.md +3 -0
- exness_data_preprocess-0.7.0/RELEASE_NOTES.md +21 -0
- exness_data_preprocess-0.7.0/RELEASE_NOTES_SHORT.md +40 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/DATABASE_SCHEMA.md +59 -43
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/EXNESS_DATA_SOURCES.md +30 -6
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/MODULE_ARCHITECTURE.md +75 -3
- exness_data_preprocess-0.7.0/docs/PHASE4_DRY_RUN_CONFIG_PLAN.yaml +362 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/README.md +26 -18
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/RESEARCH_PATTERNS.md +18 -5
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/TRADING_HOURS_RESEARCH.md +86 -22
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/UNIFIED_DUCKDB_PLAN_v2.md +1 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/archive/PYDANTIC_REFACTORING_PLAN_v0.2.0_COMPLETE.md +46 -6
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/archive/PYDANTIC_REFACTORING_STATUS_v0.2.0_COMPLETE.md +23 -4
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/optimization/OPTIMIZATION_OPPORTUNITIES_2025-10-18.md +98 -65
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/CLAUDE_MD_AUDIT_2025-10-16_PASS2.md +48 -26
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/CLAUDE_MD_VERIFICATION_CHECKLIST_2025-10-16.md +57 -1
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/CLAUDE_MD_VERIFICATION_FINDINGS_2025-10-16.md +45 -17
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/DOCUMENTATION_AUDIT_2025-10-15.md +40 -8
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/DOCUMENTATION_AUDIT_PASS2_2025-10-15.md +16 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/DOCUMENTATION_BEST_PRACTICES_LINE_COUNTS.md +19 -4
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/EXCHANGE_SESSION_AUDIT_2025-10-17.md +56 -16
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/FUNCTIONALITY_VALIDATION_REPORT_2025-10-15.md +42 -9
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/FUNCTIONALITY_VALIDATION_REPORT_2025-10-16.md +44 -20
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/PHASE7_v1.5.0_REFACTORING_PLAN.md +61 -20
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/PHASE7_v1.6.0_REFACTORING_PROGRESS.md +24 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/REFACTORING_CHECKLIST.md +17 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/RESEARCH_PATTERNS_CANONICALIZATION_2025-10-17.md +29 -5
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/SCHEMA_v1.6.0_AUDIT_FINDINGS.md +35 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/SCHEMA_v1.6.0_MIGRATION_GUIDE.md +30 -1
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/SESSION_2025-10-15_SUMMARY.md +27 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/GAP_DETECTION_COMPARISON.md +36 -18
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/GAP_DETECTION_SQL_APPROACH.md +30 -6
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/HYBRID_SESSION_DETECTION_ANALYSIS.md +79 -5
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/compression-benchmarks/README.md +17 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/01-methodology.md +30 -7
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/02-mode-truncated-analysis.md +67 -42
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/03-hurdle-model-analysis.md +73 -50
- exness_data_preprocess-0.7.0/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +166 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/05-final-recommendations.md +50 -22
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/README.md +13 -6
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/scripts/reproduction_guide.md +30 -11
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/01-methodology.md +28 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/02-baseline-sep2024.md +23 -11
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/03-multiperiod-validation.md +51 -27
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/04-discoveries-and-plan-evolution.md +29 -7
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/README.md +14 -6
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/findings/baseline-sep2024-comprehensive-summary.md +72 -32
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/findings/phase2-mean-reversion-report.md +9 -6
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/findings/phase3-volatility-model-report.md +5 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/findings/phase4-5-statistical-tests-survivorship-report.md +77 -58
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/reproduction_guide.md +28 -2
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/ARCHITECTURE_AUDIT_2025-10-17.md +54 -32
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/ARCHITECTURE_EFFICIENCY_AUDIT_2025-10-18.md +50 -26
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/DOCUMENTATION_SURVEY_v1.7.0.md +37 -3
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md +30 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md +35 -6
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md +46 -16
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/WEEKEND_GAP_VALIDATION_SUMMARY.md +13 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/WORKSPACE_SURVEY_2025-10-17.md +21 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/pyproject.toml +2 -1
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/__init__.py +3 -1
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/api.py +20 -7
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/cli.py +45 -1
- exness_data_preprocess-0.7.0/src/exness_data_preprocess/config.py +126 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/models.py +90 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/processor.py +68 -11
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/README.md +5 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/archive/E2E_TESTING_PLAN_v1.0.0.md +23 -0
- exness_data_preprocess-0.6.0/RELEASE_NOTES.md +0 -26
- exness_data_preprocess-0.6.0/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +0 -166
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.github/workflows/ci.yml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.github/workflows/publish.yml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.gitignore +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.pre-commit-config.yaml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/LICENSE +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/Makefile +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/cliff-release-notes.toml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/cliff.toml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/PHASE2_SESSION_VECTORIZATION_PLAN.yaml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/PHASE3_SQL_GAP_DETECTION_PLAN.yaml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/archive/UNIFIED_DUCKDB_PLAN_v1.0.0_LEGACY.md +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/implementation-plan.yaml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/planning-index.yaml +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/compression-benchmarks/test_all_compression_methods.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/compression-benchmarks/test_delta_encoding_properly.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/compression-benchmarks/test_parquet_compression_methods.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/hurdle-model/hurdle_decomposition.png +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/cv_mode_comparison.png +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/distribution_overlay.png +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/signal_quality_comparison.png +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/variance_decomposition.png +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/concentration_curve.png +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/percentile_analysis.png +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/01_mean_reversion_analysis.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/02_volatility_model_simple.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/03_liquidity_crisis_detection.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/04_regime_detection_analysis.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase1_data_validation.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase2_mean_reversion.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase3_volatility_model.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase4_statistical_tests.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias_v1.0.1.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6a_interval_analysis.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6b_price_clustering.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6c_combined_pattern.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/diagnostic_burst_decay.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_interactive_dashboard.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_lightweight_dashboard.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/prepare_visualization_data.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/gap_detection_implementation_example.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/examples/basic_usage.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/examples/batch_processing.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/database_manager.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/downloader.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/exchanges.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/gap_detector.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/ohlc_generator.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/query_engine.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/schema.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/session_detector.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/tick_loader.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/__init__.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/conftest.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_basic.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_functional_regression.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_models.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_processor_pydantic.py +0 -0
- {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_types.py +0 -0
|
@@ -6,11 +6,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
### ✨ Features
|
|
10
|
+
|
|
11
|
+
- **phase4**: Add dry-run mode and config file support Implements Phase 4 features from adversarial probe recommendations. Both features follow SSoT methodology with iterative plan updates. **Dry-Run Mode**: - Preview download operations without file system changes - Estimates based on historical averages (~9.5M ticks/month, ~11 MB/month) - Returns DryRunResult with gap analysis and size estimates - CLI: exness-preprocess process --dry-run **Config File Support**: - Persistent user preferences in ~/.exness-preprocess.yaml - Pydantic validation with off-the-shelf PyYAML - Priority resolution: CLI flags > config > defaults - Optional (no error if missing) - CLI: exness-preprocess --config /path/to/config.yaml **Implementation**: - config.py (new): ConfigModel with Pydantic + PyYAML loader - models.py: DryRunResult model with 2 computed fields - processor.py: dry_run + config parameters, union return type - api.py: dry_run forwarding for v1.0.0 API compatibility - cli.py: --dry-run + --config flags with precedence logic - pyproject.toml: pyyaml>=6.0.0 dependency **SLOs**: - Availability: Features optional, no breaking changes - Correctness: Gap detector reused, Pydantic validation on config - Observability: Dry-run prints estimate summary - Maintainability: Off-the-shelf PyYAML, no custom config parser **Testing**: - All 48 tests passing - Backward compatible (all new parameters optional) - Config file errors propagate (no silent fallbacks) **Time**: ~1.5 hours (as estimated in probe report) Related: v0.6.0 probe recommendations (items 4-5) SSoT Plan: docs/PHASE4_DRY_RUN_CONFIG_PLAN.yaml v2.0.0
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### 💅 Code Style
|
|
15
|
+
|
|
16
|
+
- Format markdown files with prettier Auto-formatted 66 markdown files across docs, root, and tests directories to maintain consistent style and readability.
|
|
17
|
+
|
|
9
18
|
### 🔌 API Enhancements
|
|
10
19
|
|
|
11
|
-
- **api**: Add AI-agent-friendly input validation (Phase 1 critical fixes) Implement adversarial probe recommendations for improved AI agent usability. This addresses the three critical issues identified in the v0.5.0 probe report. ## Changes ### 1. Early Input Validation (Critical Issue #1) - Add validation helper methods: _validate_pair(), _validate_variant(), _validate_timeframe(), _validate_date_format() - Call validators BEFORE file operations in all public methods - Clear ValueError messages instead of confusing FileNotFoundError - Example: "Invalid pair 'INVALID'. Must be one of: EURUSD, GBPUSD, ..." instead of "FileNotFoundError: Database not found" ### 2. Pydantic Field Constraints (Critical Issue #2) - Add pattern validation to CoverageInfo.earliest_date and latest_date fields - Validates date format: r'^\d{4}-\d{2}-\d{2}' (YYYY-MM-DD) - Note: ge=0 constraints already existed on all numeric fields ✓ ### 3. Raises Documentation (Critical Issue #3) - Add comprehensive Raises sections to 4 public methods: - update_data(): ValueError, FileNotFoundError, ConnectionError, pd.errors.EmptyDataError - query_ticks(): ValueError, FileNotFoundError, duckdb.Error, pd.errors.EmptyDataError - query_ohlc(): ValueError, FileNotFoundError, duckdb.Error, pd.errors.EmptyDataError - get_data_coverage(): ValueError, duckdb.Error - AI agents can now understand error handling before calling methods ## Impact Before (confusing):
|
|
20
|
+
- **api**: Add AI-agent-friendly input validation (Phase 1 critical fixes) Implement adversarial probe recommendations for improved AI agent usability. This addresses the three critical issues identified in the v0.5.0 probe report. ## Changes ### 1. Early Input Validation (Critical Issue #1) - Add validation helper methods: \_validate_pair(), \_validate_variant(), \_validate_timeframe(), \_validate_date_format() - Call validators BEFORE file operations in all public methods - Clear ValueError messages instead of confusing FileNotFoundError - Example: "Invalid pair 'INVALID'. Must be one of: EURUSD, GBPUSD, ..." instead of "FileNotFoundError: Database not found" ### 2. Pydantic Field Constraints (Critical Issue #2) - Add pattern validation to CoverageInfo.earliest_date and latest_date fields - Validates date format: r'^\d{4}-\d{2}-\d{2}' (YYYY-MM-DD) - Note: ge=0 constraints already existed on all numeric fields ✓ ### 3. Raises Documentation (Critical Issue #3) - Add comprehensive Raises sections to 4 public methods: - update_data(): ValueError, FileNotFoundError, ConnectionError, pd.errors.EmptyDataError - query_ticks(): ValueError, FileNotFoundError, duckdb.Error, pd.errors.EmptyDataError - query_ohlc(): ValueError, FileNotFoundError, duckdb.Error, pd.errors.EmptyDataError - get_data_coverage(): ValueError, duckdb.Error - AI agents can now understand error handling before calling methods ## Impact Before (confusing): `python proc.query_ticks(pair='INVALID') # FileNotFoundError: Database not found: /path/to/invalid.duckdb ` After (clear): `python proc.query_ticks(pair='INVALID') # ValueError: Invalid pair 'INVALID'. Must be one of: EURUSD, GBPUSD, XAUUSD, ... ` ## Testing ✓ Import successful ✓ Validation works correctly ✓ All error messages clear and actionable ✓ No regressions (backward compatible) ## Performance - Validation overhead: <1ms per method call - Zero impact on existing functionality ## References - Adversarial Probe Report: exness-data-preprocess v0.5.0 - Priority: 🔴 CRITICAL (Issues #1, #2, #3) - Estimated time: 45 minutes (actual: 45 minutes) - ROI: ⭐⭐⭐⭐⭐ (10x better AI-agent discoverability) Closes: Critical Issues #1, #2, #3 from adversarial probe report
|
|
12
21
|
|
|
13
|
-
- **api**: Add computed fields, convenience methods, and context manager (Phase 2) Implements high-impact improvements for AI-agent usability following adversarial probe report recommendations. **Pydantic Computed Fields** (models.py): - UpdateResult: - avg_ticks_per_month: Average ticks per month downloaded - storage_efficiency_mb_per_million_ticks: Storage efficiency metric - CoverageInfo: - total_ticks: Sum of both data variants - coverage_percentage: Estimated trading day coverage - storage_efficiency_mb_per_million_ticks: Storage efficiency metric **Convenience Methods** (processor.py): - get_available_dates(): Returns (earliest, latest) tuple for quick boundary checks - validate_date_range(): Pre-flight validation returning (bool, error_msg) - estimate_download_size(): Estimates MB based on date range (~11 MB/month) **Context Manager Support** (processor.py): -
|
|
22
|
+
- **api**: Add computed fields, convenience methods, and context manager (Phase 2) Implements high-impact improvements for AI-agent usability following adversarial probe report recommendations. **Pydantic Computed Fields** (models.py): - UpdateResult: - avg_ticks_per_month: Average ticks per month downloaded - storage_efficiency_mb_per_million_ticks: Storage efficiency metric - CoverageInfo: - total_ticks: Sum of both data variants - coverage_percentage: Estimated trading day coverage - storage_efficiency_mb_per_million_ticks: Storage efficiency metric **Convenience Methods** (processor.py): - get_available_dates(): Returns (earliest, latest) tuple for quick boundary checks - validate_date_range(): Pre-flight validation returning (bool, error_msg) - estimate_download_size(): Estimates MB based on date range (~11 MB/month) **Context Manager Support** (processor.py): - **enter**(): Returns self for 'with' statement usage - **exit**(): Cleans up temporary ZIP files, doesn't suppress exceptions - Enables: with ExnessDataProcessor() as proc: ... **CLI Enhancement** (cli.py): - Added --version flag using importlib.metadata - Standard version display for automation scripts All methods include comprehensive docstrings with examples and type hints. Computed fields auto-appear in JSON Schema for AI agent discovery. Related: Phase 1 (f8c3ad2) - Input validation, field constraints, Raises docs Time: ~1 hour implementation
|
|
14
23
|
|
|
15
24
|
### ✨ Features
|
|
16
25
|
|
|
@@ -11,11 +11,13 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
11
11
|
## Documentation Hub
|
|
12
12
|
|
|
13
13
|
### User Documentation
|
|
14
|
+
|
|
14
15
|
- **[README.md](README.md)** - Installation, API reference, usage examples
|
|
15
16
|
- **[examples/basic_usage.py](examples/basic_usage.py)** - Download, query, coverage operations
|
|
16
17
|
- **[examples/batch_processing.py](examples/batch_processing.py)** - Multi-instrument parallel processing
|
|
17
18
|
|
|
18
19
|
### AI Assistant Documentation
|
|
20
|
+
|
|
19
21
|
- **[docs/README.md](docs/README.md)** - Architecture, planning, research findings
|
|
20
22
|
- **[docs/MODULE_ARCHITECTURE.md](docs/MODULE_ARCHITECTURE.md)** - Complete module documentation with SLOs (v1.7.0)
|
|
21
23
|
- **[docs/DATABASE_SCHEMA.md](docs/DATABASE_SCHEMA.md)** - Complete database schema with self-documentation
|
|
@@ -25,12 +27,14 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
25
27
|
- **[Makefile](Makefile)** - Module introspection commands (module-stats, module-complexity, module-deps)
|
|
26
28
|
|
|
27
29
|
### Optimization Plans (v1.7.0)
|
|
30
|
+
|
|
28
31
|
- **[docs/PHASE2_SESSION_VECTORIZATION_PLAN.yaml](docs/PHASE2_SESSION_VECTORIZATION_PLAN.yaml)** - SSoT plan v2.0.0 (2.2x speedup)
|
|
29
32
|
- **[docs/PHASE3_SQL_GAP_DETECTION_PLAN.yaml](docs/PHASE3_SQL_GAP_DETECTION_PLAN.yaml)** - SSoT plan v2.0.0 (complete coverage)
|
|
30
33
|
- **[docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md](docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md)** - Phase 1 validation
|
|
31
34
|
- **[docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md](docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md)** - Phase 2 validation
|
|
32
35
|
|
|
33
36
|
### Implementation
|
|
37
|
+
|
|
34
38
|
- **src/exness_data_preprocess/** - Source code (7 specialized modules + facade)
|
|
35
39
|
- **tests/** - Test suite (48 tests, 100% passing)
|
|
36
40
|
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Contribution guidelines
|
|
@@ -40,6 +44,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
40
44
|
## Architecture Summary
|
|
41
45
|
|
|
42
46
|
### Storage Pattern (v2.0.0)
|
|
47
|
+
|
|
43
48
|
- **Single DuckDB file per instrument** (e.g., eurusd.duckdb containing all historical data)
|
|
44
49
|
- **Dual-variant storage** (Raw_Spread + Standard in same database)
|
|
45
50
|
- **Incremental updates** with automatic gap detection
|
|
@@ -50,6 +55,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
50
55
|
**Complete Specification**: [`docs/UNIFIED_DUCKDB_PLAN_v2.md`](docs/UNIFIED_DUCKDB_PLAN_v2.md)
|
|
51
56
|
|
|
52
57
|
### Module Pattern (v1.7.0)
|
|
58
|
+
|
|
53
59
|
- **Facade orchestrator** (processor.py) coordinating 7 specialized modules
|
|
54
60
|
- **Separation of concerns** with single-responsibility modules
|
|
55
61
|
- **SLO-based design** (Availability, Correctness, Observability, Maintainability)
|
|
@@ -57,6 +63,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
57
63
|
- **Zero regressions** (48 tests pass)
|
|
58
64
|
|
|
59
65
|
**Modules**:
|
|
66
|
+
|
|
60
67
|
1. **processor.py** - Thin orchestrator facade
|
|
61
68
|
2. **downloader.py** - HTTP download operations
|
|
62
69
|
3. **tick_loader.py** - CSV parsing
|
|
@@ -69,6 +76,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
69
76
|
**Complete Details**: [`docs/MODULE_ARCHITECTURE.md`](docs/MODULE_ARCHITECTURE.md)
|
|
70
77
|
|
|
71
78
|
### Performance Optimizations (v1.7.0)
|
|
79
|
+
|
|
72
80
|
- **Incremental OHLC Generation** (Phase 1): 7.3x speedup
|
|
73
81
|
- Optional date-range filtering for regeneration
|
|
74
82
|
- Measured: 8.05s → 1.10s for incremental updates (7 months)
|
|
@@ -90,6 +98,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
90
98
|
**Pattern**: Spike test first (validate theory) → Implement → Iterative SSoT plan updates
|
|
91
99
|
|
|
92
100
|
### Schema (v1.6.0)
|
|
101
|
+
|
|
93
102
|
- **Phase7 30-column OHLC** with dual-variant spreads
|
|
94
103
|
- **BID-only OHLC** from Raw_Spread execution prices
|
|
95
104
|
- **Normalized metrics** (range_per_spread, range_per_tick, body_per_spread, body_per_tick)
|
|
@@ -100,6 +109,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
100
109
|
**Complete Schema**: [`docs/DATABASE_SCHEMA.md`](docs/DATABASE_SCHEMA.md)
|
|
101
110
|
|
|
102
111
|
### Data Sources
|
|
112
|
+
|
|
103
113
|
- **Source**: https://ticks.ex2archive.com/ (public Exness tick data)
|
|
104
114
|
- **Primary**: Raw_Spread variant (97.81% zero-spreads, execution prices)
|
|
105
115
|
- **Reference**: Standard variant (0% zero-spreads, market quotes)
|
|
@@ -108,6 +118,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
108
118
|
**Complete Guide**: [`docs/EXNESS_DATA_SOURCES.md`](docs/EXNESS_DATA_SOURCES.md)
|
|
109
119
|
|
|
110
120
|
### Research Patterns (v1.0.0)
|
|
121
|
+
|
|
111
122
|
- **Lifecycle**: Explore (pandas/Polars) → Validate → Graduate (DuckDB) → Query (SQL)
|
|
112
123
|
- **ASOF Performance**: pandas/Polars 0.04s, DuckDB 0.89s at 880K ticks (24x difference)
|
|
113
124
|
- **Tool Selection**: pandas/Polars for tick-level temporal matching, DuckDB for materialized results
|
|
@@ -121,6 +132,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
121
132
|
## Development Commands
|
|
122
133
|
|
|
123
134
|
### Setup
|
|
135
|
+
|
|
124
136
|
```bash
|
|
125
137
|
# Install with development dependencies
|
|
126
138
|
uv sync --dev
|
|
@@ -130,6 +142,7 @@ pip install -e ".[dev]"
|
|
|
130
142
|
```
|
|
131
143
|
|
|
132
144
|
### Testing
|
|
145
|
+
|
|
133
146
|
```bash
|
|
134
147
|
# Run all tests
|
|
135
148
|
uv run pytest
|
|
@@ -142,6 +155,7 @@ uv run pytest tests/test_basic.py -v
|
|
|
142
155
|
```
|
|
143
156
|
|
|
144
157
|
### Code Quality
|
|
158
|
+
|
|
145
159
|
```bash
|
|
146
160
|
# Format code
|
|
147
161
|
uv run ruff format .
|
|
@@ -154,6 +168,7 @@ uv run mypy src/
|
|
|
154
168
|
```
|
|
155
169
|
|
|
156
170
|
### Module Introspection
|
|
171
|
+
|
|
157
172
|
```bash
|
|
158
173
|
# Show current line counts (always accurate)
|
|
159
174
|
make module-stats
|
|
@@ -166,6 +181,7 @@ make module-deps
|
|
|
166
181
|
```
|
|
167
182
|
|
|
168
183
|
### Building and Publishing
|
|
184
|
+
|
|
169
185
|
```bash
|
|
170
186
|
# Build package
|
|
171
187
|
uv build
|
|
@@ -87,6 +87,7 @@ When reporting issues, please include:
|
|
|
87
87
|
### Submitting Pull Requests
|
|
88
88
|
|
|
89
89
|
1. **Fork the repository** and create a new branch:
|
|
90
|
+
|
|
90
91
|
```bash
|
|
91
92
|
git checkout -b feature/your-feature-name
|
|
92
93
|
```
|
|
@@ -98,6 +99,7 @@ When reporting issues, please include:
|
|
|
98
99
|
4. **Update documentation** if needed (README.md, docstrings)
|
|
99
100
|
|
|
100
101
|
5. **Run all quality checks**:
|
|
102
|
+
|
|
101
103
|
```bash
|
|
102
104
|
uv run ruff format .
|
|
103
105
|
uv run ruff check --fix .
|
|
@@ -106,6 +108,7 @@ When reporting issues, please include:
|
|
|
106
108
|
```
|
|
107
109
|
|
|
108
110
|
6. **Commit your changes** with clear messages:
|
|
111
|
+
|
|
109
112
|
```bash
|
|
110
113
|
git commit -m "feat: add support for custom compression levels"
|
|
111
114
|
```
|
|
@@ -128,6 +131,7 @@ We follow conventional commit format:
|
|
|
128
131
|
- `chore:` Build process or tooling changes
|
|
129
132
|
|
|
130
133
|
Examples:
|
|
134
|
+
|
|
131
135
|
```
|
|
132
136
|
feat: add support for multiple currency pairs
|
|
133
137
|
fix: handle timezone conversion edge case
|
|
@@ -167,6 +171,7 @@ When adding new features:
|
|
|
167
171
|
5. **Add docstrings** following Google style
|
|
168
172
|
|
|
169
173
|
Example docstring:
|
|
174
|
+
|
|
170
175
|
```python
|
|
171
176
|
def my_function(param1: int, param2: str) -> bool:
|
|
172
177
|
"""
|
|
@@ -215,6 +220,7 @@ def test_feature_name(fixture1, fixture2):
|
|
|
215
220
|
### Integration Tests
|
|
216
221
|
|
|
217
222
|
Mark integration tests (requiring network access) with:
|
|
223
|
+
|
|
218
224
|
```python
|
|
219
225
|
@pytest.mark.integration
|
|
220
226
|
def test_download_real_data():
|
|
@@ -263,6 +269,7 @@ def process_data(data: pd.DataFrame, compression: str = "zstd") -> Path:
|
|
|
263
269
|
### README Updates
|
|
264
270
|
|
|
265
271
|
When adding features:
|
|
272
|
+
|
|
266
273
|
- Add usage examples
|
|
267
274
|
- Update feature list
|
|
268
275
|
- Document any breaking changes
|
|
@@ -21,17 +21,20 @@ New to this project? Start here:
|
|
|
21
21
|
Follow this path if you're new to the project:
|
|
22
22
|
|
|
23
23
|
### 1. Getting Started
|
|
24
|
+
|
|
24
25
|
- **[README.md](README.md)** - Main documentation with installation and API reference
|
|
25
26
|
- **[Basic Usage Examples](examples/basic_usage.py)** - 6 practical code examples you can run immediately
|
|
26
27
|
- **[Contributing Guide](CONTRIBUTING.md)** - Development setup, code quality, testing
|
|
27
28
|
|
|
28
29
|
### 2. Understanding the Data
|
|
30
|
+
|
|
29
31
|
- **[Exness Data Sources](docs/EXNESS_DATA_SOURCES.md)** - Raw_Spread vs Standard variants, data quality characteristics
|
|
30
32
|
- Learn about 97.81% zero-spreads in Raw_Spread (execution prices)
|
|
31
33
|
- Understand tick density and storage estimates
|
|
32
34
|
- See CSV format and download patterns
|
|
33
35
|
|
|
34
36
|
### 3. First Queries
|
|
37
|
+
|
|
35
38
|
- **[Database Schema](docs/DATABASE_SCHEMA.md)** - Phase7 30-column OHLC structure
|
|
36
39
|
- 4 tables: raw_spread_ticks, standard_ticks, ohlc_1m, metadata
|
|
37
40
|
- SQL query examples and performance benchmarks
|
|
@@ -46,18 +49,21 @@ Follow this path if you're new to the project:
|
|
|
46
49
|
Ready for multi-instrument processing and advanced queries:
|
|
47
50
|
|
|
48
51
|
### 4. Advanced Workflows
|
|
52
|
+
|
|
49
53
|
- **[Batch Processing Examples](examples/batch_processing.py)** - Multi-instrument parallel processing
|
|
50
54
|
- Sequential and parallel processing patterns
|
|
51
55
|
- Error handling and retry logic
|
|
52
56
|
- Progress monitoring with tqdm
|
|
53
57
|
|
|
54
58
|
### 5. Research Methodology
|
|
59
|
+
|
|
55
60
|
- **[Research Patterns](docs/RESEARCH_PATTERNS.md)** - pandas/Polars vs DuckDB tool selection
|
|
56
61
|
- Research lifecycle: Explore → Validate → Graduate → Query
|
|
57
62
|
- Hybrid materialization pattern
|
|
58
63
|
- Performance benchmarks (ASOF joins: pandas 0.04s vs DuckDB 0.89s)
|
|
59
64
|
|
|
60
65
|
### 6. Schema Deep Dive
|
|
66
|
+
|
|
61
67
|
- **[Schema v1.6.0 Migration Guide](docs/plans/SCHEMA_v1.6.0_MIGRATION_GUIDE.md)** - Breaking changes from v1.5.0
|
|
62
68
|
- 19 → 30 columns (added 10 exchange sessions + 1 major holiday flag)
|
|
63
69
|
- Midnight detection bug fix (critical for session flags)
|
|
@@ -72,7 +78,8 @@ Ready for multi-instrument processing and advanced queries:
|
|
|
72
78
|
For contributors and researchers who need deep understanding:
|
|
73
79
|
|
|
74
80
|
### 7. System Architecture
|
|
75
|
-
|
|
81
|
+
|
|
82
|
+
- **[Module Architecture](docs/MODULE_ARCHITECTURE.md)** ⭐ _v1.3.1 - Verified Accurate_
|
|
76
83
|
- Facade pattern with 6 module instances + 1 static utility
|
|
77
84
|
- SLO-based design (Availability, Correctness, Observability, Maintainability)
|
|
78
85
|
- Complete data flow with 3 Mermaid diagrams
|
|
@@ -84,6 +91,7 @@ For contributors and researchers who need deep understanding:
|
|
|
84
91
|
- PRIMARY KEY prevents duplicates
|
|
85
92
|
|
|
86
93
|
### 8. Trading Hours Implementation
|
|
94
|
+
|
|
87
95
|
- **[Trading Hours Research](docs/TRADING_HOURS_RESEARCH.md)** - Industry analysis (49KB comprehensive)
|
|
88
96
|
- 5 quant finance libraries studied
|
|
89
97
|
- 3 professional platforms analyzed
|
|
@@ -96,7 +104,8 @@ For contributors and researchers who need deep understanding:
|
|
|
96
104
|
- Bulk UPDATE strategies
|
|
97
105
|
|
|
98
106
|
### 9. Validation & Quality Assurance
|
|
99
|
-
|
|
107
|
+
|
|
108
|
+
- **[E2E Validation Results v1.6.0](docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md)** ⭐ _100% Accuracy_
|
|
100
109
|
- 355,970 bars of real EURUSD data (12 months, 1.92 GB)
|
|
101
110
|
- Tokyo lunch breaks: 0/59 lunch, 150/150 morning, 151/151 afternoon
|
|
102
111
|
- Holidays, DST, weekend gaps, exchange overlaps all verified
|
|
@@ -111,7 +120,8 @@ For contributors and researchers who need deep understanding:
|
|
|
111
120
|
- HTTP library, type signatures, data flow corrected
|
|
112
121
|
|
|
113
122
|
### 10. Performance Optimizations (v0.5.0)
|
|
114
|
-
|
|
123
|
+
|
|
124
|
+
- **[Phase 1 Spike Test Results](docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md)** ⭐ _7.3x Speedup_
|
|
115
125
|
- Incremental OHLC generation: 8.05s → 1.10s for updates
|
|
116
126
|
- 303K bars regeneration vs 43K incremental update
|
|
117
127
|
- Measured: 86.3% time reduction
|
|
@@ -121,7 +131,7 @@ For contributors and researchers who need deep understanding:
|
|
|
121
131
|
- Version tracking: v1.0.0 (initial) → v2.0.0 (completed)
|
|
122
132
|
- Implementation discoveries and nuances documented
|
|
123
133
|
|
|
124
|
-
- **[Phase 2 Spike Test Results](docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md)** ⭐
|
|
134
|
+
- **[Phase 2 Spike Test Results](docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md)** ⭐ _2.2x Speedup_
|
|
125
135
|
- Vectorized session detection: 5.99s → 2.69s for 302K bars
|
|
126
136
|
- 10 global exchange sessions processed in parallel
|
|
127
137
|
- Combined Phase 1+2: ~16x total speedup (8.05s → 0.50s)
|
|
@@ -142,6 +152,7 @@ For contributors and researchers who need deep understanding:
|
|
|
142
152
|
Published research with reproduction guides:
|
|
143
153
|
|
|
144
154
|
### Zero-Spread Deviation Analysis
|
|
155
|
+
|
|
145
156
|
- **[Project Overview](docs/research/eurusd-zero-spread-deviations/README.md)** - 16-month validation study
|
|
146
157
|
- **[Methodology](docs/research/eurusd-zero-spread-deviations/01-methodology.md)** - Research approach
|
|
147
158
|
- **[Baseline Analysis](docs/research/eurusd-zero-spread-deviations/02-baseline-sep2024.md)** - September 2024 baseline
|
|
@@ -150,6 +161,7 @@ Published research with reproduction guides:
|
|
|
150
161
|
- **[Reproduction Guide](docs/research/eurusd-zero-spread-deviations/scripts/reproduction_guide.md)** - How to reproduce results
|
|
151
162
|
|
|
152
163
|
### Spread Variant Analysis
|
|
164
|
+
|
|
153
165
|
- **[Project Overview](docs/research/eurusd-spread-analysis/README.md)** - Modal-band-excluded variance estimation
|
|
154
166
|
- **[Methodology](docs/research/eurusd-spread-analysis/01-methodology.md)** - Research design
|
|
155
167
|
- **[Mode-Truncated Analysis](docs/research/eurusd-spread-analysis/02-mode-truncated-analysis.md)** - Truncation approach
|
|
@@ -159,6 +171,7 @@ Published research with reproduction guides:
|
|
|
159
171
|
- **[Reproduction Guide](docs/research/eurusd-spread-analysis/scripts/reproduction_guide.md)** - How to reproduce
|
|
160
172
|
|
|
161
173
|
### Compression Benchmarks
|
|
174
|
+
|
|
162
175
|
- **[Compression Study](docs/research/compression-benchmarks/README.md)** - Why Parquet + Zstd-22
|
|
163
176
|
|
|
164
177
|
---
|
|
@@ -168,16 +181,19 @@ Published research with reproduction guides:
|
|
|
168
181
|
Quick lookups and specific information:
|
|
169
182
|
|
|
170
183
|
### API & Schema
|
|
184
|
+
|
|
171
185
|
- **[README.md](README.md)** - Complete API reference with examples
|
|
172
186
|
- **[Database Schema](docs/DATABASE_SCHEMA.md)** - 30-column Phase7 OHLC specification
|
|
173
187
|
- **[CLAUDE.md](CLAUDE.md)** - AI assistant quick reference (architecture summary)
|
|
174
188
|
|
|
175
189
|
### Version History
|
|
190
|
+
|
|
176
191
|
- **[CHANGELOG.md](CHANGELOG.md)** - Version history (Keep a Changelog format)
|
|
177
192
|
- **[RELEASE_NOTES.md](RELEASE_NOTES.md)** - Human-readable release notes
|
|
178
193
|
- **[AUTHORS.md](AUTHORS.md)** - Project contributors
|
|
179
194
|
|
|
180
195
|
### Testing
|
|
196
|
+
|
|
181
197
|
- **[Test Suite Documentation](tests/README.md)** - 48 tests, coverage reports
|
|
182
198
|
- **[Makefile](Makefile)** - Build commands (`make test`, `make module-stats`, etc.)
|
|
183
199
|
|
|
@@ -188,16 +204,19 @@ Quick lookups and specific information:
|
|
|
188
204
|
Internal documentation for contributors:
|
|
189
205
|
|
|
190
206
|
### Current Plans
|
|
207
|
+
|
|
191
208
|
- **[Documentation Hub](docs/README.md)** - Hub-and-spoke architecture with progressive disclosure
|
|
192
209
|
- **[Implementation Plan](docs/implementation-plan.yaml)** - Machine-readable implementation plan with SLOs
|
|
193
210
|
- **[Planning Index](docs/planning-index.yaml)** - Index of all planning documents
|
|
194
211
|
|
|
195
212
|
### Migration & Refactoring
|
|
213
|
+
|
|
196
214
|
- **[Schema v1.6.0 Migration Guide](docs/plans/SCHEMA_v1.6.0_MIGRATION_GUIDE.md)** - v1.5.0 → v1.6.0 breaking changes
|
|
197
215
|
- **[Phase7 v1.6.0 Progress](docs/plans/PHASE7_v1.6.0_REFACTORING_PROGRESS.md)** - Refactoring progress tracking
|
|
198
216
|
- **[Refactoring Checklist](docs/plans/REFACTORING_CHECKLIST.md)** - Comprehensive checklist
|
|
199
217
|
|
|
200
218
|
### Quality Audits
|
|
219
|
+
|
|
201
220
|
- **[Workspace Survey](docs/validation/WORKSPACE_SURVEY_2025-10-17.md)** - Organization assessment (2025-10-17)
|
|
202
221
|
- **[Architecture Audit](docs/validation/ARCHITECTURE_AUDIT_2025-10-17.md)** - Documentation accuracy (2025-10-17)
|
|
203
222
|
- **[Functionality Validation](docs/plans/FUNCTIONALITY_VALIDATION_REPORT_2025-10-16.md)** - Feature testing (2025-10-16)
|
|
@@ -228,6 +247,7 @@ DOCUMENTATION.md (You are here - Hub)
|
|
|
228
247
|
```
|
|
229
248
|
|
|
230
249
|
**Navigation Tips**:
|
|
250
|
+
|
|
231
251
|
- 🎯 = Start here if you're new
|
|
232
252
|
- ⭐ = Critical documentation (verified accurate)
|
|
233
253
|
- All links use relative URLs from project root
|
|
@@ -238,21 +258,27 @@ DOCUMENTATION.md (You are here - Hub)
|
|
|
238
258
|
## 🤔 Which Documentation Should I Read?
|
|
239
259
|
|
|
240
260
|
### "I just want to download forex data and analyze it"
|
|
261
|
+
|
|
241
262
|
→ [README.md](README.md) → [Basic Usage Examples](examples/basic_usage.py)
|
|
242
263
|
|
|
243
264
|
### "I need to process multiple currency pairs efficiently"
|
|
265
|
+
|
|
244
266
|
→ [Batch Processing Examples](examples/batch_processing.py)
|
|
245
267
|
|
|
246
268
|
### "I want to write SQL queries against tick data"
|
|
269
|
+
|
|
247
270
|
→ [Database Schema](docs/DATABASE_SCHEMA.md)
|
|
248
271
|
|
|
249
272
|
### "I'm doing quantitative research with temporal analysis"
|
|
273
|
+
|
|
250
274
|
→ [Research Patterns](docs/RESEARCH_PATTERNS.md) → [Database Schema](docs/DATABASE_SCHEMA.md)
|
|
251
275
|
|
|
252
276
|
### "I want to contribute code to this project"
|
|
277
|
+
|
|
253
278
|
→ [Module Architecture](docs/MODULE_ARCHITECTURE.md) → [Contributing Guide](CONTRIBUTING.md)
|
|
254
279
|
|
|
255
280
|
### "I need to understand trading hour detection"
|
|
281
|
+
|
|
256
282
|
→ [Trading Hours Research](docs/TRADING_HOURS_RESEARCH.md) → [E2E Validation](docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md)
|
|
257
283
|
|
|
258
284
|
---
|
|
@@ -7,21 +7,25 @@
|
|
|
7
7
|
## ✅ Completed Automatically
|
|
8
8
|
|
|
9
9
|
### 1. Code Changes
|
|
10
|
+
|
|
10
11
|
- ✅ Updated `pyproject.toml` URLs → `terrylica/exness-data-preprocess`
|
|
11
12
|
- ✅ Updated `CHANGELOG.md` comparison links
|
|
12
13
|
- ✅ Added 6 shields.io badges to `README.md`
|
|
13
14
|
|
|
14
15
|
### 2. GitHub Actions Workflows Created
|
|
16
|
+
|
|
15
17
|
- ✅ `.github/workflows/ci.yml` - Pre-commit CI + Python 3.9-3.13 testing
|
|
16
18
|
- ✅ `.github/workflows/publish.yml` - PyPI Trusted Publishing
|
|
17
19
|
- ✅ `.github/workflows/pre-commit-autoupdate.yml` - Weekly hook updates
|
|
18
20
|
|
|
19
21
|
### 3. Git Repository
|
|
22
|
+
|
|
20
23
|
- ✅ Initialized git repository
|
|
21
24
|
- ✅ Committed all files (75 files, 19,478 lines)
|
|
22
25
|
- ✅ Initial commit: `a982494`
|
|
23
26
|
|
|
24
27
|
### 4. GitHub Repository Created
|
|
28
|
+
|
|
25
29
|
- ✅ Repository: https://github.com/terrylica/exness-data-preprocess
|
|
26
30
|
- ✅ Public repository with description
|
|
27
31
|
- ✅ Code pushed to `main` branch
|
|
@@ -30,6 +34,7 @@
|
|
|
30
34
|
- ✅ Wiki disabled
|
|
31
35
|
|
|
32
36
|
### 5. Repository Configuration
|
|
37
|
+
|
|
33
38
|
```json
|
|
34
39
|
{
|
|
35
40
|
"name": "exness-data-preprocess",
|
|
@@ -37,7 +42,24 @@
|
|
|
37
42
|
"url": "https://github.com/terrylica/exness-data-preprocess",
|
|
38
43
|
"isPrivate": false,
|
|
39
44
|
"hasIssuesEnabled": true,
|
|
40
|
-
"topics": [
|
|
45
|
+
"topics": [
|
|
46
|
+
"backtesting",
|
|
47
|
+
"data-engineering",
|
|
48
|
+
"duckdb",
|
|
49
|
+
"eurusd",
|
|
50
|
+
"financial-data",
|
|
51
|
+
"forex",
|
|
52
|
+
"microstructure",
|
|
53
|
+
"ohlc",
|
|
54
|
+
"pandas",
|
|
55
|
+
"parquet",
|
|
56
|
+
"pyarrow",
|
|
57
|
+
"python",
|
|
58
|
+
"quantitative-finance",
|
|
59
|
+
"tick-data",
|
|
60
|
+
"time-series",
|
|
61
|
+
"zstd"
|
|
62
|
+
]
|
|
41
63
|
}
|
|
42
64
|
```
|
|
43
65
|
|
|
@@ -72,10 +94,12 @@ You should see a confirmation: "Pending publisher registered!"
|
|
|
72
94
|
### Step 5: Verify
|
|
73
95
|
|
|
74
96
|
You should see the pending publisher listed on the page:
|
|
97
|
+
|
|
75
98
|
- Project: `exness-data-preprocess`
|
|
76
99
|
- Status: Pending (will change to Active after first successful publish)
|
|
77
100
|
|
|
78
101
|
**What This Does:**
|
|
102
|
+
|
|
79
103
|
- Enables password-less publishing to PyPI via GitHub Actions
|
|
80
104
|
- Uses GitHub's OIDC tokens for authentication (no API tokens needed!)
|
|
81
105
|
- Automatically verifies your GitHub URLs with green checkmarks on PyPI
|
|
@@ -100,11 +124,13 @@ Open: https://github.com/terrylica/exness-data-preprocess/settings/environments
|
|
|
100
124
|
### Step 3: Add Protection Rules (Optional)
|
|
101
125
|
|
|
102
126
|
**Required Reviewers** (recommended):
|
|
127
|
+
|
|
103
128
|
- Check "Required reviewers"
|
|
104
129
|
- Add yourself (`terrylica`)
|
|
105
130
|
- This will require you to manually approve each release
|
|
106
131
|
|
|
107
132
|
**Wait Timer** (optional):
|
|
133
|
+
|
|
108
134
|
- Set to 0 minutes (or add delay if wanted)
|
|
109
135
|
|
|
110
136
|
### Step 4: Save
|
|
@@ -112,6 +138,7 @@ Open: https://github.com/terrylica/exness-data-preprocess/settings/environments
|
|
|
112
138
|
Click **"Save protection rules"**
|
|
113
139
|
|
|
114
140
|
**What This Does:**
|
|
141
|
+
|
|
115
142
|
- Requires manual approval before publishing to PyPI
|
|
116
143
|
- Prevents accidental releases
|
|
117
144
|
- Adds extra safety layer
|
|
@@ -134,6 +161,7 @@ Open: https://github.com/terrylica/exness-data-preprocess/settings/branches
|
|
|
134
161
|
### Step 3: Enable Protection
|
|
135
162
|
|
|
136
163
|
**Recommended settings:**
|
|
164
|
+
|
|
137
165
|
- ✅ Require a pull request before merging
|
|
138
166
|
- ✅ Require status checks to pass before merging
|
|
139
167
|
- Search and add: `Pre-commit hooks`
|
|
@@ -227,6 +255,7 @@ gh release create v0.1.0 \
|
|
|
227
255
|
## 📊 Monitoring & Verification
|
|
228
256
|
|
|
229
257
|
### Check CI Status
|
|
258
|
+
|
|
230
259
|
```bash
|
|
231
260
|
gh run list --limit 5
|
|
232
261
|
```
|
|
@@ -234,6 +263,7 @@ gh run list --limit 5
|
|
|
234
263
|
Or visit: https://github.com/terrylica/exness-data-preprocess/actions
|
|
235
264
|
|
|
236
265
|
### Check Latest Release
|
|
266
|
+
|
|
237
267
|
```bash
|
|
238
268
|
gh release list
|
|
239
269
|
```
|
|
@@ -241,6 +271,7 @@ gh release list
|
|
|
241
271
|
Or visit: https://github.com/terrylica/exness-data-preprocess/releases
|
|
242
272
|
|
|
243
273
|
### Test Package Installation (After First Release)
|
|
274
|
+
|
|
244
275
|
```bash
|
|
245
276
|
# Create clean environment
|
|
246
277
|
python -m venv /tmp/test-env
|
|
@@ -258,27 +289,32 @@ python -c "import exness_data_preprocess as edp; print(edp.__version__)"
|
|
|
258
289
|
## 🔧 Common Commands
|
|
259
290
|
|
|
260
291
|
### Run Pre-commit Locally
|
|
292
|
+
|
|
261
293
|
```bash
|
|
262
294
|
pre-commit run --all-files
|
|
263
295
|
```
|
|
264
296
|
|
|
265
297
|
### Run Tests Locally
|
|
298
|
+
|
|
266
299
|
```bash
|
|
267
300
|
uv run pytest --cov
|
|
268
301
|
```
|
|
269
302
|
|
|
270
303
|
### Build Package Locally
|
|
304
|
+
|
|
271
305
|
```bash
|
|
272
306
|
uv build
|
|
273
307
|
```
|
|
274
308
|
|
|
275
309
|
### Check Package Metadata
|
|
310
|
+
|
|
276
311
|
```bash
|
|
277
312
|
uv run python -m build --outdir dist/
|
|
278
313
|
twine check dist/*
|
|
279
314
|
```
|
|
280
315
|
|
|
281
316
|
### Manual PyPI Upload (Not Recommended - Use Trusted Publishing Instead!)
|
|
317
|
+
|
|
282
318
|
```bash
|
|
283
319
|
# Only if Trusted Publishing fails
|
|
284
320
|
doppler run --project claude-config --config dev -- \
|
|
@@ -313,6 +349,7 @@ After your first successful release:
|
|
|
313
349
|
✅ **Environment Protection Ready** - Manual approval gate available
|
|
314
350
|
|
|
315
351
|
**Total Complexity:**
|
|
352
|
+
|
|
316
353
|
- Workflows: 3 files, ~120 lines YAML
|
|
317
354
|
- Secrets: 0 (Trusted Publishing!)
|
|
318
355
|
- Manual Token Management: None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: exness-data-preprocess
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Professional Exness forex tick data preprocessing with optimal compression (Parquet Zstd-22) and DuckDB OHLC generation. Provides efficient storage (9% smaller than ZIP) with lossless precision and direct queryability.
|
|
5
5
|
Project-URL: Homepage, https://github.com/terrylica/exness-data-preprocess
|
|
6
6
|
Project-URL: Documentation, https://github.com/terrylica/exness-data-preprocess#readme
|
|
@@ -35,6 +35,7 @@ Requires-Dist: httpx>=0.25.0
|
|
|
35
35
|
Requires-Dist: pandas>=2.0.0
|
|
36
36
|
Requires-Dist: pyarrow>=16.0.0
|
|
37
37
|
Requires-Dist: pydantic>=2.0.0
|
|
38
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
38
39
|
Requires-Dist: tqdm>=4.65.0
|
|
39
40
|
Provides-Extra: dev
|
|
40
41
|
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
@@ -443,12 +444,14 @@ Data is sourced from Exness's public tick data repository:
|
|
|
443
444
|
### Performance Optimizations (v0.5.0)
|
|
444
445
|
|
|
445
446
|
**Incremental OHLC Generation** - 7.3x speedup for updates:
|
|
447
|
+
|
|
446
448
|
- Full regeneration: 8.05s (303K bars, 7 months)
|
|
447
449
|
- Incremental update: 1.10s (43K new bars, 1 month)
|
|
448
450
|
- Implementation: Optional date-range parameters for partial regeneration
|
|
449
451
|
- Validation: [`docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md`](docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md)
|
|
450
452
|
|
|
451
453
|
**Vectorized Session Detection** - 2.2x speedup for trading hour detection:
|
|
454
|
+
|
|
452
455
|
- Current approach: 5.99s (302K bars, 10 exchanges)
|
|
453
456
|
- Vectorized approach: 2.69s (302K bars, 10 exchanges)
|
|
454
457
|
- Combined Phase 1+2: ~16x total speedup (8.05s → 0.50s)
|
|
@@ -457,6 +460,7 @@ Data is sourced from Exness's public tick data repository:
|
|
|
457
460
|
- Validation: [`docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md`](docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md)
|
|
458
461
|
|
|
459
462
|
**SQL Gap Detection** - Complete coverage with 46% code reduction:
|
|
463
|
+
|
|
460
464
|
- Bug fix: Python approach missed internal gaps (41 detected vs 42 actual)
|
|
461
465
|
- SQL EXCEPT operator detects ALL gaps (before + within + after existing data)
|
|
462
466
|
- Code reduced from 62 lines to 34 lines (46% reduction)
|
|
@@ -394,12 +394,14 @@ Data is sourced from Exness's public tick data repository:
|
|
|
394
394
|
### Performance Optimizations (v0.5.0)
|
|
395
395
|
|
|
396
396
|
**Incremental OHLC Generation** - 7.3x speedup for updates:
|
|
397
|
+
|
|
397
398
|
- Full regeneration: 8.05s (303K bars, 7 months)
|
|
398
399
|
- Incremental update: 1.10s (43K new bars, 1 month)
|
|
399
400
|
- Implementation: Optional date-range parameters for partial regeneration
|
|
400
401
|
- Validation: [`docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md`](docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md)
|
|
401
402
|
|
|
402
403
|
**Vectorized Session Detection** - 2.2x speedup for trading hour detection:
|
|
404
|
+
|
|
403
405
|
- Current approach: 5.99s (302K bars, 10 exchanges)
|
|
404
406
|
- Vectorized approach: 2.69s (302K bars, 10 exchanges)
|
|
405
407
|
- Combined Phase 1+2: ~16x total speedup (8.05s → 0.50s)
|
|
@@ -408,6 +410,7 @@ Data is sourced from Exness's public tick data repository:
|
|
|
408
410
|
- Validation: [`docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md`](docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md)
|
|
409
411
|
|
|
410
412
|
**SQL Gap Detection** - Complete coverage with 46% code reduction:
|
|
413
|
+
|
|
411
414
|
- Bug fix: Python approach missed internal gaps (41 detected vs 42 actual)
|
|
412
415
|
- SQL EXCEPT operator detects ALL gaps (before + within + after existing data)
|
|
413
416
|
- Code reduced from 62 lines to 34 lines (46% reduction)
|