mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-03 03:47:42 +00:00
93 lines
3.2 KiB
Markdown
93 lines
3.2 KiB
Markdown
# CHANGE: Relative Price Change
|
|
|
|
> *The simplest measure of movement is often the most powerful.*
|
|
|
|
| Property | Value |
|
|
| ---------------- | -------------------------------- |
|
|
| **Category** | Numeric |
|
|
| **Inputs** | Source (close) |
|
|
| **Parameters** | `period` (default 1) |
|
|
| **Outputs** | Single series (Change) |
|
|
| **Output range** | Varies (see docs) |
|
|
| **Warmup** | `period + 1` bars |
|
|
| **PineScript** | [change.pine](change.pine) |
|
|
|
|
- CHANGE calculates the percentage change between the current value and a value N periods ago.
|
|
- **Trading note:** Simple price change (difference); foundation for momentum and rate-of-change calculations.
|
|
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
|
|
|
|
CHANGE calculates the percentage change between the current value and a value N periods ago. This fundamental indicator forms the basis for momentum analysis, rate of change calculations, and relative performance comparisons.
|
|
|
|
## Mathematical Foundation
|
|
|
|
The change calculation is straightforward:
|
|
|
|
$$
|
|
\text{Change}_t = \frac{P_t - P_{t-n}}{P_{t-n}}
|
|
$$
|
|
|
|
where:
|
|
- $P_t$ = current price
|
|
- $P_{t-n}$ = price N periods ago
|
|
- Result is expressed as a decimal (multiply by 100 for percentage)
|
|
|
|
### Edge Cases
|
|
|
|
- **Division by zero**: When $P_{t-n} = 0$, returns 0
|
|
- **NaN/Infinity inputs**: Uses last valid value substitution
|
|
|
|
## Performance Profile
|
|
|
|
### Operation Count (Per Bar)
|
|
|
|
| Operation | Count | Notes |
|
|
| :--- | :---: | :--- |
|
|
| Subtraction | 1 | Current - Past |
|
|
| Division | 1 | Conditional on past ≠ 0 |
|
|
| Buffer access | 1 | Ring buffer lookup |
|
|
| **Total** | **~3** | O(1) constant time |
|
|
|
|
### Quality Metrics
|
|
|
|
| Metric | Score | Notes |
|
|
| :--- | :---: | :--- |
|
|
| **Accuracy** | 10/10 | Exact mathematical calculation |
|
|
| **Timeliness** | 10/10 | No lag beyond lookback period |
|
|
| **Smoothness** | 3/10 | Raw returns are noisy |
|
|
| **Memory** | 9/10 | Only stores period+1 values |
|
|
|
|
## Validation
|
|
|
|
| Library | Status | Notes |
|
|
| :--- | :---: | :--- |
|
|
| **TA-Lib** | ✅ | ROC function (divide by 100) |
|
|
| **Skender** | ✅ | Roc indicator |
|
|
| **Manual** | ✅ | Direct calculation verified |
|
|
|
|
## Common Pitfalls
|
|
|
|
1. **Percentage vs Decimal**: QuanTAlib returns decimal (0.1 = 10%), while TA-Lib ROC returns percentage (10.0 = 10%). Multiply by 100 when comparing.
|
|
|
|
2. **Warmup Period**: Requires `period + 1` bars before producing meaningful results. First `period` values return 0.
|
|
|
|
3. **Zero Division**: When the past value is zero, returns 0 rather than NaN/Infinity.
|
|
|
|
4. **Compounding**: For multi-period returns, geometric compounding may be more appropriate than simple arithmetic change.
|
|
|
|
## Usage Examples
|
|
|
|
```csharp
|
|
// Period-1 change (simple return)
|
|
var change = new Change(1);
|
|
|
|
// 10-period momentum
|
|
var momentum = new Change(10);
|
|
|
|
// Chained from another indicator
|
|
var smaChange = new Change(new Sma(20), 5);
|
|
```
|
|
|
|
## References
|
|
|
|
- Murphy, J. (1999). "Technical Analysis of the Financial Markets." New York Institute of Finance.
|
|
- Pring, M. (2002). "Technical Analysis Explained." McGraw-Hill. |