centaur_technical_indicators 1.2.2__tar.gz → 1.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. centaur_technical_indicators-1.3.0/.github/pull_request_template.md +26 -0
  2. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/.github/workflows/CI.yml +2 -0
  3. centaur_technical_indicators-1.3.0/AGENTS.md +152 -0
  4. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/CHANGELOG.md +36 -1
  5. centaur_technical_indicators-1.3.0/CLAUDE.md +21 -0
  6. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/Cargo.lock +4 -4
  7. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/Cargo.toml +2 -2
  8. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/PKG-INFO +32 -15
  9. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/README.md +24 -12
  10. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/ai-policy.yaml +1 -0
  11. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/pyproject.toml +9 -2
  12. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/__init__.py +35 -0
  13. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/__init__.pyi +16 -0
  14. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/candle_indicators.pyi +39 -0
  15. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/chart_trends.pyi +11 -0
  16. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/correlation_indicators.pyi +11 -0
  17. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/momentum_indicators.pyi +71 -0
  18. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/moving_average.pyi +15 -0
  19. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/other_indicators.pyi +25 -0
  20. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/py.typed +0 -0
  21. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/strength_indicators.pyi +21 -0
  22. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/trend_indicators.pyi +39 -0
  23. centaur_technical_indicators-1.3.0/python/centaur_technical_indicators/volatility_indicators.pyi +13 -0
  24. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/candle_indicators.rs +34 -28
  25. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/chart_trends.rs +48 -5
  26. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/correlation_indicators.rs +6 -4
  27. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/lib.rs +77 -13
  28. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/momentum_indicators.rs +66 -37
  29. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/moving_average.rs +10 -14
  30. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/other_indicators.rs +15 -9
  31. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/strength_indicators.rs +12 -15
  32. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/trend_indicators.rs +16 -13
  33. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/src/volatility_indicators.rs +4 -3
  34. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/tests/test_candle_indicators.py +6 -0
  35. centaur_technical_indicators-1.3.0/tests/test_chart_trends.py +94 -0
  36. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/tests/test_momentum_indicators.py +6 -0
  37. centaur_technical_indicators-1.3.0/tests/test_package_layout.py +47 -0
  38. centaur_technical_indicators-1.3.0/tests/test_string_aliases.py +60 -0
  39. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/tests/test_trend_indicators.py +11 -0
  40. centaur_technical_indicators-1.2.2/.github/pull_request_template.md +0 -18
  41. centaur_technical_indicators-1.2.2/AGENTS.md +0 -114
  42. centaur_technical_indicators-1.2.2/docs/REPO_MAP.md +0 -72
  43. centaur_technical_indicators-1.2.2/tests/test_chart_trends.py +0 -58
  44. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/.github/CODEOWNERS +0 -0
  45. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  46. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  47. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/.github/workflows/python-package.yml +0 -0
  48. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/.gitignore +0 -0
  49. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/CODE_OF_CONDUCT.md +0 -0
  50. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/CONTRIBUTING.md +0 -0
  51. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/LICENSE-MIT +0 -0
  52. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/SECURITY.md +0 -0
  53. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/assets/pytechnicalindicators_banner.png +0 -0
  54. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/requirements.txt +0 -0
  55. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/test_requirements.txt +0 -0
  56. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/tests/test_correlation_indicators.py +0 -0
  57. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/tests/test_moving_average.py +0 -0
  58. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/tests/test_other_indicators.py +0 -0
  59. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/tests/test_strength_indicators.py +0 -0
  60. {centaur_technical_indicators-1.2.2 → centaur_technical_indicators-1.3.0}/tests/test_volatility_indicators.py +0 -0
@@ -0,0 +1,26 @@
1
+ ## Summary
2
+ - What changed?
3
+ - Why was this change needed?
4
+
5
+ ## Scope
6
+ - Files/modules touched:
7
+ - Intentionally left untouched:
8
+
9
+ ## Compatibility
10
+ - User-facing Python API impact:
11
+ - Migration notes (if any):
12
+
13
+ ## Validation
14
+ - [ ] `maturin develop` (bindings compile cleanly)
15
+ - [ ] `python -m pytest` (all tests pass)
16
+ - [ ] `cargo fmt --all -- --check` (no formatting diffs)
17
+
18
+ Command output summary (paste the pytest `N passed` line and any gate output):
19
+
20
+ ## Changelog
21
+ - [ ] `CHANGELOG.md` updated under `## [Unreleased]` for user-facing changes (or exempt — non-user-facing)
22
+ - Entry summary:
23
+
24
+ ## Flagged / notes
25
+ - Out-of-scope issues, surprises, or blockers:
26
+ - AI assistance disclosed (per `CONTRIBUTING.md`):
@@ -23,6 +23,8 @@ jobs:
23
23
  runs-on: ubuntu-latest
24
24
  steps:
25
25
  - uses: actions/checkout@v6
26
+ - name: Check Rust formatting
27
+ run: cargo fmt --all -- --check
26
28
  - uses: actions/setup-python@v6
27
29
  with:
28
30
  python-version: '3.12'
@@ -0,0 +1,152 @@
1
+ # AGENTS.md
2
+
3
+ Guidance for coding agents working in this repository. This file is the
4
+ authoritative source for the repo's standing conventions — pre-PR gates,
5
+ branch/commit format, PR shape, scope discipline, stop-and-report, changelog
6
+ coupling, and worktree isolation. Task briefs defer to it and record only what is
7
+ specific to the task.
8
+
9
+ ## Project at a glance
10
+ - **Repo type:** Python package with a Rust core exposed via PyO3/maturin.
11
+ - **Primary goal:** Keep Python bindings stable while preserving Rust-side correctness and performance.
12
+ - **Main source directories:**
13
+ - `src/` → Rust implementation + Python bindings
14
+ - `tests/` → Python-facing smoke/behavior tests for bindings
15
+
16
+ ## Docs to review before coding
17
+ - `docs/REPO_MAP.md`
18
+ - `CONTRIBUTING.md`
19
+
20
+ ## Recommended workflow
21
+ 1. **Set up an isolated environment**
22
+ ```bash
23
+ python -m venv .venv
24
+ source .venv/bin/activate
25
+ python -m pip install --upgrade pip
26
+ pip install -r test_requirements.txt
27
+ ```
28
+ 2. **Build extension module**
29
+ ```bash
30
+ maturin develop
31
+ ```
32
+ 3. **Run tests**
33
+ ```bash
34
+ python -m pytest
35
+ ```
36
+ 4. **Check formatting**
37
+ ```bash
38
+ cargo fmt --all -- --check
39
+ ```
40
+
41
+ These feed the canonical **Pre-PR quality gates** below.
42
+
43
+ ## What to change (and where)
44
+ - Add/update indicator logic in the relevant Rust module under `src/`.
45
+ - Keep API exposure and types consistent through `src/lib.rs`.
46
+ - Add/adjust Python tests in matching files under `tests/`.
47
+ - Update docs (`README.md`) and the changelog when behavior or API changes (see **Changelog coupling**).
48
+ - Touching an indicator module (`src/*_indicators.rs`, `src/chart_trends.rs`, `src/moving_average.rs`, …) also requires running the companion benchmark — see `ai-policy.yaml` and `CONTRIBUTING.md`.
49
+
50
+ ## Coding expectations
51
+ - Preserve the existing **bulk/single** API pattern for indicators.
52
+ - Prefer small, focused diffs over large refactors.
53
+ - Keep naming and argument conventions consistent with neighboring functions.
54
+ - Surface all errors to Python as `PyValueError`, with clear, user-facing messages for invalid inputs.
55
+
56
+ ## Change scope discipline
57
+ - Keep changes minimal and focused on the requested task.
58
+ - Do not include opportunistic refactors unless explicitly requested.
59
+ - If you identify unrelated issues, note them separately instead of bundling them into the same change.
60
+ - Preserve existing file organization and naming conventions unless the task requires a structural change.
61
+ - **Stage only the files the task names; never `git add .`.** Never commit untracked planning/scratch docs (`PLAN.md`, `*_BRIEF.md`, `RESUME.md`).
62
+ - Never hand-edit generated artifacts or test expectations to make a gate pass — `Cargo.lock` is regenerated by the build, and a test value that needs changing is a signal to **stop and report**, not to edit the expectation.
63
+
64
+ ## Backward compatibility rules
65
+ When changing public Python APIs, preserve compatibility unless the task explicitly allows a breaking change:
66
+
67
+ 1. Do not silently change indicator semantics, output ordering, or warmup behavior.
68
+ 2. Do not remove or rename public functions, types, enums, or parameters without explicit approval.
69
+ 3. If behavior changes are required, document them in docstrings and `CHANGELOG.md` with clear migration notes.
70
+
71
+ ## Branch & commit conventions
72
+ - **Branches:** cut every branch off the latest `origin/main`; never commit on `main`. Name them `<type>/<kebab-slug>`, where `<type>` is a conventional-commit type (`feat`, `fix`, `chore`, `docs`, `ci`, `test`, `style`, `refactor`, `perf`) — e.g. `chore/bump-cti-1.3.0`, `docs/string-aliases`, `ci/add-fmt-check`. First push is `git push -u origin <branch>`.
73
+ - **Commit subjects:** use a conventional-commit prefix (`feat:`, `fix:`, `chore:`, `docs:`, `ci:`, `test:`, `style:`, …), under 72 characters.
74
+ - **Trailer:** end every commit authored with Claude Code with:
75
+ ```text
76
+ Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
77
+ ```
78
+ This is the canonical trailer for Claude-authored commits; existing lowercase `Co-authored-by:` lines for human or bot co-authors are unaffected.
79
+
80
+ ## Pre-PR quality gates (must pass)
81
+ Run all three inside the repo's `.venv` (the `maturin`/`pytest` binaries are not on `PATH`), in order — `pytest` only passes after a successful `maturin develop`:
82
+
83
+ 1. `maturin develop` — bindings compile and install into the active venv
84
+ 2. `python -m pytest` — all tests pass (the pass signal is the `N passed` line; paste it into the PR)
85
+ 3. `cargo fmt --all -- --check` — no formatting diffs
86
+
87
+ Notes:
88
+ - **clippy is intentionally parked** — do not add a clippy gate without maintainer approval.
89
+ - CI enforces all three gates: `.github/workflows/CI.yml`'s `verify` job runs `cargo fmt --all -- --check` (first), then `maturin develop --release` and `python -m pytest`; `python-package.yml` runs the pytest matrix across Python versions. `cargo fmt` is a CI gate, not local-only. If tests are skipped for environmental reasons, say why.
90
+
91
+ ## Stop-and-report
92
+ Stop and report — do not work around, guess, or paper over — when:
93
+ - a pre-PR gate fails unexpectedly, or a test expectation shifts in a way you can't explain;
94
+ - `cargo fmt` produces a change you can't explain as pure formatting (e.g. an rustfmt version skew);
95
+ - the brief or instructions conflict with the repo's actual state.
96
+
97
+ Surface drift between docs and code rather than silently fixing it. Treat governing docs — CI workflows, licensing, security, and contributor-governance files (`CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `SECURITY.md`) — as read-only unless the task explicitly authorizes editing them.
98
+
99
+ ## Worktree & isolation
100
+ For parallel or batched work (e.g. running multiple slice briefs):
101
+ - one task per git worktree, cut off fresh `origin/main`;
102
+ - **each worktree gets its own `.venv`** — a shared venv's installed extension gets clobbered by concurrent `maturin develop` runs;
103
+ - when two batches touch the same files, rebase the later one on its predecessor before merge;
104
+ - PRs target `main`; there is no separate long-lived integration branch (the release cut promotes `## [Unreleased]` to the next version).
105
+
106
+ ## Changelog coupling
107
+ - Every **user-facing** change adds an entry under the existing `## [Unreleased]` heading in `CHANGELOG.md`, using Keep a Changelog categories (Added / Changed / Deprecated / Removed / Fixed / Security). Do not add a second `[Unreleased]` heading or hand-cut a version header in a feature branch — the release cut promotes `[Unreleased]` to the next version.
108
+ - **Exception:** formatting-only or otherwise non-user-facing changes (e.g. a `cargo fmt` baseline, or docs such as this file) get **no** changelog entry.
109
+
110
+ ## CI implementation policy
111
+ - Prefer native Python/maturin/cargo commands in workflows.
112
+ - Do not introduce third-party GitHub Actions unless explicitly approved by maintainers.
113
+
114
+ ## Core-crate version & source of truth
115
+ - The binding wraps the published crates.io crate `centaur_technical_indicators`; that core-crate version is the source of truth, and `[package] version` in `Cargo.toml` is normally bumped to match it (see `docs/REPO_MAP.md` for the full rule).
116
+ - Current in-flight state on `main`: the dependency is pinned to `1.3.0` while `[package] version` is intentionally held at `1.2.2` until the release cut — deferred deliberately, not forgotten.
117
+
118
+ ## Pull request checklist for agents
119
+ - [ ] Scope is minimal and matches the task; only the named files changed.
120
+ - [ ] Rust bindings compile (`maturin develop`).
121
+ - [ ] Tests pass (or skips are documented).
122
+ - [ ] `cargo fmt --all -- --check` clean.
123
+ - [ ] Changelog updated under `## [Unreleased]` (or exempt — see Changelog coupling).
124
+ - [ ] Commit message uses a conventional prefix and the Co-Authored-By trailer.
125
+ - [ ] AI assistance disclosed in the PR description (per `CONTRIBUTING.md`).
126
+
127
+ ## Required PR summary format
128
+ Use this structure in the PR description (mirrors `.github/pull_request_template.md`):
129
+
130
+ 1. **Summary** — what changed and why.
131
+ 2. **Scope** — files/modules touched, and what was intentionally left untouched.
132
+ 3. **Compatibility** — user-facing behavior/API impact, or explicit "N/A".
133
+ 4. **Validation** — paste the actual gate output (`maturin develop`, the pytest `N passed` line, `cargo fmt --all -- --check`).
134
+ 5. **Changelog** — the exact `CHANGELOG.md` entry added/updated (or "exempt — non-user-facing").
135
+
136
+ Also note anything **flagged** — out-of-scope issues noticed, surprises, or blockers — and disclose AI assistance (per `CONTRIBUTING.md`).
137
+
138
+ ## Repository expectations
139
+ - This is a public Python/Rust library. Prioritize correctness, determinism, and backward compatibility.
140
+ - Prefer minimal, focused diffs over broad refactors.
141
+ - Do not add new dependencies unless explicitly requested.
142
+ - Treat public APIs, documented behavior, and examples as stability-sensitive.
143
+
144
+ ## Review guidelines
145
+ - Flag breaking API changes.
146
+ - Flag silent behavior changes in indicator calculations or defaults.
147
+ - Flag documentation drift when public behavior changes.
148
+ - Flag unnecessary allocations or obvious performance regressions in hot paths.
149
+
150
+ ## Change boundaries
151
+ - Do not modify CI, licensing, security, or contributor-governance files unless explicitly requested.
152
+ - Keep unrelated formatting churn to a minimum.
@@ -6,7 +6,42 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
 
7
7
  ---
8
8
 
9
- ## [Unreleased]
9
+ ## [1.3.0] - 2026-06-20
10
+
11
+ ### Fixed
12
+ - Incorrect `Documentation` URL in package metadata (pointed at the GitHub wiki).
13
+ - README quick-start example called `cti.moving_average(...)` (a submodule, not callable)
14
+ instead of `cti.moving_average.single.moving_average(...)`.
15
+ - Docstring keyword-name mismatches that could raise `TypeError` (`supertrend`
16
+ `constant_type_model` → `constant_model_type`; `true_range` `previous_close` → `close`).
17
+ - README "Available Indicators" / "Library Structure" drift and benchmark-vs-list inconsistency.
18
+ - Inherited Rust 1.3.0 behavior changes, now user-visible through the bindings:
19
+ `chart_trends.peaks` / `chart_trends.valleys` corrected for index-0 and
20
+ retained-after-monotonic-run extrema; and `aroon_up` / `aroon_down` /
21
+ `stochastic_oscillator` return `NaN` instead of panicking on all-NaN input.
22
+
23
+ ### Added
24
+ - Python regression tests for inherited Rust 1.3.0 chart-trend / degenerate-input fixes.
25
+ - `chart_trends.peak_favorable_move` and `chart_trends.valley_favorable_move` bindings (maximum
26
+ favorable excursion over a forward window), mirroring Rust 1.3.0.
27
+ - `cargo fmt --check` step to CI (the `verify` job in `CI.yml`).
28
+ - `docs/2.0.0.md` breaking-change backlog.
29
+ - Tests pinning accepted model-type / deviation-model / moving-average-type string aliases.
30
+ - Documentation of the full accepted string-alias set for each regime (incl. the `sma`→Smoothed
31
+ / `ma`→Simple aliases), with `from_string` error messages reconciled to match.
32
+ - README scope note: statistical primitives (the Rust `basic_indicators` surface) are
33
+ intentionally not re-bound.
34
+ - Type stubs (`.pyi`) and a `py.typed` marker (PEP 561 inline typing) for the full API surface.
35
+ - `__version__` on the top-level package, resolved via `importlib.metadata`.
36
+ - Mixed package layout with a hand-authored `__init__.py` (adopts maturin `python-source`).
37
+
38
+ ### Changed
39
+ - Updated `centaur_technical_indicators` Rust crate dependency from `1.2.2` to `1.3.0`.
40
+ - Expanded PyPI classifiers to declare Python 3.10–3.14.
41
+ - Updated ecosystem naming from "Centaur Capital" to "CRT (Centaur Research & Technologies)"
42
+ and the legacy `centaurlabs.pages.dev` documentation link.
43
+ - Adjusted the indicator-count claim from "60+" to "50+".
44
+ - Exclude internal `docs/` from the source distribution (sdist).
10
45
 
11
46
  ## [1.2.2] - 2026-04-04
12
47
 
@@ -0,0 +1,21 @@
1
+ # CLAUDE.md
2
+
3
+ Claude Code operating notes for this repo. **[`AGENTS.md`](AGENTS.md) is
4
+ canonical** for every standing convention — pre-PR gates, branch/commit format,
5
+ PR shape, scope discipline, stop-and-report, changelog coupling, and worktree
6
+ isolation. This file adds only the Claude-Code-facing bits for running a slice; it
7
+ does not repeat `AGENTS.md`.
8
+
9
+ ## Running a slice
10
+ - Work is organized as slice briefs (`S*_BRIEF.md`) tracked by `PLAN.md`. `PLAN.md` is the planning channel — implement against the briefs; do not edit `PLAN.md`.
11
+ - Read order at session start: the slice brief (it is self-contained) → `AGENTS.md` (standing conventions). You don't need to read `PLAN.md` to execute a self-contained brief.
12
+ - **One slice per session**, in its **own git worktree with its own `.venv`** (per `AGENTS.md` → Worktree & isolation).
13
+
14
+ ## Effort
15
+ Set the session effort from the brief's `Effort:` line (`low` / `medium` / `high`) with `/effort <level>`.
16
+
17
+ ## Plan before auto-editing
18
+ For a non-trivial slice, plan before editing — use plan mode before auto-applying changes. Honor the stop-and-report rule in `AGENTS.md`: when a gate fails unexpectedly or a test value shifts, stop and report rather than working around it.
19
+
20
+ ## Running the gates
21
+ Inside the worktree's `.venv`: `maturin develop` → `python -m pytest` (pass signal `N passed`) → `cargo fmt --all -- --check`. Full gate definitions and the CI-divergence note live in `AGENTS.md`.
@@ -10,17 +10,17 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
10
10
 
11
11
  [[package]]
12
12
  name = "centaur_technical_indicators"
13
- version = "1.2.2"
13
+ version = "1.3.0"
14
14
  dependencies = [
15
- "centaur_technical_indicators 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
15
+ "centaur_technical_indicators 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
16
16
  "pyo3",
17
17
  ]
18
18
 
19
19
  [[package]]
20
20
  name = "centaur_technical_indicators"
21
- version = "1.2.2"
21
+ version = "1.3.0"
22
22
  source = "registry+https://github.com/rust-lang/crates.io-index"
23
- checksum = "24ae4cb5750fab3c9d2ae9be158158df08bb4b052c6e5c398885be57e0590be9"
23
+ checksum = "41f1d42ebb4f20df394539be4afd1a21f69a6f18c7ab9ae3a8eaeac7929e1bfb"
24
24
 
25
25
  [[package]]
26
26
  name = "heck"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "centaur_technical_indicators"
3
- version = "1.2.2"
3
+ version = "1.3.0"
4
4
  edition = "2021"
5
5
  readme = "README.md"
6
6
 
@@ -11,4 +11,4 @@ crate-type = ["cdylib"]
11
11
 
12
12
  [dependencies]
13
13
  pyo3 = "0.25.0"
14
- centaur_technical_indicators = "1.2.2"
14
+ centaur_technical_indicators = "1.3.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: centaur_technical_indicators
3
- Version: 1.2.2
3
+ Version: 1.3.0
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: Intended Audience :: Financial and Insurance Industry
6
6
  Classifier: Topic :: Software Development :: Libraries
@@ -8,14 +8,19 @@ Classifier: Topic :: Office/Business :: Financial :: Investment
8
8
  Classifier: License :: OSI Approved :: MIT License
9
9
  Classifier: Programming Language :: Rust
10
10
  Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
11
16
  License-File: LICENSE-MIT
12
- Summary: A collection of 60+ fully configurable technical indicators for financial analysis, powered by Rust and Python. Part of the Centaur Capital ecosystem.
17
+ Summary: A collection of 50+ fully configurable technical indicators for financial analysis, powered by Rust and Python. Part of the CRT (Centaur Research & Technologies) ecosystem.
13
18
  Keywords: finance,technical indicators,analysis,trading,python,rust,quantitative
14
19
  Author-email: ChironMind <your@email.com>
15
20
  Maintainer-email: ChironMind <your@email.com>
16
21
  Requires-Python: >=3.10
17
22
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
18
- Project-URL: Documentation, https://github.com/chironmind/CentaurTechnicalIndicators-Python/wiki
23
+ Project-URL: Documentation, https://centaurtechnicalindicators-python.readthedocs.io/en/latest/
19
24
  Project-URL: Homepage, https://github.com/chironmind/CentaurTechnicalIndicators-Python
20
25
  Project-URL: Issues, https://github.com/chironmind/CentaurTechnicalIndicators-Python/issues
21
26
  Project-URL: Source, https://github.com/chironmind/CentaurTechnicalIndicators-Python
@@ -33,9 +38,9 @@ Project-URL: Source, https://github.com/chironmind/CentaurTechnicalIndicators-Py
33
38
 
34
39
  # Centaur Technical Indicators
35
40
 
36
- A production-ready Python library providing 60+ technical indicators for financial analysis, built on a high-performance Rust backend.
41
+ A production-ready Python library providing 50+ technical indicators for financial analysis, built on a high-performance Rust backend.
37
42
 
38
- Part of the Centaur Capital ecosystem.
43
+ Part of the CRT (Centaur Research & Technologies) ecosystem.
39
44
 
40
45
  Looking for the Rust crate? See: [ChironMind/CentaurTechnicalIndicators-Rust](https://github.com/ChironMind/CentaurTechnicalIndicators-Rust)
41
46
 
@@ -58,7 +63,7 @@ import centaur_technical_indicators as cti
58
63
 
59
64
  prices = [100.2, 100.46, 100.53, 100.38, 100.19]
60
65
 
61
- ma = cti.moving_average(
66
+ ma = cti.moving_average.single.moving_average(
62
67
  prices,
63
68
  "simple"
64
69
  )
@@ -116,9 +121,14 @@ $ pytest .
116
121
  ### Library Structure
117
122
 
118
123
  - Modules based on their analysis areas (**`moving_average`**, **`momentum_indicators`**, **`strength_indicators`**...)
119
- - `bulk` & `single` function variants
124
+ - Most modules have both `bulk` and `single` sub-modules:
120
125
  - `bulk`: Compute indicator over rolling periods, returns a list.
121
126
  - `single`: Compute indicator for the entire list, returns a single value.
127
+ - **Exceptions (asymmetric shape):**
128
+ - `chart_trends` — flat module (no `single`/`bulk` sub-modules; functions are top-level).
129
+ - `volatility_indicators` — `volatility_system` is `bulk` only; `ulcer_index` has both.
130
+ - `other_indicators`, `strength_indicators`, and `trend_indicators` are asymmetric (not every
131
+ indicator has both variants).
122
132
  - `types` used to personalise the technical indicators (**`moving_average_type`**, **`deviation_model`**, **`constant_model_type`**...)
123
133
 
124
134
  ---
@@ -138,29 +148,32 @@ $ pytest .
138
148
 
139
149
  ## 📈 Available Indicators
140
150
 
141
- All indicators are grouped and split into modules based on their analysis area.
142
- Each module has `bulk` (list output) and `single` (scalar output) functions.
151
+ All indicators are grouped and split into modules based on their analysis area.
143
152
 
144
153
  ### Candle Indicators
145
- - Ichimoku Cloud, Moving Constant Bands/Envelopes, Donchian Channels, Keltner, Supertrend
154
+ - Ichimoku Cloud, Moving Constant Bands/Envelopes, Donchian Channels, Keltner, Supertrend,
155
+ McGinley Dynamic Envelopes, McGinley Dynamic Bands
146
156
 
147
157
  ### Chart Trends
148
- - Trend break down, overall trends, peak/valley trends
158
+ - Trend break down, overall trends, peak/valley trends, peak favorable move, valley favorable move
149
159
 
150
160
  ### Correlation Indicators
151
161
  - Correlate asset prices
152
162
 
153
163
  ### Momentum Indicators
154
- - Chaikin Oscillator, CCI, MACD, Money Flow Index, On Balance Volume, ROC, RSI, Williams %R
164
+ - Chaikin Oscillator, CCI, MACD, Money Flow Index, On Balance Volume, ROC, RSI, Williams %R,
165
+ Stochastic Oscillator, Slow Stochastic, Slowest Stochastic, Percentage Price Oscillator (PPO),
166
+ Chande Momentum Oscillator (CMO), Signal Line (MACD signal),
167
+ McGinley Dynamic Commodity Channel Index, McGinley Dynamic MACD Line
155
168
 
156
169
  ### Moving Averages
157
170
  - McGinley Dynamic, Moving Average
158
171
 
159
172
  ### Other Indicators
160
- - ROI, True Range, ATR, Internal Bar Strength
173
+ - ROI, True Range, ATR, Internal Bar Strength, Positivity Indicator
161
174
 
162
175
  ### Strength Indicators
163
- - Accumulation/Distribution, PVI, NVI, RVI
176
+ - Accumulation/Distribution, PVI, NVI, RVI, Volume Index
164
177
 
165
178
  ### Trend Indicators
166
179
  - Aroon (Up/Down/Oscillator), Parabolic, DM, Volume-Price Trend, TSI
@@ -168,6 +181,10 @@ Each module has `bulk` (list output) and `single` (scalar output) functions.
168
181
  ### Volatility Indicators
169
182
  - Ulcer Index, Volatility System
170
183
 
184
+ **Note on scope:** Statistical primitives available in Python's `statistics` / `math` modules
185
+ (the Rust `basic_indicators` surface) are intentionally not re-bound. Use the standard library
186
+ directly for those.
187
+
171
188
  ---
172
189
 
173
190
  ## 📊 Performance Benchmarks
@@ -248,7 +265,7 @@ This repository is part of a structured documentation suite:
248
265
  - 📕 **Tutorials:** — [See here](https://centaurtechnicalindicators-python.readthedocs.io/en/latest/tutorials/)
249
266
  - 📘 **How-To Guides:** — [See here](https://centaurtechnicalindicators-python.readthedocs.io/en/latest/howto/)
250
267
  - ⏱️ **Benchmarks:** — [See here](https://centaurtechnicalindicators-python.readthedocs.io/en/latest/benchmarks/)
251
- - 📙 **Explanations:** — [centaurlabs.pages.dev/](https://centaurlabs.pages.dev/)
268
+ - 📙 **Explanations:** — [tech.centaurresearchtechnologies.com](https://tech.centaurresearchtechnologies.com/)
252
269
  - 📗 **Reference:** — [See here](https://centaurtechnicalindicators-python.readthedocs.io/en/latest/api/)
253
270
 
254
271
  ---
@@ -11,9 +11,9 @@
11
11
 
12
12
  # Centaur Technical Indicators
13
13
 
14
- A production-ready Python library providing 60+ technical indicators for financial analysis, built on a high-performance Rust backend.
14
+ A production-ready Python library providing 50+ technical indicators for financial analysis, built on a high-performance Rust backend.
15
15
 
16
- Part of the Centaur Capital ecosystem.
16
+ Part of the CRT (Centaur Research & Technologies) ecosystem.
17
17
 
18
18
  Looking for the Rust crate? See: [ChironMind/CentaurTechnicalIndicators-Rust](https://github.com/ChironMind/CentaurTechnicalIndicators-Rust)
19
19
 
@@ -36,7 +36,7 @@ import centaur_technical_indicators as cti
36
36
 
37
37
  prices = [100.2, 100.46, 100.53, 100.38, 100.19]
38
38
 
39
- ma = cti.moving_average(
39
+ ma = cti.moving_average.single.moving_average(
40
40
  prices,
41
41
  "simple"
42
42
  )
@@ -94,9 +94,14 @@ $ pytest .
94
94
  ### Library Structure
95
95
 
96
96
  - Modules based on their analysis areas (**`moving_average`**, **`momentum_indicators`**, **`strength_indicators`**...)
97
- - `bulk` & `single` function variants
97
+ - Most modules have both `bulk` and `single` sub-modules:
98
98
  - `bulk`: Compute indicator over rolling periods, returns a list.
99
99
  - `single`: Compute indicator for the entire list, returns a single value.
100
+ - **Exceptions (asymmetric shape):**
101
+ - `chart_trends` — flat module (no `single`/`bulk` sub-modules; functions are top-level).
102
+ - `volatility_indicators` — `volatility_system` is `bulk` only; `ulcer_index` has both.
103
+ - `other_indicators`, `strength_indicators`, and `trend_indicators` are asymmetric (not every
104
+ indicator has both variants).
100
105
  - `types` used to personalise the technical indicators (**`moving_average_type`**, **`deviation_model`**, **`constant_model_type`**...)
101
106
 
102
107
  ---
@@ -116,29 +121,32 @@ $ pytest .
116
121
 
117
122
  ## 📈 Available Indicators
118
123
 
119
- All indicators are grouped and split into modules based on their analysis area.
120
- Each module has `bulk` (list output) and `single` (scalar output) functions.
124
+ All indicators are grouped and split into modules based on their analysis area.
121
125
 
122
126
  ### Candle Indicators
123
- - Ichimoku Cloud, Moving Constant Bands/Envelopes, Donchian Channels, Keltner, Supertrend
127
+ - Ichimoku Cloud, Moving Constant Bands/Envelopes, Donchian Channels, Keltner, Supertrend,
128
+ McGinley Dynamic Envelopes, McGinley Dynamic Bands
124
129
 
125
130
  ### Chart Trends
126
- - Trend break down, overall trends, peak/valley trends
131
+ - Trend break down, overall trends, peak/valley trends, peak favorable move, valley favorable move
127
132
 
128
133
  ### Correlation Indicators
129
134
  - Correlate asset prices
130
135
 
131
136
  ### Momentum Indicators
132
- - Chaikin Oscillator, CCI, MACD, Money Flow Index, On Balance Volume, ROC, RSI, Williams %R
137
+ - Chaikin Oscillator, CCI, MACD, Money Flow Index, On Balance Volume, ROC, RSI, Williams %R,
138
+ Stochastic Oscillator, Slow Stochastic, Slowest Stochastic, Percentage Price Oscillator (PPO),
139
+ Chande Momentum Oscillator (CMO), Signal Line (MACD signal),
140
+ McGinley Dynamic Commodity Channel Index, McGinley Dynamic MACD Line
133
141
 
134
142
  ### Moving Averages
135
143
  - McGinley Dynamic, Moving Average
136
144
 
137
145
  ### Other Indicators
138
- - ROI, True Range, ATR, Internal Bar Strength
146
+ - ROI, True Range, ATR, Internal Bar Strength, Positivity Indicator
139
147
 
140
148
  ### Strength Indicators
141
- - Accumulation/Distribution, PVI, NVI, RVI
149
+ - Accumulation/Distribution, PVI, NVI, RVI, Volume Index
142
150
 
143
151
  ### Trend Indicators
144
152
  - Aroon (Up/Down/Oscillator), Parabolic, DM, Volume-Price Trend, TSI
@@ -146,6 +154,10 @@ Each module has `bulk` (list output) and `single` (scalar output) functions.
146
154
  ### Volatility Indicators
147
155
  - Ulcer Index, Volatility System
148
156
 
157
+ **Note on scope:** Statistical primitives available in Python's `statistics` / `math` modules
158
+ (the Rust `basic_indicators` surface) are intentionally not re-bound. Use the standard library
159
+ directly for those.
160
+
149
161
  ---
150
162
 
151
163
  ## 📊 Performance Benchmarks
@@ -226,7 +238,7 @@ This repository is part of a structured documentation suite:
226
238
  - 📕 **Tutorials:** — [See here](https://centaurtechnicalindicators-python.readthedocs.io/en/latest/tutorials/)
227
239
  - 📘 **How-To Guides:** — [See here](https://centaurtechnicalindicators-python.readthedocs.io/en/latest/howto/)
228
240
  - ⏱️ **Benchmarks:** — [See here](https://centaurtechnicalindicators-python.readthedocs.io/en/latest/benchmarks/)
229
- - 📙 **Explanations:** — [centaurlabs.pages.dev/](https://centaurlabs.pages.dev/)
241
+ - 📙 **Explanations:** — [tech.centaurresearchtechnologies.com](https://tech.centaurresearchtechnologies.com/)
230
242
  - 📗 **Reference:** — [See here](https://centaurtechnicalindicators-python.readthedocs.io/en/latest/api/)
231
243
 
232
244
  ---
@@ -39,6 +39,7 @@ coding_rules:
39
39
  pr_report:
40
40
  required_sections:
41
41
  - Summary
42
+ - Scope
42
43
  - Compatibility
43
44
  - Validation
44
45
  - Changelog
@@ -5,7 +5,7 @@ build-backend = "maturin"
5
5
  [project]
6
6
  name = "centaur_technical_indicators"
7
7
  requires-python = ">=3.10"
8
- description = "A collection of 60+ fully configurable technical indicators for financial analysis, powered by Rust and Python. Part of the Centaur Capital ecosystem."
8
+ description = "A collection of 50+ fully configurable technical indicators for financial analysis, powered by Rust and Python. Part of the CRT (Centaur Research & Technologies) ecosystem."
9
9
  readme = "README.md"
10
10
  authors = [
11
11
  { name="ChironMind", email="your@email.com" }
@@ -23,14 +23,21 @@ classifiers = [
23
23
  "License :: OSI Approved :: MIT License",
24
24
  "Programming Language :: Rust",
25
25
  "Programming Language :: Python :: 3",
26
+ "Programming Language :: Python :: 3.10",
27
+ "Programming Language :: Python :: 3.11",
28
+ "Programming Language :: Python :: 3.12",
29
+ "Programming Language :: Python :: 3.13",
30
+ "Programming Language :: Python :: 3.14",
26
31
  ]
27
32
  dynamic = ["version"]
28
33
 
29
34
  [project.urls]
30
35
  "Homepage" = "https://github.com/chironmind/CentaurTechnicalIndicators-Python"
31
- "Documentation" = "https://github.com/chironmind/CentaurTechnicalIndicators-Python/wiki"
36
+ "Documentation" = "https://centaurtechnicalindicators-python.readthedocs.io/en/latest/"
32
37
  "Source" = "https://github.com/chironmind/CentaurTechnicalIndicators-Python"
33
38
  "Issues" = "https://github.com/chironmind/CentaurTechnicalIndicators-Python/issues"
34
39
 
35
40
  [tool.maturin]
36
41
  features = ["pyo3/extension-module"]
42
+ python-source = "python"
43
+ exclude = [{ path = "docs/**/*", format = "sdist" }]
@@ -0,0 +1,35 @@
1
+ from .centaur_technical_indicators import *
2
+ from . import centaur_technical_indicators as _ext
3
+
4
+ __doc__ = _ext.__doc__
5
+ if hasattr(_ext, "__all__"):
6
+ __all__ = list(_ext.__all__)
7
+
8
+ # Register the compiled submodules under their qualified package names so the
9
+ # submodule import paths advertised by the .pyi stubs also work at runtime, e.g.
10
+ # `import centaur_technical_indicators.momentum_indicators` and
11
+ # `from centaur_technical_indicators.momentum_indicators import single`.
12
+ # (`from .<ext> import *` above only binds them as attributes of this package.)
13
+ import sys as _sys
14
+ import types as _types
15
+
16
+
17
+ def _register_submodules() -> None:
18
+ g = globals()
19
+ for _name in g.get("__all__", ()):
20
+ _sub = g.get(_name)
21
+ if isinstance(_sub, _types.ModuleType):
22
+ _sys.modules.setdefault(__name__ + "." + _name, _sub)
23
+
24
+
25
+ _register_submodules()
26
+ del _register_submodules, _sys, _types
27
+
28
+ from importlib.metadata import version as _version, PackageNotFoundError as _PNFE
29
+
30
+ try:
31
+ __version__ = _version("centaur_technical_indicators")
32
+ except _PNFE: # source tree without installed dist-info
33
+ __version__ = "0.0.0+unknown"
34
+
35
+ del _ext, _version, _PNFE
@@ -0,0 +1,16 @@
1
+ # Type stubs for the centaur_technical_indicators package.
2
+
3
+ from . import (
4
+ candle_indicators as candle_indicators,
5
+ chart_trends as chart_trends,
6
+ correlation_indicators as correlation_indicators,
7
+ momentum_indicators as momentum_indicators,
8
+ moving_average as moving_average,
9
+ other_indicators as other_indicators,
10
+ strength_indicators as strength_indicators,
11
+ trend_indicators as trend_indicators,
12
+ volatility_indicators as volatility_indicators,
13
+ )
14
+
15
+ __version__: str
16
+ __all__: list[str]
@@ -0,0 +1,39 @@
1
+ # Type stubs for centaur_technical_indicators.candle_indicators
2
+ # Auto-generated from the Rust binding signatures; keep in sync with src/candle_indicators.rs.
3
+
4
+ class single:
5
+ @staticmethod
6
+ def donchian_channels(high: list[float], low: list[float]) -> tuple[float, float, float]: ...
7
+ @staticmethod
8
+ def ichimoku_cloud(highs: list[float], lows: list[float], close: list[float], conversion_period: int, base_period: int, span_b_period: int) -> tuple[float, float, float, float, float]: ...
9
+ @staticmethod
10
+ def keltner_channel(high: list[float], low: list[float], close: list[float], constant_model_type: str, atr_constant_model_type: str, multiplier: float) -> tuple[float, float, float]: ...
11
+ @staticmethod
12
+ def mcginley_dynamic_bands(prices: list[float], deviation_model: str, deviation_multiplier: float, previous_mcginley_dynamic: float) -> tuple[float, float, float]: ...
13
+ @staticmethod
14
+ def mcginley_dynamic_envelopes(prices: list[float], difference: float, previous_mcginley_dynamic: float) -> tuple[float, float, float]: ...
15
+ @staticmethod
16
+ def moving_constant_bands(prices: list[float], constant_model_type: str, deviation_model: str, deviation_multiplier: float) -> tuple[float, float, float]: ...
17
+ @staticmethod
18
+ def moving_constant_envelopes(prices: list[float], constant_model_type: str, difference: float) -> tuple[float, float, float]: ...
19
+ @staticmethod
20
+ def supertrend(high: list[float], low: list[float], close: list[float], constant_model_type: str, multiplier: float) -> float: ...
21
+
22
+ class bulk:
23
+ @staticmethod
24
+ def donchian_channels(high: list[float], low: list[float], period: int) -> list[tuple[float, float, float]]: ...
25
+ @staticmethod
26
+ def ichimoku_cloud(highs: list[float], lows: list[float], close: list[float], conversion_period: int, base_period: int, span_b_period: int) -> list[tuple[float, float, float, float, float]]: ...
27
+ @staticmethod
28
+ def keltner_channel(high: list[float], low: list[float], close: list[float], constant_model_type: str, atr_constant_model_type: str, multiplier: float, period: int) -> list[tuple[float, float, float]]: ...
29
+ @staticmethod
30
+ def mcginley_dynamic_bands(prices: list[float], deviation_model: str, deviation_multiplier: float, previous_mcginley_dynamic: float, period: int) -> list[tuple[float, float, float]]: ...
31
+ @staticmethod
32
+ def mcginley_dynamic_envelopes(prices: list[float], difference: float, previous_mcginley_dynamic: float, period: int) -> list[tuple[float, float, float]]: ...
33
+ @staticmethod
34
+ def moving_constant_bands(prices: list[float], constant_model_type: str, deviation_model: str, deviation_multiplier: float, period: int) -> list[tuple[float, float, float]]: ...
35
+ @staticmethod
36
+ def moving_constant_envelopes(prices: list[float], constant_model_type: str, difference: float, period: int) -> list[tuple[float, float, float]]: ...
37
+ @staticmethod
38
+ def supertrend(high: list[float], low: list[float], close: list[float], constant_model_type: str, multiplier: float, period: int) -> list[float]: ...
39
+