exness-data-preprocess 1.2.1__tar.gz → 2.1.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 (146) hide show
  1. exness_data_preprocess-2.1.0/.github/workflows/ci.yml +25 -0
  2. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/.gitignore +4 -0
  3. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/.mise.toml +20 -12
  4. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/CHANGELOG.md +43 -0
  5. exness_data_preprocess-2.1.0/CLAUDE.md +152 -0
  6. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/CONTRIBUTING.md +1 -1
  7. exness_data_preprocess-2.1.0/PKG-INFO +227 -0
  8. exness_data_preprocess-2.1.0/README.md +190 -0
  9. exness_data_preprocess-2.1.0/docs/CLICKHOUSE_USER_GUIDE.md +755 -0
  10. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/DATABASE_SCHEMA.md +6 -9
  11. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/EXNESS_DATA_SOURCES.md +9 -35
  12. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/MODULE_ARCHITECTURE.md +7 -10
  13. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/README.md +38 -66
  14. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/TRADING_HOURS_RESEARCH.md +43 -37
  15. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/UNIFIED_DUCKDB_PLAN_v2.md +2 -3
  16. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-09-exness-clickhouse-migration.md +1 -1
  17. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-10-clickhouse-pydantic-config.md +2 -3
  18. exness_data_preprocess-2.1.0/docs/adr/2025-12-11-duckdb-removal-clickhouse.md +234 -0
  19. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/archive/PYDANTIC_REFACTORING_STATUS_v0.2.0_COMPLETE.md +6 -7
  20. exness_data_preprocess-2.1.0/docs/design/2025-12-11-duckdb-removal-clickhouse/spec.md +399 -0
  21. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/releases/RELEASE_NOTES.md +1 -1
  22. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/releases/RELEASE_NOTES_SHORT.md +1 -1
  23. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/HYBRID_SESSION_DETECTION_ANALYSIS.md +26 -21
  24. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/compression-benchmarks/README.md +9 -7
  25. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/05-final-recommendations.md +5 -5
  26. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/README.md +8 -8
  27. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/scripts/reproduction_guide.md +3 -3
  28. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/01-methodology.md +2 -2
  29. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/02-baseline-sep2024.md +4 -4
  30. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/README.md +17 -17
  31. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/02_volatility_model_simple.py +1 -1
  32. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase1_data_validation.py +1 -1
  33. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/reproduction_guide.md +4 -4
  34. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_interactive_dashboard.py +1 -0
  35. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_lightweight_dashboard.py +1 -0
  36. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/setup/GITHUB_PYPI_SETUP.md +17 -17
  37. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/package.json +4 -0
  38. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/pyproject.toml +6 -8
  39. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/scripts/generate_dbeaver_config.py +2 -6
  40. exness_data_preprocess-2.1.0/scripts/migrate_duckdb_to_clickhouse.py +541 -0
  41. exness_data_preprocess-2.1.0/scripts/validate_migration_data.py +632 -0
  42. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/__init__.py +21 -15
  43. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_client.py +14 -4
  44. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_gap_detector.py +2 -6
  45. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_manager.py +8 -13
  46. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_ohlc_generator.py +34 -28
  47. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_query_engine.py +3 -5
  48. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/config.py +6 -9
  49. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/models.py +59 -62
  50. exness_data_preprocess-2.1.0/src/exness_data_preprocess/processor.py +582 -0
  51. exness_data_preprocess-2.1.0/tests/README.md +167 -0
  52. exness_data_preprocess-2.1.0/tests/conftest.py +79 -0
  53. exness_data_preprocess-2.1.0/tests/test_basic.py +57 -0
  54. exness_data_preprocess-2.1.0/tests/test_functional_regression.py +136 -0
  55. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/tests/test_models.py +55 -62
  56. exness_data_preprocess-2.1.0/tests/test_processor_pydantic.py +217 -0
  57. exness_data_preprocess-1.2.1/.github/workflows/ci.yml +0 -50
  58. exness_data_preprocess-1.2.1/CLAUDE.md +0 -150
  59. exness_data_preprocess-1.2.1/PKG-INFO +0 -528
  60. exness_data_preprocess-1.2.1/README.md +0 -490
  61. exness_data_preprocess-1.2.1/docs/research/gap_detection_implementation_example.py +0 -193
  62. exness_data_preprocess-1.2.1/src/exness_data_preprocess/database_manager.py +0 -208
  63. exness_data_preprocess-1.2.1/src/exness_data_preprocess/gap_detector.py +0 -133
  64. exness_data_preprocess-1.2.1/src/exness_data_preprocess/ohlc_generator.py +0 -265
  65. exness_data_preprocess-1.2.1/src/exness_data_preprocess/processor.py +0 -764
  66. exness_data_preprocess-1.2.1/src/exness_data_preprocess/query_engine.py +0 -290
  67. exness_data_preprocess-1.2.1/src/exness_data_preprocess/schema.py +0 -323
  68. exness_data_preprocess-1.2.1/tests/README.md +0 -162
  69. exness_data_preprocess-1.2.1/tests/conftest.py +0 -83
  70. exness_data_preprocess-1.2.1/tests/test_basic.py +0 -31
  71. exness_data_preprocess-1.2.1/tests/test_functional_regression.py +0 -327
  72. exness_data_preprocess-1.2.1/tests/test_processor_pydantic.py +0 -223
  73. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/.cz.toml +0 -0
  74. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
  75. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/.github/workflows/publish.yml +0 -0
  76. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/.pre-commit-config.yaml +0 -0
  77. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/.releaserc.yml +0 -0
  78. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/LICENSE +0 -0
  79. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/Makefile +0 -0
  80. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/cliff-release-notes.toml +0 -0
  81. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/cliff.toml +0 -0
  82. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/PRIORITY3_CLEANUP_PLAN.yaml +0 -0
  83. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/REPOSITORY_REFACTORING_PLAN.yaml +0 -0
  84. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/RESEARCH_PATTERNS.md +0 -0
  85. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-09-codebase-pruning.md +0 -0
  86. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md +0 -0
  87. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-after.dot +0 -0
  88. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-arch.dot +0 -0
  89. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-before.dot +0 -0
  90. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/archive/PHASE4_DRY_RUN_CONFIG_PLAN.yaml +0 -0
  91. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/archive/PHASE7_v1.5.0_REFACTORING_PLAN.md +0 -0
  92. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/archive/PHASE7_v1.6.0_REFACTORING_PROGRESS.md +0 -0
  93. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/archive/PYDANTIC_REFACTORING_PLAN_v0.2.0_COMPLETE.md +0 -0
  94. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/design/2025-12-09-codebase-pruning/spec.md +0 -0
  95. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/design/2025-12-09-exness-clickhouse-migration/spec.md +0 -0
  96. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/design/2025-12-10-clickhouse-e2e-validation-pipeline/spec.md +0 -0
  97. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/design/2025-12-10-clickhouse-pydantic-config/spec.md +0 -0
  98. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/optimization/OPTIMIZATION_OPPORTUNITIES_2025-10-18.md +0 -0
  99. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/phases/PHASE2_SESSION_VECTORIZATION_PLAN.yaml +0 -0
  100. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/phases/PHASE3_SQL_GAP_DETECTION_PLAN.yaml +0 -0
  101. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/compression-benchmarks/test_all_compression_methods.py +0 -0
  102. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/compression-benchmarks/test_delta_encoding_properly.py +0 -0
  103. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/compression-benchmarks/test_parquet_compression_methods.py +0 -0
  104. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/01-methodology.md +0 -0
  105. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/02-mode-truncated-analysis.md +0 -0
  106. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/03-hurdle-model-analysis.md +0 -0
  107. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +0 -0
  108. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/hurdle-model/hurdle_decomposition.png +0 -0
  109. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/cv_mode_comparison.png +0 -0
  110. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/distribution_overlay.png +0 -0
  111. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/signal_quality_comparison.png +0 -0
  112. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/variance_decomposition.png +0 -0
  113. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/concentration_curve.png +0 -0
  114. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/percentile_analysis.png +0 -0
  115. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/03-multiperiod-validation.md +0 -0
  116. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/04-discoveries-and-plan-evolution.md +0 -0
  117. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/findings/baseline-sep2024-comprehensive-summary.md +0 -0
  118. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/findings/phase2-mean-reversion-report.md +0 -0
  119. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/findings/phase3-volatility-model-report.md +0 -0
  120. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/findings/phase4-5-statistical-tests-survivorship-report.md +0 -0
  121. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/01_mean_reversion_analysis.py +0 -0
  122. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/03_liquidity_crisis_detection.py +0 -0
  123. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/04_regime_detection_analysis.py +0 -0
  124. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase2_mean_reversion.py +0 -0
  125. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase3_volatility_model.py +0 -0
  126. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase4_statistical_tests.py +0 -0
  127. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias.py +0 -0
  128. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias_v1.0.1.py +0 -0
  129. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6a_interval_analysis.py +0 -0
  130. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6b_price_clustering.py +0 -0
  131. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6c_combined_pattern.py +0 -0
  132. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/diagnostic_burst_decay.py +0 -0
  133. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/prepare_visualization_data.py +0 -0
  134. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md +0 -0
  135. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md +0 -0
  136. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md +0 -0
  137. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/examples/basic_usage.py +0 -0
  138. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/examples/batch_processing.py +0 -0
  139. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/package-lock.json +0 -0
  140. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_base.py +0 -0
  141. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/downloader.py +0 -0
  142. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/exchanges.py +0 -0
  143. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/session_detector.py +0 -0
  144. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/tick_loader.py +0 -0
  145. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/tests/__init__.py +0 -0
  146. {exness_data_preprocess-1.2.1 → exness_data_preprocess-2.1.0}/tests/test_types.py +0 -0
@@ -0,0 +1,25 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ pre-commit:
11
+ name: Pre-commit hooks
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - uses: actions/setup-python@v5
17
+ with:
18
+ python-version: '3.12'
19
+
20
+ - name: Run pre-commit hooks
21
+ uses: pre-commit/action@v3.0.1
22
+
23
+ # NOTE: Tests removed per local-first testing standard
24
+ # See: ~/.claude/CLAUDE.md - "NO unit testing in GitHub Actions"
25
+ # Run tests locally with: mise run validate
@@ -112,3 +112,7 @@ node_modules/
112
112
  # ADR: /docs/adr/2025-12-10-clickhouse-pydantic-config.md
113
113
  .dbeaver/
114
114
  .dbeaver-workspace/
115
+
116
+ # Claude Code local files
117
+ .claude/
118
+ .lint-relative-paths-results.txt
@@ -35,8 +35,9 @@ python = "3.11"
35
35
 
36
36
  [tasks.validate]
37
37
  description = "Run full E2E validation pipeline"
38
- # ADR: /docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md
38
+ # ADR: /docs/adr/2025-12-11-duckdb-removal-clickhouse.md
39
39
  depends = [
40
+ "clickhouse:ensure", # Fail fast if ClickHouse not running
40
41
  "validate:imports",
41
42
  "validate:lint",
42
43
  "validate:typecheck",
@@ -44,24 +45,36 @@ depends = [
44
45
  "validate:build",
45
46
  "validate:install",
46
47
  "validate:mixin",
48
+ "validate:clickhouse", # ClickHouse E2E validation
47
49
  ]
48
50
  run = '''
49
51
  echo ""
50
52
  echo "=============================================="
51
53
  echo "✅ ALL VALIDATIONS PASSED"
52
54
  echo "=============================================="
53
- echo ""
54
- echo "💡 To run ClickHouse validation (requires ClickHouse running):"
55
- echo " mise run clickhouse:start"
56
- echo " mise run validate:clickhouse"
57
55
  '''
58
56
 
59
57
  # -----------------------------------------------------------------------------
60
58
  # Individual Validation Tasks
61
59
  # -----------------------------------------------------------------------------
62
60
 
61
+ [tasks."clickhouse:ensure"]
62
+ description = "Ensure ClickHouse is running (fail fast)"
63
+ # ADR: /docs/adr/2025-12-11-duckdb-removal-clickhouse.md
64
+ run = '''
65
+ #!/usr/bin/env bash
66
+ set -e
67
+ if ! nc -z localhost 8123 2>/dev/null; then
68
+ echo "ERROR: ClickHouse not running on port 8123" >&2
69
+ echo "Start with: mise run clickhouse:start" >&2
70
+ exit 1
71
+ fi
72
+ echo "✅ ClickHouse connection verified"
73
+ '''
74
+
63
75
  [tasks."validate:imports"]
64
76
  description = "Validate all module imports (catch circular imports, missing deps)"
77
+ # ADR: /docs/adr/2025-12-11-duckdb-removal-clickhouse.md - DuckDB modules removed
65
78
  run = '''
66
79
  #!/usr/bin/env bash
67
80
  set -e
@@ -95,7 +108,7 @@ from exness_data_preprocess import (
95
108
  print('✅ All public exports importable')
96
109
  " || { echo "❌ Public exports import failed"; exit 1; }
97
110
 
98
- # Test all internal modules
111
+ # Test all internal modules (ClickHouse-only, DuckDB modules removed)
99
112
  uv run python -c "
100
113
  modules = [
101
114
  'exness_data_preprocess.clickhouse_base',
@@ -105,15 +118,10 @@ modules = [
105
118
  'exness_data_preprocess.clickhouse_ohlc_generator',
106
119
  'exness_data_preprocess.clickhouse_query_engine',
107
120
  'exness_data_preprocess.config',
108
- 'exness_data_preprocess.database_manager',
109
121
  'exness_data_preprocess.downloader',
110
122
  'exness_data_preprocess.exchanges',
111
- 'exness_data_preprocess.gap_detector',
112
123
  'exness_data_preprocess.models',
113
- 'exness_data_preprocess.ohlc_generator',
114
124
  'exness_data_preprocess.processor',
115
- 'exness_data_preprocess.query_engine',
116
- 'exness_data_preprocess.schema',
117
125
  'exness_data_preprocess.session_detector',
118
126
  'exness_data_preprocess.tick_loader',
119
127
  ]
@@ -121,7 +129,7 @@ import importlib
121
129
  for mod in modules:
122
130
  importlib.import_module(mod)
123
131
  print(f' ✓ {mod}')
124
- print('✅ All 18 modules importable')
132
+ print('✅ All 13 modules importable')
125
133
  "
126
134
  echo "✅ Import validation passed"
127
135
  '''
@@ -1,3 +1,46 @@
1
+ # [2.1.0](https://github.com/terrylica/exness-data-preprocess/compare/v2.0.0...v2.1.0) (2025-12-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **clickhouse:** add parameters support to execute_command and fix OHLC generator ([391b939](https://github.com/terrylica/exness-data-preprocess/commit/391b939bd2f7e6baad8945d98fc63e8843799682))
7
+ * **docs:** fix 22 broken links identified by lychee link checker ([a85862e](https://github.com/terrylica/exness-data-preprocess/commit/a85862e7af58bdd9e28eef59f364f56e0df37c24))
8
+
9
+
10
+ ### Features
11
+
12
+ * **scripts:** add DuckDB to ClickHouse migration scripts ([1920903](https://github.com/terrylica/exness-data-preprocess/commit/1920903df113bea810cc3607273d6f2ececd3f4b))
13
+
14
+ # [2.0.0](https://github.com/terrylica/exness-data-preprocess/compare/v1.2.1...v2.0.0) (2025-12-27)
15
+
16
+
17
+ * feat!: migrate to ClickHouse-only backend, remove DuckDB ([7fd83bc](https://github.com/terrylica/exness-data-preprocess/commit/7fd83bc5720b2f5997a661ef8060757abd602a81))
18
+
19
+
20
+ ### BREAKING CHANGES
21
+
22
+ * This release removes DuckDB and makes ClickHouse the sole storage backend.
23
+
24
+ API Changes:
25
+ - `duckdb_path` → `database` (str, ClickHouse database name)
26
+ - `duckdb_size_mb` → `storage_bytes` (int, bytes not MB)
27
+ - `database_exists` → removed
28
+ - `base_dir` constructor parameter → removed
29
+
30
+ Schema Changes:
31
+ - OHLC schema reduced from 30 to 26 columns (removed 4 normalized metrics)
32
+
33
+ Deleted Files (~1,219 lines):
34
+ - database_manager.py (209 lines)
35
+ - gap_detector.py (134 lines)
36
+ - ohlc_generator.py (266 lines)
37
+ - query_engine.py (291 lines)
38
+ - schema.py (324 lines)
39
+
40
+ Requires: ClickHouse running on localhost:8123
41
+
42
+ ADR: docs/adr/2025-12-11-duckdb-removal-clickhouse.md
43
+
1
44
  ## [1.2.1](https://github.com/terrylica/exness-data-preprocess/compare/v1.2.0...v1.2.1) (2025-12-11)
2
45
 
3
46
 
@@ -0,0 +1,152 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ **Package**: `exness-data-preprocess` — Forex tick data preprocessing with ClickHouse backend
6
+
7
+ **Version**: See [`pyproject.toml`](/pyproject.toml) line 3 (SSoT via semantic-release)
8
+
9
+ **Quick Start**: [`README.md`](/README.md) — Installation, API reference, usage examples
10
+
11
+ ---
12
+
13
+ ## Documentation Hub (Progressive Disclosure)
14
+
15
+ ### Essential Links
16
+
17
+ | Topic | SSoT Document | Purpose |
18
+ | ---------------- | ------------------------------------------------------------------------------------------------------ | ---------------------------- |
19
+ | **User Guide** | [`README.md`](/README.md) | Installation, API, examples |
20
+ | **Architecture** | [`docs/adr/2025-12-11-duckdb-removal-clickhouse.md`](/docs/adr/2025-12-11-duckdb-removal-clickhouse.md) | ClickHouse-only decision |
21
+ | **Schema** | [`docs/DATABASE_SCHEMA.md`](/docs/DATABASE_SCHEMA.md) | 26-column OHLC specification |
22
+ | **Modules** | [`docs/MODULE_ARCHITECTURE.md`](/docs/MODULE_ARCHITECTURE.md) | 13 modules with SLOs |
23
+ | **Data Sources** | [`docs/EXNESS_DATA_SOURCES.md`](/docs/EXNESS_DATA_SOURCES.md) | Exness tick data variants |
24
+ | **Tasks** | [`.mise.toml`](/.mise.toml) | Validation, ClickHouse tasks |
25
+ | **Contributing** | [`CONTRIBUTING.md`](/CONTRIBUTING.md) | Development guidelines |
26
+
27
+ ### Deep Dives (On-Demand)
28
+
29
+ | Topic | Location | When to Read |
30
+ | ------------------ | -------------------------------------- | ------------------------- |
31
+ | ADRs | [`docs/adr/`](/docs/adr/) | Architecture decisions |
32
+ | Design Specs | [`docs/design/`](/docs/design/) | Implementation blueprints |
33
+ | Validation Results | [`docs/validation/`](/docs/validation/) | Spike test proofs |
34
+
35
+ ---
36
+
37
+ ## Architecture Overview (v2.0.0)
38
+
39
+ ### ClickHouse-Only Backend
40
+
41
+ **ADR**: [`docs/adr/2025-12-11-duckdb-removal-clickhouse.md`](/docs/adr/2025-12-11-duckdb-removal-clickhouse.md)
42
+
43
+ | Feature | Description |
44
+ | --------------- | ------------------------------------------------ |
45
+ | **Database** | `exness` (single database for all instruments) |
46
+ | **Tables** | `raw_spread_ticks`, `standard_ticks`, `ohlc_1m` |
47
+ | **Engine** | ReplacingMergeTree (deduplication at merge time) |
48
+ | **Connection** | localhost:8123 (local) or cloud via env vars |
49
+ | **Entry Point** | `ExnessDataProcessor` |
50
+
51
+ ### Module Structure (13 Modules)
52
+
53
+ **ClickHouse Backend (7 modules)**:
54
+
55
+ - `processor.py` — Main orchestrator with ClickHouse backend
56
+ - `clickhouse_manager.py` — Schema management, data loading
57
+ - `clickhouse_gap_detector.py` — Gap detection for incremental updates
58
+ - `clickhouse_query_engine.py` — Query with pagination
59
+ - `clickhouse_ohlc_generator.py` — OHLC generation
60
+ - `clickhouse_client.py` — Connection factory with error handling
61
+ - `clickhouse_base.py` — Shared mixin for client lifecycle
62
+
63
+ **Shared (6 modules)**:
64
+
65
+ - `downloader.py` — HTTP download operations
66
+ - `tick_loader.py` — CSV parsing
67
+ - `session_detector.py` — Holiday/session detection (vectorized)
68
+ - `config.py` — Configuration management
69
+ - `models.py` — Pydantic models (UpdateResult, CoverageInfo, etc.)
70
+ - `exchanges.py` — Exchange calendar integration
71
+
72
+ **Deleted in v2.0.0**:
73
+
74
+ - ~~`database_manager.py`~~ — DuckDB database operations
75
+ - ~~`gap_detector.py`~~ — DuckDB gap detection
76
+ - ~~`ohlc_generator.py`~~ — DuckDB OHLC generation
77
+ - ~~`query_engine.py`~~ — DuckDB query operations
78
+ - ~~`schema.py`~~ — DuckDB SQL schema definitions
79
+
80
+ ---
81
+
82
+ ## Development Commands
83
+
84
+ ### Quick Reference
85
+
86
+ ```bash
87
+ # Setup
88
+ uv sync --dev
89
+
90
+ # Testing (45 tests)
91
+ uv run pytest # All tests
92
+ mise run validate # Full E2E validation (requires ClickHouse)
93
+
94
+ # Linting
95
+ uv run ruff check --fix src/ tests/
96
+
97
+ # ClickHouse (required for full validation)
98
+ mise run clickhouse:start # Start local server
99
+ mise run clickhouse:status # Check connection
100
+ mise run clickhouse:ensure # Fail fast if not running
101
+
102
+ # Build & Publish
103
+ uv build
104
+ ```
105
+
106
+ ### mise Tasks
107
+
108
+ All validation and tooling tasks are defined in [`.mise.toml`](/.mise.toml):
109
+
110
+ | Task | Description |
111
+ | ------------------------------ | --------------------------------------- |
112
+ | `mise run validate` | Full E2E pipeline (requires ClickHouse) |
113
+ | `mise run clickhouse:ensure` | Fail fast if ClickHouse not running |
114
+ | `mise run clickhouse:start` | Start mise-installed ClickHouse |
115
+ | `mise run validate:clickhouse` | ClickHouse E2E tests |
116
+
117
+ ---
118
+
119
+ ## Key Changes in v2.0.0
120
+
121
+ ### Breaking Changes
122
+
123
+ | v1.x (DuckDB) | v2.0.0 (ClickHouse) |
124
+ | ----------------- | ------------------------------- |
125
+ | `duckdb_path` | `database` (str) |
126
+ | `duckdb_size_mb` | `storage_bytes` (int) |
127
+ | `database_exists` | removed |
128
+ | `base_dir` param | removed (ClickHouse manages) |
129
+ | 30-column OHLC | 26-column OHLC (4 cols removed) |
130
+
131
+ ### Removed Files
132
+
133
+ ```
134
+ src/exness_data_preprocess/database_manager.py (209 lines)
135
+ src/exness_data_preprocess/gap_detector.py (134 lines)
136
+ src/exness_data_preprocess/ohlc_generator.py (266 lines)
137
+ src/exness_data_preprocess/query_engine.py (291 lines)
138
+ src/exness_data_preprocess/schema.py (324 lines)
139
+ ```
140
+
141
+ **Total: ~1,224 lines deleted**
142
+
143
+ ---
144
+
145
+ ## References
146
+
147
+ - **Exness Data**: <https://ticks.ex2archive.com/>
148
+ - **ClickHouse**: <https://clickhouse.com/>
149
+
150
+ ---
151
+
152
+ **Last Updated**: 2025-12-11
@@ -144,7 +144,7 @@ test: add integration tests for DuckDB operations
144
144
 
145
145
  ### Project Structure
146
146
 
147
- **See [`CLAUDE.md`](CLAUDE.md) for complete module structure (19 modules).**
147
+ **See [`CLAUDE.md`](/CLAUDE.md) for complete module structure (19 modules).**
148
148
 
149
149
  Key directories:
150
150
 
@@ -0,0 +1,227 @@
1
+ Metadata-Version: 2.4
2
+ Name: exness-data-preprocess
3
+ Version: 2.1.0
4
+ Summary: Professional Exness forex tick data preprocessing with ClickHouse backend. Provides efficient storage with lossless precision and direct queryability.
5
+ Project-URL: Homepage, https://github.com/terrylica/exness-data-preprocess
6
+ Project-URL: Documentation, https://github.com/terrylica/exness-data-preprocess#readme
7
+ Project-URL: Repository, https://github.com/terrylica/exness-data-preprocess.git
8
+ Project-URL: Bug Tracker, https://github.com/terrylica/exness-data-preprocess/issues
9
+ Project-URL: Source Code, https://github.com/terrylica/exness-data-preprocess
10
+ Project-URL: Changelog, https://github.com/terrylica/exness-data-preprocess/blob/main/CHANGELOG.md
11
+ Author-email: Eon Labs <terry@eonlabs.com>
12
+ Maintainer-email: Terry Li <terry@eonlabs.com>
13
+ License: MIT
14
+ License-File: LICENSE
15
+ Keywords: backtesting,clickhouse,data-engineering,efficient-storage,eurusd,exness,financial-data,forex,forex-data,lossless,microstructure,ohlc,pandas,preprocessing,quantitative-finance,queryable,tick-data,time-series
16
+ Classifier: Development Status :: 3 - Alpha
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: Intended Audience :: Financial and Insurance Industry
19
+ Classifier: License :: OSI Approved :: MIT License
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Programming Language :: Python :: 3
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Topic :: Office/Business :: Financial :: Investment
26
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
27
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
+ Requires-Python: >=3.11
29
+ Requires-Dist: clickhouse-connect>=0.7.0
30
+ Requires-Dist: exchange-calendars>=4.5.6
31
+ Requires-Dist: pandas>=2.0.0
32
+ Requires-Dist: pydantic>=2.0.0
33
+ Requires-Dist: pyyaml>=6.0.0
34
+ Provides-Extra: examples
35
+ Requires-Dist: tqdm>=4.65.0; extra == 'examples'
36
+ Description-Content-Type: text/markdown
37
+
38
+ # exness-data-preprocess v2.0.0
39
+
40
+ Forex tick data preprocessing with ClickHouse backend. Downloads, stores, and queries tick data from Exness public repository.
41
+
42
+ ## Data Inventory (Validated 2025-12-28)
43
+
44
+ | Instrument | raw_spread_ticks | standard_ticks | ohlc_1m | Date Range |
45
+ | ---------- | ---------------- | -------------- | --------- | ----------------------- |
46
+ | EURUSD | 56,687,313 | 62,203,144 | 1,466,724 | 2022-01-02 → 2025-12-26 |
47
+ | XAUUSD | 166,820,410 | 167,871,871 | 1,401,953 | 2022-01-02 → 2025-12-26 |
48
+
49
+ **Total**: 453.6M ticks, 2.87M OHLC bars in 5.99 GiB
50
+
51
+ ## Requirements
52
+
53
+ - Python 3.11+
54
+ - ClickHouse running on `localhost:8123`
55
+
56
+ ## Verify ClickHouse
57
+
58
+ ```bash
59
+ # Check ClickHouse is running
60
+ clickhouse client --query "SELECT version()"
61
+
62
+ # Check exness database exists
63
+ clickhouse client --query "SELECT count() FROM exness.raw_spread_ticks"
64
+ ```
65
+
66
+ ## Installation
67
+
68
+ ```bash
69
+ # Using uv
70
+ uv pip install exness-data-preprocess
71
+
72
+ # From source
73
+ git clone https://github.com/Eon-Labs/exness-data-preprocess.git
74
+ cd exness-data-preprocess
75
+ uv sync
76
+ ```
77
+
78
+ ## Python API
79
+
80
+ ```python
81
+ import exness_data_preprocess as edp
82
+
83
+ # Context manager (recommended)
84
+ with edp.ExnessDataProcessor() as processor:
85
+ # Query ticks
86
+ df = processor.query_ticks('EURUSD', 'raw_spread', '2024-01-01', '2024-01-31')
87
+
88
+ # Query OHLC
89
+ df = processor.query_ohlc('EURUSD', '1m', '2024-01-01', '2024-01-31')
90
+
91
+ # Get coverage info
92
+ cov = processor.get_data_coverage('EURUSD')
93
+
94
+ # Download new data (incremental)
95
+ result = processor.update_data('EURUSD', start_date='2022-01-01')
96
+ ```
97
+
98
+ ### API Methods
99
+
100
+ | Method | Parameters | Returns |
101
+ | --------------------------------------------------- | ---------------------------------------------- | ------------ |
102
+ | `query_ticks(pair, variant, start_date, end_date)` | variant: `raw_spread` or `standard` | DataFrame |
103
+ | `query_ohlc(pair, timeframe, start_date, end_date)` | timeframe: `1m`, `5m`, `15m`, `1h`, `4h`, `1d` | DataFrame |
104
+ | `get_data_coverage(pair)` | | CoverageInfo |
105
+ | `update_data(pair, start_date, delete_zip=True)` | | UpdateResult |
106
+
107
+ ### Return Models
108
+
109
+ ```python
110
+ # UpdateResult
111
+ result.months_added # int: months downloaded
112
+ result.raw_ticks_added # int: raw spread ticks added
113
+ result.standard_ticks_added # int: standard ticks added
114
+ result.ohlc_bars # int: OHLC bars generated
115
+ result.storage_bytes # int: storage used
116
+
117
+ # CoverageInfo
118
+ cov.raw_spread_ticks # int: total raw spread ticks
119
+ cov.standard_ticks # int: total standard ticks
120
+ cov.ohlc_bars # int: total OHLC bars
121
+ cov.earliest_date # str: earliest timestamp
122
+ cov.latest_date # str: latest timestamp
123
+ cov.storage_bytes # int: storage used
124
+ ```
125
+
126
+ ## Direct SQL Access
127
+
128
+ ```bash
129
+ # Count ticks
130
+ clickhouse client --query "SELECT count() FROM exness.raw_spread_ticks WHERE instrument='EURUSD'"
131
+
132
+ # Query tick data
133
+ clickhouse client --query "
134
+ SELECT timestamp, bid, ask
135
+ FROM exness.raw_spread_ticks
136
+ WHERE instrument='EURUSD'
137
+ AND timestamp >= '2024-01-01'
138
+ AND timestamp < '2024-01-02'
139
+ LIMIT 10"
140
+
141
+ # Query OHLC
142
+ clickhouse client --query "
143
+ SELECT timestamp, open, high, low, close
144
+ FROM exness.ohlc_1m
145
+ WHERE instrument='EURUSD'
146
+ AND timestamp >= '2024-01-01'
147
+ LIMIT 10"
148
+
149
+ # Resample to 1h
150
+ clickhouse client --query "
151
+ SELECT
152
+ toStartOfHour(timestamp) AS ts,
153
+ argMin(open, timestamp) AS open,
154
+ max(high) AS high,
155
+ min(low) AS low,
156
+ argMax(close, timestamp) AS close
157
+ FROM exness.ohlc_1m
158
+ WHERE instrument='EURUSD' AND timestamp >= '2024-01-01'
159
+ GROUP BY ts
160
+ ORDER BY ts"
161
+ ```
162
+
163
+ ## Schema
164
+
165
+ ### Tick Tables
166
+
167
+ `exness.raw_spread_ticks`, `exness.standard_ticks`:
168
+
169
+ | Column | Type | Codec |
170
+ | ---------- | ---------------------- | ------------------- |
171
+ | instrument | LowCardinality(String) | - |
172
+ | timestamp | DateTime64(6, 'UTC') | DoubleDelta, LZ4 |
173
+ | bid | Float64 | Gorilla(8), ZSTD(1) |
174
+ | ask | Float64 | Gorilla(8), ZSTD(1) |
175
+
176
+ ### OHLC Table
177
+
178
+ `exness.ohlc_1m` (27 columns):
179
+
180
+ | Category | Columns |
181
+ | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
182
+ | Core | instrument, timestamp, open, high, low, close |
183
+ | Spreads | raw_spread_avg, standard_spread_avg |
184
+ | Tick counts | tick_count_raw_spread, tick_count_standard |
185
+ | Timezone | ny_hour, london_hour, ny_session, london_session |
186
+ | Holidays | is_us_holiday, is_uk_holiday, is_major_holiday |
187
+ | Sessions | is_nyse_session, is_lse_session, is_xswx_session, is_xfra_session, is_xtse_session, is_xnze_session, is_xtks_session, is_xasx_session, is_xhkg_session, is_xses_session |
188
+
189
+ Engine: `ReplacingMergeTree` (automatic deduplication)
190
+
191
+ Partition: `toYYYYMM(timestamp)`
192
+
193
+ Order: `(instrument, timestamp)`
194
+
195
+ ## Data Source
196
+
197
+ - URL: <https://ticks.ex2archive.com/>
198
+ - Format: Monthly ZIP files with CSV tick data
199
+ - Variants: Raw_Spread (zero spreads) + Standard (market spreads)
200
+ - Precision: Microsecond timestamps
201
+
202
+ ## Development
203
+
204
+ ```bash
205
+ # Setup
206
+ uv sync --dev
207
+
208
+ # Test
209
+ uv run pytest
210
+
211
+ # Lint
212
+ uv run ruff check --fix .
213
+
214
+ # Type check
215
+ uv run mypy src/
216
+ ```
217
+
218
+ ## Documentation
219
+
220
+ - [ClickHouse User Guide](/docs/CLICKHOUSE_USER_GUIDE.md) - Detailed ClickHouse usage
221
+ - [Database Schema](/docs/DATABASE_SCHEMA.md) - 27-column OHLC specification
222
+ - [Module Architecture](/docs/MODULE_ARCHITECTURE.md) - 13 modules with SLOs
223
+ - [ADR: ClickHouse Migration](/docs/adr/2025-12-11-duckdb-removal-clickhouse.md) - Architecture decision
224
+
225
+ ## License
226
+
227
+ MIT