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.
Files changed (138) hide show
  1. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.cz.toml +1 -1
  2. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/AUTHORS.md +1 -0
  3. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/CHANGELOG.md +11 -2
  4. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/CLAUDE.md +16 -0
  5. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/CONTRIBUTING.md +7 -0
  6. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/DOCUMENTATION.md +30 -4
  7. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/GITHUB_PYPI_SETUP.md +38 -1
  8. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/PKG-INFO +5 -1
  9. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/README.md +3 -0
  10. exness_data_preprocess-0.7.0/RELEASE_NOTES.md +21 -0
  11. exness_data_preprocess-0.7.0/RELEASE_NOTES_SHORT.md +40 -0
  12. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/DATABASE_SCHEMA.md +59 -43
  13. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/EXNESS_DATA_SOURCES.md +30 -6
  14. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/MODULE_ARCHITECTURE.md +75 -3
  15. exness_data_preprocess-0.7.0/docs/PHASE4_DRY_RUN_CONFIG_PLAN.yaml +362 -0
  16. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/README.md +26 -18
  17. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/RESEARCH_PATTERNS.md +18 -5
  18. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/TRADING_HOURS_RESEARCH.md +86 -22
  19. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/UNIFIED_DUCKDB_PLAN_v2.md +1 -0
  20. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/archive/PYDANTIC_REFACTORING_PLAN_v0.2.0_COMPLETE.md +46 -6
  21. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/archive/PYDANTIC_REFACTORING_STATUS_v0.2.0_COMPLETE.md +23 -4
  22. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/optimization/OPTIMIZATION_OPPORTUNITIES_2025-10-18.md +98 -65
  23. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/CLAUDE_MD_AUDIT_2025-10-16_PASS2.md +48 -26
  24. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/CLAUDE_MD_VERIFICATION_CHECKLIST_2025-10-16.md +57 -1
  25. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/CLAUDE_MD_VERIFICATION_FINDINGS_2025-10-16.md +45 -17
  26. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/DOCUMENTATION_AUDIT_2025-10-15.md +40 -8
  27. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/DOCUMENTATION_AUDIT_PASS2_2025-10-15.md +16 -0
  28. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/DOCUMENTATION_BEST_PRACTICES_LINE_COUNTS.md +19 -4
  29. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/EXCHANGE_SESSION_AUDIT_2025-10-17.md +56 -16
  30. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/FUNCTIONALITY_VALIDATION_REPORT_2025-10-15.md +42 -9
  31. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/FUNCTIONALITY_VALIDATION_REPORT_2025-10-16.md +44 -20
  32. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/PHASE7_v1.5.0_REFACTORING_PLAN.md +61 -20
  33. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/PHASE7_v1.6.0_REFACTORING_PROGRESS.md +24 -0
  34. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/REFACTORING_CHECKLIST.md +17 -0
  35. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/RESEARCH_PATTERNS_CANONICALIZATION_2025-10-17.md +29 -5
  36. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/SCHEMA_v1.6.0_AUDIT_FINDINGS.md +35 -0
  37. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/SCHEMA_v1.6.0_MIGRATION_GUIDE.md +30 -1
  38. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/plans/SESSION_2025-10-15_SUMMARY.md +27 -0
  39. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/GAP_DETECTION_COMPARISON.md +36 -18
  40. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/GAP_DETECTION_SQL_APPROACH.md +30 -6
  41. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/HYBRID_SESSION_DETECTION_ANALYSIS.md +79 -5
  42. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/compression-benchmarks/README.md +17 -0
  43. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/01-methodology.md +30 -7
  44. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/02-mode-truncated-analysis.md +67 -42
  45. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/03-hurdle-model-analysis.md +73 -50
  46. exness_data_preprocess-0.7.0/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +166 -0
  47. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/05-final-recommendations.md +50 -22
  48. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/README.md +13 -6
  49. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/scripts/reproduction_guide.md +30 -11
  50. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/01-methodology.md +28 -0
  51. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/02-baseline-sep2024.md +23 -11
  52. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/03-multiperiod-validation.md +51 -27
  53. {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
  54. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/README.md +14 -6
  55. {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
  56. {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
  57. {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
  58. {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
  59. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-zero-spread-deviations/scripts/reproduction_guide.md +28 -2
  60. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/ARCHITECTURE_AUDIT_2025-10-17.md +54 -32
  61. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/ARCHITECTURE_EFFICIENCY_AUDIT_2025-10-18.md +50 -26
  62. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/DOCUMENTATION_SURVEY_v1.7.0.md +37 -3
  63. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md +30 -0
  64. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md +35 -6
  65. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md +46 -16
  66. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/WEEKEND_GAP_VALIDATION_SUMMARY.md +13 -0
  67. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/validation/WORKSPACE_SURVEY_2025-10-17.md +21 -0
  68. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/pyproject.toml +2 -1
  69. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/__init__.py +3 -1
  70. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/api.py +20 -7
  71. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/cli.py +45 -1
  72. exness_data_preprocess-0.7.0/src/exness_data_preprocess/config.py +126 -0
  73. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/models.py +90 -0
  74. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/processor.py +68 -11
  75. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/README.md +5 -0
  76. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/archive/E2E_TESTING_PLAN_v1.0.0.md +23 -0
  77. exness_data_preprocess-0.6.0/RELEASE_NOTES.md +0 -26
  78. exness_data_preprocess-0.6.0/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +0 -166
  79. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.github/workflows/ci.yml +0 -0
  80. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
  81. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.github/workflows/publish.yml +0 -0
  82. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.gitignore +0 -0
  83. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/.pre-commit-config.yaml +0 -0
  84. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/LICENSE +0 -0
  85. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/Makefile +0 -0
  86. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/cliff-release-notes.toml +0 -0
  87. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/cliff.toml +0 -0
  88. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/PHASE2_SESSION_VECTORIZATION_PLAN.yaml +0 -0
  89. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/PHASE3_SQL_GAP_DETECTION_PLAN.yaml +0 -0
  90. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/archive/UNIFIED_DUCKDB_PLAN_v1.0.0_LEGACY.md +0 -0
  91. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/implementation-plan.yaml +0 -0
  92. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/planning-index.yaml +0 -0
  93. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/compression-benchmarks/test_all_compression_methods.py +0 -0
  94. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/compression-benchmarks/test_delta_encoding_properly.py +0 -0
  95. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/compression-benchmarks/test_parquet_compression_methods.py +0 -0
  96. {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
  97. {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
  98. {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
  99. {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
  100. {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
  101. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/concentration_curve.png +0 -0
  102. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/percentile_analysis.png +0 -0
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/docs/research/gap_detection_implementation_example.py +0 -0
  121. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/examples/basic_usage.py +0 -0
  122. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/examples/batch_processing.py +0 -0
  123. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/database_manager.py +0 -0
  124. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/downloader.py +0 -0
  125. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/exchanges.py +0 -0
  126. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/gap_detector.py +0 -0
  127. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/ohlc_generator.py +0 -0
  128. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/query_engine.py +0 -0
  129. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/schema.py +0 -0
  130. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/session_detector.py +0 -0
  131. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/src/exness_data_preprocess/tick_loader.py +0 -0
  132. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/__init__.py +0 -0
  133. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/conftest.py +0 -0
  134. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_basic.py +0 -0
  135. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_functional_regression.py +0 -0
  136. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_models.py +0 -0
  137. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_processor_pydantic.py +0 -0
  138. {exness_data_preprocess-0.6.0 → exness_data_preprocess-0.7.0}/tests/test_types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  [tool.commitizen]
2
2
  name = "cz_conventional_commits"
3
- version = "0.6.0"
3
+ version = "0.7.0"
4
4
  tag_format = "v$major.$minor.$patch"
5
5
  update_changelog_on_bump = true
6
6
  version_files = [
@@ -9,6 +9,7 @@
9
9
  ## Organization
10
10
 
11
11
  **Eon Labs**
12
+
12
13
  - Website: https://eonlabs.com
13
14
  - GitHub: https://github.com/Eon-Labs
14
15
 
@@ -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): ```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
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): - __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
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
- - **[Module Architecture](docs/MODULE_ARCHITECTURE.md)** ⭐ *v1.3.1 - Verified Accurate*
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
- - **[E2E Validation Results v1.6.0](docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md)** ⭐ *100% Accuracy*
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
- - **[Phase 1 Spike Test Results](docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md)** ⭐ *7.3x Speedup*
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)** ⭐ *2.2x Speedup*
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": ["backtesting", "data-engineering", "duckdb", "eurusd", "financial-data", "forex", "microstructure", "ohlc", "pandas", "parquet", "pyarrow", "python", "quantitative-finance", "tick-data", "time-series", "zstd"]
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.6.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)