centaur_technical_indicators 1.0.1__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.
- centaur_technical_indicators-1.0.1/.github/CODEOWNERS +1 -0
- centaur_technical_indicators-1.0.1/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- centaur_technical_indicators-1.0.1/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- centaur_technical_indicators-1.0.1/.github/copilot-instructions.md +185 -0
- centaur_technical_indicators-1.0.1/.github/workflows/CI.yml +183 -0
- centaur_technical_indicators-1.0.1/.github/workflows/python-package.yml +28 -0
- centaur_technical_indicators-1.0.1/.gitignore +134 -0
- centaur_technical_indicators-1.0.1/CHANGELOG.md +86 -0
- centaur_technical_indicators-1.0.1/CODE_OF_CONDUCT.md +73 -0
- centaur_technical_indicators-1.0.1/CONTRIBUTING.md +55 -0
- centaur_technical_indicators-1.0.1/Cargo.lock +171 -0
- centaur_technical_indicators-1.0.1/Cargo.toml +14 -0
- centaur_technical_indicators-1.0.1/LICENSE-MIT +24 -0
- centaur_technical_indicators-1.0.1/PKG-INFO +267 -0
- centaur_technical_indicators-1.0.1/README.md +244 -0
- centaur_technical_indicators-1.0.1/SECURITY.md +18 -0
- centaur_technical_indicators-1.0.1/assets/pytechnicalindicators_banner.png +0 -0
- centaur_technical_indicators-1.0.1/pyproject.toml +36 -0
- centaur_technical_indicators-1.0.1/requirements.txt +1 -0
- centaur_technical_indicators-1.0.1/src/candle_indicators.rs +521 -0
- centaur_technical_indicators-1.0.1/src/chart_trends.rs +138 -0
- centaur_technical_indicators-1.0.1/src/correlation_indicators.rs +97 -0
- centaur_technical_indicators-1.0.1/src/lib.rs +194 -0
- centaur_technical_indicators-1.0.1/src/momentum_indicators.rs +840 -0
- centaur_technical_indicators-1.0.1/src/moving_average.rs +115 -0
- centaur_technical_indicators-1.0.1/src/other_indicators.rs +239 -0
- centaur_technical_indicators-1.0.1/src/strength_indicators.rs +241 -0
- centaur_technical_indicators-1.0.1/src/trend_indicators.rs +408 -0
- centaur_technical_indicators-1.0.1/src/volatility_indicators.rs +89 -0
- centaur_technical_indicators-1.0.1/test_requirements.txt +6 -0
- centaur_technical_indicators-1.0.1/tests/test_candle_indicators.py +165 -0
- centaur_technical_indicators-1.0.1/tests/test_chart_trends.py +58 -0
- centaur_technical_indicators-1.0.1/tests/test_correlation_indicators.py +64 -0
- centaur_technical_indicators-1.0.1/tests/test_momentum_indicators.py +273 -0
- centaur_technical_indicators-1.0.1/tests/test_moving_average.py +45 -0
- centaur_technical_indicators-1.0.1/tests/test_other_indicators.py +75 -0
- centaur_technical_indicators-1.0.1/tests/test_strength_indicators.py +64 -0
- centaur_technical_indicators-1.0.1/tests/test_trend_indicators.py +106 -0
- centaur_technical_indicators-1.0.1/tests/test_volatility_indicators.py +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @chironmind
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Create a report to help us improve
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Describe the bug**
|
|
11
|
+
A clear and concise description of what the bug is.
|
|
12
|
+
|
|
13
|
+
**To Reproduce**
|
|
14
|
+
Steps to reproduce the behavior:
|
|
15
|
+
1. Go to '...'
|
|
16
|
+
2. Click on '....'
|
|
17
|
+
3. Scroll down to '....'
|
|
18
|
+
4. See error
|
|
19
|
+
|
|
20
|
+
**Expected behavior**
|
|
21
|
+
A clear and concise description of what you expected to happen.
|
|
22
|
+
|
|
23
|
+
**Screenshots**
|
|
24
|
+
If applicable, add screenshots to help explain your problem.
|
|
25
|
+
|
|
26
|
+
**Desktop (please complete the following information):**
|
|
27
|
+
- OS: [e.g. iOS]
|
|
28
|
+
- Browser [e.g. chrome, safari]
|
|
29
|
+
- Version [e.g. 22]
|
|
30
|
+
|
|
31
|
+
**Smartphone (please complete the following information):**
|
|
32
|
+
- Device: [e.g. iPhone6]
|
|
33
|
+
- OS: [e.g. iOS8.1]
|
|
34
|
+
- Browser [e.g. stock browser, safari]
|
|
35
|
+
- Version [e.g. 22]
|
|
36
|
+
|
|
37
|
+
**Additional context**
|
|
38
|
+
Add any other context about the problem here.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for this project
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Is your feature request related to a problem? Please describe.**
|
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
12
|
+
|
|
13
|
+
**Describe the solution you'd like**
|
|
14
|
+
A clear and concise description of what you want to happen.
|
|
15
|
+
|
|
16
|
+
**Describe alternatives you've considered**
|
|
17
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
|
18
|
+
|
|
19
|
+
**Additional context**
|
|
20
|
+
Add any other context or screenshots about the feature request here.
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Copilot Instructions for Centaur Technical Indicators
|
|
2
|
+
|
|
3
|
+
## Repository Overview
|
|
4
|
+
|
|
5
|
+
**Centaur Technical Indicators** is a production-ready Python library providing 60+ technical indicators for financial analysis, built on a high-performance Rust backend. The project uses PyO3 and maturin to create Python bindings for the underlying Rust implementation.
|
|
6
|
+
|
|
7
|
+
**Key Stats:**
|
|
8
|
+
- **Languages:** Rust (backend), Python (bindings/tests)
|
|
9
|
+
- **Build System:** maturin (Rust-Python integration)
|
|
10
|
+
- **Python Support:** 3.10+ (tested through 3.14)
|
|
11
|
+
- **Test Suite:** 107 tests, ~0.31s runtime
|
|
12
|
+
- **License:** MIT
|
|
13
|
+
|
|
14
|
+
## Build Instructions & Validated Commands
|
|
15
|
+
|
|
16
|
+
### Bootstrap & Environment Setup (Required)
|
|
17
|
+
**Always create a virtual environment before building:**
|
|
18
|
+
```bash
|
|
19
|
+
python -m venv .venv
|
|
20
|
+
source .venv/bin/activate
|
|
21
|
+
python -m pip install --upgrade pip
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Install Dependencies (Required)
|
|
25
|
+
```bash
|
|
26
|
+
pip install -r test_requirements.txt
|
|
27
|
+
```
|
|
28
|
+
**Contents:** maturin==1.9.1, pytest==8.4.1, and supporting packages
|
|
29
|
+
|
|
30
|
+
### Build the Project (Required)
|
|
31
|
+
```bash
|
|
32
|
+
maturin develop
|
|
33
|
+
```
|
|
34
|
+
- **Duration:** ~14 seconds for full compilation
|
|
35
|
+
- **Function:** Compiles Rust code and installs Python package in editable mode
|
|
36
|
+
- **Output:** Installs `centaur_technical_indicators` package locally
|
|
37
|
+
|
|
38
|
+
### Run Tests (Validation)
|
|
39
|
+
```bash
|
|
40
|
+
python -m pytest
|
|
41
|
+
```
|
|
42
|
+
- **Expected:** 107 tests pass in ~0.31s
|
|
43
|
+
- **Coverage:** All indicator modules with bulk/single function variants
|
|
44
|
+
|
|
45
|
+
### Format Code (Optional)
|
|
46
|
+
```bash
|
|
47
|
+
cargo fmt --check # Check Rust formatting
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Environment Versions (Reference)
|
|
51
|
+
- **Python:** 3.12.3+
|
|
52
|
+
- **Rust:** 1.89.0+
|
|
53
|
+
- **maturin:** 1.9.1
|
|
54
|
+
|
|
55
|
+
## Project Layout & Architecture
|
|
56
|
+
|
|
57
|
+
### Root Directory Structure
|
|
58
|
+
```
|
|
59
|
+
/
|
|
60
|
+
├── .github/ # Workflows, issue templates, CODEOWNERS
|
|
61
|
+
├── src/ # Rust source modules
|
|
62
|
+
├── tests/ # Python test files (mirror src/ structure)
|
|
63
|
+
├── assets/ # Documentation assets, banner images
|
|
64
|
+
├── pyproject.toml # Python project configuration, maturin settings
|
|
65
|
+
├── Cargo.toml # Rust project configuration, dependencies
|
|
66
|
+
├── requirements.txt # Runtime dependencies (minimal)
|
|
67
|
+
├── test_requirements.txt # Development/test dependencies
|
|
68
|
+
└── README.md # Comprehensive project documentation
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Source Code Architecture (`src/`)
|
|
72
|
+
**Modular Design by Analysis Area:**
|
|
73
|
+
- `lib.rs` - Main module, PyO3 bindings setup, type definitions
|
|
74
|
+
- `candle_indicators.rs` - Ichimoku, Bollinger Bands, Keltner, Supertrend
|
|
75
|
+
- `momentum_indicators.rs` - RSI, MACD, CCI, Williams %R, Stochastic
|
|
76
|
+
- `moving_average.rs` - Simple, Exponential, Smoothed, McGinley Dynamic
|
|
77
|
+
- `standard_indicators.rs` - Basic indicators, moving averages
|
|
78
|
+
- `trend_indicators.rs` - Aroon, Parabolic SAR, DM, TSI
|
|
79
|
+
- `volatility_indicators.rs` - Ulcer Index, Volatility System
|
|
80
|
+
- `strength_indicators.rs` - A/D, PVI, NVI, RVI
|
|
81
|
+
- `chart_trends.rs` - Trend analysis, peak/valley detection
|
|
82
|
+
- `correlation_indicators.rs` - Asset price correlation
|
|
83
|
+
- `other_indicators.rs` - ROI, True Range, ATR
|
|
84
|
+
|
|
85
|
+
### API Design Patterns
|
|
86
|
+
- **Dual Function Variants:** Each indicator has `bulk` (returns list) and `single` (returns scalar) versions
|
|
87
|
+
- **Type System:** Custom enums (`PyConstantModelType`, `DeviationModel`, `MovingAverageType`) for configuration
|
|
88
|
+
- **Error Handling:** Uses `PyValueError` for invalid inputs with descriptive messages
|
|
89
|
+
|
|
90
|
+
### Test Structure (`tests/`)
|
|
91
|
+
- **Naming Convention:** `test_<module_name>.py` mirrors `src/<module_name>.rs`
|
|
92
|
+
- **Purpose:** Binding verification, not exhaustive testing (core logic tested in RustTI)
|
|
93
|
+
- **Pattern:** Basic smoke tests to ensure Python-Rust interface works
|
|
94
|
+
|
|
95
|
+
## CI/CD & Validation Pipelines
|
|
96
|
+
|
|
97
|
+
### GitHub Workflows
|
|
98
|
+
1. **`python-package.yml`** - Pull request validation
|
|
99
|
+
- Tests across Python 3.10-3.14 on Ubuntu
|
|
100
|
+
- Steps: checkout → setup Python → install deps → maturin develop → pytest
|
|
101
|
+
|
|
102
|
+
2. **`CI.yml`** - Release pipeline (maturin-generated)
|
|
103
|
+
- Multi-platform wheel building (Linux, Windows, macOS)
|
|
104
|
+
- Multiple architectures (x86_64, ARM, etc.)
|
|
105
|
+
- Automatic PyPI publication on tags
|
|
106
|
+
|
|
107
|
+
### Pre-commit Validation Steps
|
|
108
|
+
```bash
|
|
109
|
+
# Recommended validation sequence:
|
|
110
|
+
source .venv/bin/activate
|
|
111
|
+
pip install -r test_requirements.txt
|
|
112
|
+
maturin develop
|
|
113
|
+
python -m pytest
|
|
114
|
+
cargo fmt --check # Optional: check Rust formatting
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Development Guidelines
|
|
118
|
+
|
|
119
|
+
### Making Code Changes
|
|
120
|
+
1. **Rust Changes:** Edit files in `src/`, then run `maturin develop` to rebuild
|
|
121
|
+
2. **Python Tests:** Add corresponding tests in `tests/` following existing patterns
|
|
122
|
+
3. **API Consistency:** Maintain `bulk`/`single` function variants for new indicators
|
|
123
|
+
4. **Type Safety:** Use existing enum types or add new ones following the pattern in `lib.rs`
|
|
124
|
+
|
|
125
|
+
### Performance Considerations
|
|
126
|
+
- **Rust Backend:** Core calculations optimized for microsecond-level performance
|
|
127
|
+
- **Bulk vs Single:** Use `bulk` for time series, `single` for latest values
|
|
128
|
+
- **Memory:** Rust handles memory management; Python side is minimal overhead
|
|
129
|
+
|
|
130
|
+
### Dependencies & Updates
|
|
131
|
+
- **Rust Dependencies:** Managed in `Cargo.toml` (pyo3, rust_ti)
|
|
132
|
+
- **Python Dependencies:** Keep `test_requirements.txt` minimal
|
|
133
|
+
- **Version Constraints:** Python 3.10+ required for modern features
|
|
134
|
+
|
|
135
|
+
## Common Workflows & Commands
|
|
136
|
+
|
|
137
|
+
### Complete Development Setup
|
|
138
|
+
```bash
|
|
139
|
+
git clone <repo>
|
|
140
|
+
cd CentaurTechnicalIndicators-Python
|
|
141
|
+
python -m venv .venv
|
|
142
|
+
source .venv/bin/activate
|
|
143
|
+
pip install -r test_requirements.txt
|
|
144
|
+
maturin develop
|
|
145
|
+
python -m pytest
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Iterative Development
|
|
149
|
+
```bash
|
|
150
|
+
# After making Rust changes:
|
|
151
|
+
maturin develop # Rebuild and reinstall
|
|
152
|
+
python -m pytest # Verify no regressions
|
|
153
|
+
|
|
154
|
+
# After making Python test changes:
|
|
155
|
+
python -m pytest # Run updated tests
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Release Preparation
|
|
159
|
+
```bash
|
|
160
|
+
cargo fmt # Format Rust code
|
|
161
|
+
python -m pytest # Ensure all tests pass
|
|
162
|
+
# CI handles wheel building and PyPI publication
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Key Files & Configuration
|
|
166
|
+
|
|
167
|
+
### Build Configuration
|
|
168
|
+
- **`pyproject.toml`:** Python packaging, maturin settings, project metadata
|
|
169
|
+
- **`Cargo.toml`:** Rust compilation, dependencies (pyo3, rust_ti)
|
|
170
|
+
- **`.gitignore`:** Excludes `target/`, `.venv/`, `__pycache__/`, build artifacts
|
|
171
|
+
|
|
172
|
+
### Documentation Resources
|
|
173
|
+
- **`README.md`:** Complete user documentation, examples, API reference
|
|
174
|
+
- **`CONTRIBUTING.md`:** Contribution guidelines, new indicator process
|
|
175
|
+
- **Wiki:** Full API reference and usage examples
|
|
176
|
+
- **External:** Tutorials, benchmarks, and how-to guides in separate repos
|
|
177
|
+
|
|
178
|
+
## Trust These Instructions
|
|
179
|
+
|
|
180
|
+
These instructions are validated and complete. Only perform additional repository exploration if:
|
|
181
|
+
- The build process fails unexpectedly
|
|
182
|
+
- Dependencies have changed significantly
|
|
183
|
+
- New requirements are introduced in documentation
|
|
184
|
+
|
|
185
|
+
The provided build sequence works reliably and efficiently for the current codebase.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# This file is autogenerated by maturin v1.11.5
|
|
2
|
+
# To update, run
|
|
3
|
+
#
|
|
4
|
+
# maturin generate-ci github
|
|
5
|
+
#
|
|
6
|
+
name: CI
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
push:
|
|
10
|
+
branches:
|
|
11
|
+
- main
|
|
12
|
+
- master
|
|
13
|
+
tags:
|
|
14
|
+
- '*'
|
|
15
|
+
pull_request:
|
|
16
|
+
workflow_dispatch:
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
linux:
|
|
23
|
+
runs-on: ${{ matrix.platform.runner }}
|
|
24
|
+
strategy:
|
|
25
|
+
matrix:
|
|
26
|
+
platform:
|
|
27
|
+
- runner: ubuntu-22.04
|
|
28
|
+
target: x86_64
|
|
29
|
+
- runner: ubuntu-22.04
|
|
30
|
+
target: x86
|
|
31
|
+
- runner: ubuntu-22.04
|
|
32
|
+
target: aarch64
|
|
33
|
+
- runner: ubuntu-22.04
|
|
34
|
+
target: armv7
|
|
35
|
+
- runner: ubuntu-22.04
|
|
36
|
+
target: s390x
|
|
37
|
+
- runner: ubuntu-22.04
|
|
38
|
+
target: ppc64le
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v6
|
|
41
|
+
- uses: actions/setup-python@v6
|
|
42
|
+
with:
|
|
43
|
+
python-version: 3.x
|
|
44
|
+
- name: Build wheels
|
|
45
|
+
uses: PyO3/maturin-action@v1
|
|
46
|
+
with:
|
|
47
|
+
target: ${{ matrix.platform.target }}
|
|
48
|
+
args: --release --out dist --find-interpreter
|
|
49
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
50
|
+
manylinux: auto
|
|
51
|
+
- name: Upload wheels
|
|
52
|
+
uses: actions/upload-artifact@v5
|
|
53
|
+
with:
|
|
54
|
+
name: wheels-linux-${{ matrix.platform.target }}
|
|
55
|
+
path: dist
|
|
56
|
+
|
|
57
|
+
musllinux:
|
|
58
|
+
runs-on: ${{ matrix.platform.runner }}
|
|
59
|
+
strategy:
|
|
60
|
+
matrix:
|
|
61
|
+
platform:
|
|
62
|
+
- runner: ubuntu-22.04
|
|
63
|
+
target: x86_64
|
|
64
|
+
- runner: ubuntu-22.04
|
|
65
|
+
target: x86
|
|
66
|
+
- runner: ubuntu-22.04
|
|
67
|
+
target: aarch64
|
|
68
|
+
- runner: ubuntu-22.04
|
|
69
|
+
target: armv7
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v6
|
|
72
|
+
- uses: actions/setup-python@v6
|
|
73
|
+
with:
|
|
74
|
+
python-version: 3.x
|
|
75
|
+
- name: Build wheels
|
|
76
|
+
uses: PyO3/maturin-action@v1
|
|
77
|
+
with:
|
|
78
|
+
target: ${{ matrix.platform.target }}
|
|
79
|
+
args: --release --out dist --find-interpreter
|
|
80
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
81
|
+
manylinux: musllinux_1_2
|
|
82
|
+
- name: Upload wheels
|
|
83
|
+
uses: actions/upload-artifact@v5
|
|
84
|
+
with:
|
|
85
|
+
name: wheels-musllinux-${{ matrix.platform.target }}
|
|
86
|
+
path: dist
|
|
87
|
+
|
|
88
|
+
windows:
|
|
89
|
+
runs-on: ${{ matrix.platform.runner }}
|
|
90
|
+
strategy:
|
|
91
|
+
matrix:
|
|
92
|
+
platform:
|
|
93
|
+
- runner: windows-latest
|
|
94
|
+
target: x64
|
|
95
|
+
python_arch: x64
|
|
96
|
+
- runner: windows-latest
|
|
97
|
+
target: x86
|
|
98
|
+
python_arch: x86
|
|
99
|
+
steps:
|
|
100
|
+
- uses: actions/checkout@v6
|
|
101
|
+
- uses: actions/setup-python@v6
|
|
102
|
+
with:
|
|
103
|
+
python-version: 3.x
|
|
104
|
+
architecture: ${{ matrix.platform.python_arch }}
|
|
105
|
+
- name: Build wheels
|
|
106
|
+
uses: PyO3/maturin-action@v1
|
|
107
|
+
with:
|
|
108
|
+
target: ${{ matrix.platform.target }}
|
|
109
|
+
args: --release --out dist --find-interpreter
|
|
110
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
111
|
+
- name: Upload wheels
|
|
112
|
+
uses: actions/upload-artifact@v5
|
|
113
|
+
with:
|
|
114
|
+
name: wheels-windows-${{ matrix.platform.target }}
|
|
115
|
+
path: dist
|
|
116
|
+
|
|
117
|
+
macos:
|
|
118
|
+
runs-on: ${{ matrix.platform.runner }}
|
|
119
|
+
strategy:
|
|
120
|
+
matrix:
|
|
121
|
+
platform:
|
|
122
|
+
- runner: macos-15-intel
|
|
123
|
+
target: x86_64
|
|
124
|
+
- runner: macos-latest
|
|
125
|
+
target: aarch64
|
|
126
|
+
steps:
|
|
127
|
+
- uses: actions/checkout@v6
|
|
128
|
+
- uses: actions/setup-python@v6
|
|
129
|
+
with:
|
|
130
|
+
python-version: 3.x
|
|
131
|
+
- name: Build wheels
|
|
132
|
+
uses: PyO3/maturin-action@v1
|
|
133
|
+
with:
|
|
134
|
+
target: ${{ matrix.platform.target }}
|
|
135
|
+
args: --release --out dist --find-interpreter
|
|
136
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
137
|
+
- name: Upload wheels
|
|
138
|
+
uses: actions/upload-artifact@v5
|
|
139
|
+
with:
|
|
140
|
+
name: wheels-macos-${{ matrix.platform.target }}
|
|
141
|
+
path: dist
|
|
142
|
+
|
|
143
|
+
sdist:
|
|
144
|
+
runs-on: ubuntu-latest
|
|
145
|
+
steps:
|
|
146
|
+
- uses: actions/checkout@v6
|
|
147
|
+
- name: Build sdist
|
|
148
|
+
uses: PyO3/maturin-action@v1
|
|
149
|
+
with:
|
|
150
|
+
command: sdist
|
|
151
|
+
args: --out dist
|
|
152
|
+
- name: Upload sdist
|
|
153
|
+
uses: actions/upload-artifact@v5
|
|
154
|
+
with:
|
|
155
|
+
name: wheels-sdist
|
|
156
|
+
path: dist
|
|
157
|
+
|
|
158
|
+
release:
|
|
159
|
+
name: Release
|
|
160
|
+
runs-on: ubuntu-latest
|
|
161
|
+
if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
|
|
162
|
+
needs: [linux, musllinux, windows, macos, sdist]
|
|
163
|
+
permissions:
|
|
164
|
+
# Use to sign the release artifacts
|
|
165
|
+
id-token: write
|
|
166
|
+
# Used to upload release artifacts
|
|
167
|
+
contents: write
|
|
168
|
+
# Used to generate artifact attestation
|
|
169
|
+
attestations: write
|
|
170
|
+
steps:
|
|
171
|
+
- uses: actions/download-artifact@v6
|
|
172
|
+
- name: Generate artifact attestation
|
|
173
|
+
uses: actions/attest-build-provenance@v3
|
|
174
|
+
with:
|
|
175
|
+
subject-path: 'wheels-*/*'
|
|
176
|
+
- name: Install uv
|
|
177
|
+
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
|
178
|
+
uses: astral-sh/setup-uv@v7
|
|
179
|
+
- name: Publish to PyPI
|
|
180
|
+
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
|
181
|
+
run: uv publish 'wheels-*/*'
|
|
182
|
+
env:
|
|
183
|
+
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: Python package
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ "main" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ "main" ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
fail-fast: false
|
|
14
|
+
matrix:
|
|
15
|
+
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v6
|
|
18
|
+
- uses: actions/setup-python@v6
|
|
19
|
+
with:
|
|
20
|
+
python-version: ${{ matrix.python-version }}
|
|
21
|
+
- name: Test with PyTest
|
|
22
|
+
run: |
|
|
23
|
+
python -m pip install --upgrade pip
|
|
24
|
+
python -m venv .venv
|
|
25
|
+
source .venv/bin/activate
|
|
26
|
+
pip install -r test_requirements.txt
|
|
27
|
+
maturin develop
|
|
28
|
+
python -m pytest
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
pip-wheel-metadata/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
# Usually these files are written by a python script from a template
|
|
32
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
33
|
+
*.manifest
|
|
34
|
+
*.spec
|
|
35
|
+
|
|
36
|
+
# Installer logs
|
|
37
|
+
pip-log.txt
|
|
38
|
+
pip-delete-this-directory.txt
|
|
39
|
+
|
|
40
|
+
# Unit test / coverage reports
|
|
41
|
+
htmlcov/
|
|
42
|
+
.tox/
|
|
43
|
+
.nox/
|
|
44
|
+
.coverage
|
|
45
|
+
.coverage.*
|
|
46
|
+
.cache
|
|
47
|
+
nosetests.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
*.cover
|
|
50
|
+
*.py,cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
target/
|
|
76
|
+
|
|
77
|
+
# Jupyter Notebook
|
|
78
|
+
.ipynb_checkpoints
|
|
79
|
+
|
|
80
|
+
# IPython
|
|
81
|
+
profile_default/
|
|
82
|
+
ipython_config.py
|
|
83
|
+
|
|
84
|
+
# pyenv
|
|
85
|
+
.python-version
|
|
86
|
+
|
|
87
|
+
# pipenv
|
|
88
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
89
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
90
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
91
|
+
# install all needed dependencies.
|
|
92
|
+
#Pipfile.lock
|
|
93
|
+
|
|
94
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
95
|
+
__pypackages__/
|
|
96
|
+
|
|
97
|
+
# Celery stuff
|
|
98
|
+
celerybeat-schedule
|
|
99
|
+
celerybeat.pid
|
|
100
|
+
|
|
101
|
+
# SageMath parsed files
|
|
102
|
+
*.sage.py
|
|
103
|
+
|
|
104
|
+
# Environments
|
|
105
|
+
.env
|
|
106
|
+
.venv
|
|
107
|
+
env/
|
|
108
|
+
venv/
|
|
109
|
+
ENV/
|
|
110
|
+
env.bak/
|
|
111
|
+
venv.bak/
|
|
112
|
+
|
|
113
|
+
# Spyder project settings
|
|
114
|
+
.spyderproject
|
|
115
|
+
.spyproject
|
|
116
|
+
|
|
117
|
+
# Rope project settings
|
|
118
|
+
.ropeproject
|
|
119
|
+
|
|
120
|
+
# mkdocs documentation
|
|
121
|
+
/site
|
|
122
|
+
|
|
123
|
+
# mypy
|
|
124
|
+
.mypy_cache/
|
|
125
|
+
.dmypy.json
|
|
126
|
+
dmypy.json
|
|
127
|
+
|
|
128
|
+
# Pyre type checker
|
|
129
|
+
.pyre/
|
|
130
|
+
|
|
131
|
+
# IDE
|
|
132
|
+
.idea/
|
|
133
|
+
.vscode/
|
|
134
|
+
venv
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## [1.0.0] - 2026-01-19
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- **Breaking:** Rebranded from PyTechnicalIndicators to CentaurTechnicalIndicators-Python
|
|
13
|
+
- Updated all documentation, README, and links to reflect the new CentaurTechnicalIndicators branding
|
|
14
|
+
- Updated package metadata to reflect the new name and branding
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
*** /!\ The release notes below cover the PyTechnicalIndicators packages before the rebranding /!\ ***
|
|
19
|
+
|
|
20
|
+
## [3.0.5] - 2025-10-19
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Updated rust_ti dependency from 2.1.5 to 2.2.0
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
- Added support for new probability distribution deviation models from rust_ti 2.2.0:
|
|
27
|
+
- `LogStandardDeviation` - Log-scale standard deviation for analyzing log-returns
|
|
28
|
+
- `LaplaceStdEquivalent` - Laplace (double exponential) distribution scaled to standard deviation
|
|
29
|
+
- `CauchyIQRScale` - Cauchy distribution scaled by interquartile range for extreme outliers
|
|
30
|
+
- Added string aliases for new deviation models: `"log"`, `"logstd"`, `"laplace"`, `"cauchy"`
|
|
31
|
+
- Enhanced `PyDeviationModel::from_string()` to support the new deviation models
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
- Updated test expectations for median and mode absolute deviation calculations due to improved algorithms in rust_ti 2.2.0
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## [3.0.4] - 2025-10-08
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- Updated rust_ti dependency from 2.1.4 to 2.1.5
|
|
42
|
+
- Updated `break_down_trends` function to use new `TrendBreakConfig` struct from rust_ti 2.1.5
|
|
43
|
+
- Updated parameter names in `break_down_trends`
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## [3.0.3] - 2025-08-13
|
|
48
|
+
|
|
49
|
+
### Added
|
|
50
|
+
- Updated README.md to add links to How-Tos, a summary of benchmarks, and a badge linking to Read the Docs.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## [3.0.2] - 2025-08-07
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
- Minor document updates
|
|
58
|
+
- Updated RustTI version to include volatilty system fix
|
|
59
|
+
|
|
60
|
+
### Added
|
|
61
|
+
- Better badges to README
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## [3.0.1] - 2025-08-04
|
|
66
|
+
|
|
67
|
+
### Changed
|
|
68
|
+
- Updated the package version number...
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## [3.0.0] - 2025-08-04
|
|
73
|
+
|
|
74
|
+
### Added
|
|
75
|
+
- Added bindings using PyO3 and Maturin
|
|
76
|
+
|
|
77
|
+
### Changed
|
|
78
|
+
- Major changes to all functions, they are now bindings for the same functions in RustTI
|
|
79
|
+
|
|
80
|
+
### Removed
|
|
81
|
+
- Pure python functionality
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
Older releases aren't tracked in this file but some information can be found [here](https://github.com/chironmind/PyTechnicalIndicators/releases)
|
|
86
|
+
|