exness-data-preprocess 2.0.0__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.
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/.gitignore +4 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/CHANGELOG.md +13 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/CLAUDE.md +14 -14
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/CONTRIBUTING.md +1 -1
- exness_data_preprocess-2.1.0/PKG-INFO +227 -0
- exness_data_preprocess-2.1.0/README.md +190 -0
- exness_data_preprocess-2.1.0/docs/CLICKHOUSE_USER_GUIDE.md +755 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/DATABASE_SCHEMA.md +6 -9
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/EXNESS_DATA_SOURCES.md +9 -35
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/MODULE_ARCHITECTURE.md +7 -10
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/README.md +38 -66
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/TRADING_HOURS_RESEARCH.md +43 -37
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/UNIFIED_DUCKDB_PLAN_v2.md +2 -3
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-09-exness-clickhouse-migration.md +1 -1
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-10-clickhouse-pydantic-config.md +2 -3
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-11-duckdb-removal-clickhouse.md +0 -2
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/archive/PYDANTIC_REFACTORING_STATUS_v0.2.0_COMPLETE.md +6 -7
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/releases/RELEASE_NOTES.md +1 -1
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/releases/RELEASE_NOTES_SHORT.md +1 -1
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/HYBRID_SESSION_DETECTION_ANALYSIS.md +26 -21
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/compression-benchmarks/README.md +9 -7
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/05-final-recommendations.md +5 -5
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/README.md +8 -8
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/scripts/reproduction_guide.md +3 -3
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/01-methodology.md +2 -2
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/02-baseline-sep2024.md +4 -4
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/README.md +17 -17
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/reproduction_guide.md +4 -4
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/setup/GITHUB_PYPI_SETUP.md +17 -17
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/package.json +4 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/pyproject.toml +1 -1
- exness_data_preprocess-2.1.0/scripts/migrate_duckdb_to_clickhouse.py +541 -0
- exness_data_preprocess-2.1.0/scripts/validate_migration_data.py +632 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/__init__.py +1 -1
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_client.py +9 -3
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_ohlc_generator.py +12 -26
- exness_data_preprocess-2.1.0/tests/README.md +167 -0
- exness_data_preprocess-2.0.0/PKG-INFO +0 -584
- exness_data_preprocess-2.0.0/README.md +0 -547
- exness_data_preprocess-2.0.0/docs/research/gap_detection_implementation_example.py +0 -193
- exness_data_preprocess-2.0.0/tests/README.md +0 -162
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/.cz.toml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/.github/workflows/ci.yml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/.github/workflows/publish.yml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/.mise.toml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/.pre-commit-config.yaml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/.releaserc.yml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/LICENSE +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/Makefile +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/cliff-release-notes.toml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/cliff.toml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/PRIORITY3_CLEANUP_PLAN.yaml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/REPOSITORY_REFACTORING_PLAN.yaml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/RESEARCH_PATTERNS.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-09-codebase-pruning.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-after.dot +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-arch.dot +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-before.dot +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/archive/PHASE4_DRY_RUN_CONFIG_PLAN.yaml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/archive/PHASE7_v1.5.0_REFACTORING_PLAN.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/archive/PHASE7_v1.6.0_REFACTORING_PROGRESS.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/archive/PYDANTIC_REFACTORING_PLAN_v0.2.0_COMPLETE.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/design/2025-12-09-codebase-pruning/spec.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/design/2025-12-09-exness-clickhouse-migration/spec.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/design/2025-12-10-clickhouse-e2e-validation-pipeline/spec.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/design/2025-12-10-clickhouse-pydantic-config/spec.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/design/2025-12-11-duckdb-removal-clickhouse/spec.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/optimization/OPTIMIZATION_OPPORTUNITIES_2025-10-18.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/phases/PHASE2_SESSION_VECTORIZATION_PLAN.yaml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/phases/PHASE3_SQL_GAP_DETECTION_PLAN.yaml +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/compression-benchmarks/test_all_compression_methods.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/compression-benchmarks/test_delta_encoding_properly.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/compression-benchmarks/test_parquet_compression_methods.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/01-methodology.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/02-mode-truncated-analysis.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/03-hurdle-model-analysis.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/hurdle-model/hurdle_decomposition.png +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/cv_mode_comparison.png +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/distribution_overlay.png +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/signal_quality_comparison.png +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/variance_decomposition.png +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/concentration_curve.png +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/percentile_analysis.png +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/03-multiperiod-validation.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/04-discoveries-and-plan-evolution.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/findings/baseline-sep2024-comprehensive-summary.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/findings/phase2-mean-reversion-report.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/findings/phase3-volatility-model-report.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/findings/phase4-5-statistical-tests-survivorship-report.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/01_mean_reversion_analysis.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/02_volatility_model_simple.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/03_liquidity_crisis_detection.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/04_regime_detection_analysis.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase1_data_validation.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase2_mean_reversion.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase3_volatility_model.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase4_statistical_tests.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias_v1.0.1.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6a_interval_analysis.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6b_price_clustering.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6c_combined_pattern.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/diagnostic_burst_decay.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_interactive_dashboard.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_lightweight_dashboard.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/prepare_visualization_data.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/examples/basic_usage.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/examples/batch_processing.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/package-lock.json +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/scripts/generate_dbeaver_config.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_base.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_gap_detector.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_manager.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/clickhouse_query_engine.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/config.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/downloader.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/exchanges.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/models.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/processor.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/session_detector.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/src/exness_data_preprocess/tick_loader.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/tests/__init__.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/tests/conftest.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/tests/test_basic.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/tests/test_functional_regression.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/tests/test_models.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/tests/test_processor_pydantic.py +0 -0
- {exness_data_preprocess-2.0.0 → exness_data_preprocess-2.1.0}/tests/test_types.py +0 -0
|
@@ -1,3 +1,16 @@
|
|
|
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
|
+
|
|
1
14
|
# [2.0.0](https://github.com/terrylica/exness-data-preprocess/compare/v1.2.1...v2.0.0) (2025-12-27)
|
|
2
15
|
|
|
3
16
|
|
|
@@ -4,9 +4,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
4
4
|
|
|
5
5
|
**Package**: `exness-data-preprocess` — Forex tick data preprocessing with ClickHouse backend
|
|
6
6
|
|
|
7
|
-
**Version**: See [`pyproject.toml`](pyproject.toml) line 3 (SSoT via semantic-release)
|
|
7
|
+
**Version**: See [`pyproject.toml`](/pyproject.toml) line 3 (SSoT via semantic-release)
|
|
8
8
|
|
|
9
|
-
**Quick Start**: [`README.md`](README.md) — Installation, API reference, usage examples
|
|
9
|
+
**Quick Start**: [`README.md`](/README.md) — Installation, API reference, usage examples
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -16,21 +16,21 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
16
16
|
|
|
17
17
|
| Topic | SSoT Document | Purpose |
|
|
18
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`](
|
|
25
|
-
| **Contributing** | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Development guidelines |
|
|
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
26
|
|
|
27
27
|
### Deep Dives (On-Demand)
|
|
28
28
|
|
|
29
29
|
| Topic | Location | When to Read |
|
|
30
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 |
|
|
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
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
@@ -38,7 +38,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
38
38
|
|
|
39
39
|
### ClickHouse-Only Backend
|
|
40
40
|
|
|
41
|
-
**ADR**: [`docs/adr/2025-12-11-duckdb-removal-clickhouse.md`](docs/adr/2025-12-11-duckdb-removal-clickhouse.md)
|
|
41
|
+
**ADR**: [`docs/adr/2025-12-11-duckdb-removal-clickhouse.md`](/docs/adr/2025-12-11-duckdb-removal-clickhouse.md)
|
|
42
42
|
|
|
43
43
|
| Feature | Description |
|
|
44
44
|
| --------------- | ------------------------------------------------ |
|
|
@@ -105,7 +105,7 @@ uv build
|
|
|
105
105
|
|
|
106
106
|
### mise Tasks
|
|
107
107
|
|
|
108
|
-
All validation and tooling tasks are defined in [`.mise.toml`](
|
|
108
|
+
All validation and tooling tasks are defined in [`.mise.toml`](/.mise.toml):
|
|
109
109
|
|
|
110
110
|
| Task | Description |
|
|
111
111
|
| ------------------------------ | --------------------------------------- |
|
|
@@ -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
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# exness-data-preprocess v2.0.0
|
|
2
|
+
|
|
3
|
+
Forex tick data preprocessing with ClickHouse backend. Downloads, stores, and queries tick data from Exness public repository.
|
|
4
|
+
|
|
5
|
+
## Data Inventory (Validated 2025-12-28)
|
|
6
|
+
|
|
7
|
+
| Instrument | raw_spread_ticks | standard_ticks | ohlc_1m | Date Range |
|
|
8
|
+
| ---------- | ---------------- | -------------- | --------- | ----------------------- |
|
|
9
|
+
| EURUSD | 56,687,313 | 62,203,144 | 1,466,724 | 2022-01-02 → 2025-12-26 |
|
|
10
|
+
| XAUUSD | 166,820,410 | 167,871,871 | 1,401,953 | 2022-01-02 → 2025-12-26 |
|
|
11
|
+
|
|
12
|
+
**Total**: 453.6M ticks, 2.87M OHLC bars in 5.99 GiB
|
|
13
|
+
|
|
14
|
+
## Requirements
|
|
15
|
+
|
|
16
|
+
- Python 3.11+
|
|
17
|
+
- ClickHouse running on `localhost:8123`
|
|
18
|
+
|
|
19
|
+
## Verify ClickHouse
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Check ClickHouse is running
|
|
23
|
+
clickhouse client --query "SELECT version()"
|
|
24
|
+
|
|
25
|
+
# Check exness database exists
|
|
26
|
+
clickhouse client --query "SELECT count() FROM exness.raw_spread_ticks"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Using uv
|
|
33
|
+
uv pip install exness-data-preprocess
|
|
34
|
+
|
|
35
|
+
# From source
|
|
36
|
+
git clone https://github.com/Eon-Labs/exness-data-preprocess.git
|
|
37
|
+
cd exness-data-preprocess
|
|
38
|
+
uv sync
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Python API
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
import exness_data_preprocess as edp
|
|
45
|
+
|
|
46
|
+
# Context manager (recommended)
|
|
47
|
+
with edp.ExnessDataProcessor() as processor:
|
|
48
|
+
# Query ticks
|
|
49
|
+
df = processor.query_ticks('EURUSD', 'raw_spread', '2024-01-01', '2024-01-31')
|
|
50
|
+
|
|
51
|
+
# Query OHLC
|
|
52
|
+
df = processor.query_ohlc('EURUSD', '1m', '2024-01-01', '2024-01-31')
|
|
53
|
+
|
|
54
|
+
# Get coverage info
|
|
55
|
+
cov = processor.get_data_coverage('EURUSD')
|
|
56
|
+
|
|
57
|
+
# Download new data (incremental)
|
|
58
|
+
result = processor.update_data('EURUSD', start_date='2022-01-01')
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### API Methods
|
|
62
|
+
|
|
63
|
+
| Method | Parameters | Returns |
|
|
64
|
+
| --------------------------------------------------- | ---------------------------------------------- | ------------ |
|
|
65
|
+
| `query_ticks(pair, variant, start_date, end_date)` | variant: `raw_spread` or `standard` | DataFrame |
|
|
66
|
+
| `query_ohlc(pair, timeframe, start_date, end_date)` | timeframe: `1m`, `5m`, `15m`, `1h`, `4h`, `1d` | DataFrame |
|
|
67
|
+
| `get_data_coverage(pair)` | | CoverageInfo |
|
|
68
|
+
| `update_data(pair, start_date, delete_zip=True)` | | UpdateResult |
|
|
69
|
+
|
|
70
|
+
### Return Models
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
# UpdateResult
|
|
74
|
+
result.months_added # int: months downloaded
|
|
75
|
+
result.raw_ticks_added # int: raw spread ticks added
|
|
76
|
+
result.standard_ticks_added # int: standard ticks added
|
|
77
|
+
result.ohlc_bars # int: OHLC bars generated
|
|
78
|
+
result.storage_bytes # int: storage used
|
|
79
|
+
|
|
80
|
+
# CoverageInfo
|
|
81
|
+
cov.raw_spread_ticks # int: total raw spread ticks
|
|
82
|
+
cov.standard_ticks # int: total standard ticks
|
|
83
|
+
cov.ohlc_bars # int: total OHLC bars
|
|
84
|
+
cov.earliest_date # str: earliest timestamp
|
|
85
|
+
cov.latest_date # str: latest timestamp
|
|
86
|
+
cov.storage_bytes # int: storage used
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Direct SQL Access
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Count ticks
|
|
93
|
+
clickhouse client --query "SELECT count() FROM exness.raw_spread_ticks WHERE instrument='EURUSD'"
|
|
94
|
+
|
|
95
|
+
# Query tick data
|
|
96
|
+
clickhouse client --query "
|
|
97
|
+
SELECT timestamp, bid, ask
|
|
98
|
+
FROM exness.raw_spread_ticks
|
|
99
|
+
WHERE instrument='EURUSD'
|
|
100
|
+
AND timestamp >= '2024-01-01'
|
|
101
|
+
AND timestamp < '2024-01-02'
|
|
102
|
+
LIMIT 10"
|
|
103
|
+
|
|
104
|
+
# Query OHLC
|
|
105
|
+
clickhouse client --query "
|
|
106
|
+
SELECT timestamp, open, high, low, close
|
|
107
|
+
FROM exness.ohlc_1m
|
|
108
|
+
WHERE instrument='EURUSD'
|
|
109
|
+
AND timestamp >= '2024-01-01'
|
|
110
|
+
LIMIT 10"
|
|
111
|
+
|
|
112
|
+
# Resample to 1h
|
|
113
|
+
clickhouse client --query "
|
|
114
|
+
SELECT
|
|
115
|
+
toStartOfHour(timestamp) AS ts,
|
|
116
|
+
argMin(open, timestamp) AS open,
|
|
117
|
+
max(high) AS high,
|
|
118
|
+
min(low) AS low,
|
|
119
|
+
argMax(close, timestamp) AS close
|
|
120
|
+
FROM exness.ohlc_1m
|
|
121
|
+
WHERE instrument='EURUSD' AND timestamp >= '2024-01-01'
|
|
122
|
+
GROUP BY ts
|
|
123
|
+
ORDER BY ts"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Schema
|
|
127
|
+
|
|
128
|
+
### Tick Tables
|
|
129
|
+
|
|
130
|
+
`exness.raw_spread_ticks`, `exness.standard_ticks`:
|
|
131
|
+
|
|
132
|
+
| Column | Type | Codec |
|
|
133
|
+
| ---------- | ---------------------- | ------------------- |
|
|
134
|
+
| instrument | LowCardinality(String) | - |
|
|
135
|
+
| timestamp | DateTime64(6, 'UTC') | DoubleDelta, LZ4 |
|
|
136
|
+
| bid | Float64 | Gorilla(8), ZSTD(1) |
|
|
137
|
+
| ask | Float64 | Gorilla(8), ZSTD(1) |
|
|
138
|
+
|
|
139
|
+
### OHLC Table
|
|
140
|
+
|
|
141
|
+
`exness.ohlc_1m` (27 columns):
|
|
142
|
+
|
|
143
|
+
| Category | Columns |
|
|
144
|
+
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
145
|
+
| Core | instrument, timestamp, open, high, low, close |
|
|
146
|
+
| Spreads | raw_spread_avg, standard_spread_avg |
|
|
147
|
+
| Tick counts | tick_count_raw_spread, tick_count_standard |
|
|
148
|
+
| Timezone | ny_hour, london_hour, ny_session, london_session |
|
|
149
|
+
| Holidays | is_us_holiday, is_uk_holiday, is_major_holiday |
|
|
150
|
+
| 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 |
|
|
151
|
+
|
|
152
|
+
Engine: `ReplacingMergeTree` (automatic deduplication)
|
|
153
|
+
|
|
154
|
+
Partition: `toYYYYMM(timestamp)`
|
|
155
|
+
|
|
156
|
+
Order: `(instrument, timestamp)`
|
|
157
|
+
|
|
158
|
+
## Data Source
|
|
159
|
+
|
|
160
|
+
- URL: <https://ticks.ex2archive.com/>
|
|
161
|
+
- Format: Monthly ZIP files with CSV tick data
|
|
162
|
+
- Variants: Raw_Spread (zero spreads) + Standard (market spreads)
|
|
163
|
+
- Precision: Microsecond timestamps
|
|
164
|
+
|
|
165
|
+
## Development
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Setup
|
|
169
|
+
uv sync --dev
|
|
170
|
+
|
|
171
|
+
# Test
|
|
172
|
+
uv run pytest
|
|
173
|
+
|
|
174
|
+
# Lint
|
|
175
|
+
uv run ruff check --fix .
|
|
176
|
+
|
|
177
|
+
# Type check
|
|
178
|
+
uv run mypy src/
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Documentation
|
|
182
|
+
|
|
183
|
+
- [ClickHouse User Guide](/docs/CLICKHOUSE_USER_GUIDE.md) - Detailed ClickHouse usage
|
|
184
|
+
- [Database Schema](/docs/DATABASE_SCHEMA.md) - 27-column OHLC specification
|
|
185
|
+
- [Module Architecture](/docs/MODULE_ARCHITECTURE.md) - 13 modules with SLOs
|
|
186
|
+
- [ADR: ClickHouse Migration](/docs/adr/2025-12-11-duckdb-removal-clickhouse.md) - Architecture decision
|
|
187
|
+
|
|
188
|
+
## License
|
|
189
|
+
|
|
190
|
+
MIT
|