mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-04 12:07:44 +00:00
161 lines
5.7 KiB
Markdown
161 lines
5.7 KiB
Markdown
# SLOPE: First Derivative (Velocity)
|
||
|
||
> *The simplest measure of change reveals the most: is it going up, or going down?*
|
||
|
||
| Property | Value |
|
||
| ---------------- | -------------------------------- |
|
||
| **Category** | Numeric |
|
||
| **Inputs** | Source (close) |
|
||
| **Parameters** | None |
|
||
| **Outputs** | Single series (SLOPE) |
|
||
| **Output range** | Varies (see docs) |
|
||
| **Warmup** | `2` bars |
|
||
| **PineScript** | [slope.pine](slope.pine) |
|
||
|
||
- SLOPE measures the instantaneous rate of change—the velocity of a time series.
|
||
- No configurable parameters; computation is stateless per bar.
|
||
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
|
||
|
||
SLOPE measures the instantaneous rate of change—the velocity of a time series. As the first derivative, it answers the fundamental question: how fast is the value changing right now? A positive slope means ascending; negative means descending; zero means flat. This O(1) streaming implementation uses SIMD optimization for batch calculations and handles bar corrections via state rollback.
|
||
|
||
## Historical Context
|
||
|
||
The first derivative appears in Newton's calculus (1687) and forms the foundation of technical analysis. Every momentum indicator, every rate-of-change calculation, every velocity measure reduces to some form of first difference.
|
||
|
||
In discrete time series, the continuous derivative $\frac{dx}{dt}$ becomes the finite difference $\Delta x = x_t - x_{t-1}$. This simple subtraction underpins RSI's momentum, MACD's signal line, and every trend-following system that asks "which way is it moving?"
|
||
|
||
QuanTAlib implements SLOPE as a first-class indicator with full streaming support, SIMD batch optimization, and proper state management for bar corrections.
|
||
|
||
## Architecture & Physics
|
||
|
||
SLOPE is a memoryless differentiator with minimal state requirements:
|
||
|
||
### 1. First Difference Operation
|
||
|
||
The fundamental operation:
|
||
|
||
$$
|
||
S_t = V_t - V_{t-1}
|
||
$$
|
||
|
||
where $V_t$ is the current value and $V_{t-1}$ is the previous value.
|
||
|
||
### 2. State Management
|
||
|
||
State consists of:
|
||
- `PrevValue`: The previous input value
|
||
- `LastValidValue`: Last known finite value for NaN/Infinity substitution
|
||
- `Count`: Number of values processed (0, 1, or 2+)
|
||
|
||
The indicator becomes "hot" (fully warmed up) after 2 values.
|
||
|
||
### 3. Bar Correction via Rollback
|
||
|
||
When `isNew=false`, the indicator rolls back to the previous state before recalculating:
|
||
|
||
$$
|
||
\text{State}_{current} \leftarrow \text{State}_{previous}
|
||
$$
|
||
|
||
This enables real-time bar updates without corrupting the running calculation.
|
||
|
||
## Mathematical Foundation
|
||
|
||
### Discrete First Derivative
|
||
|
||
For a time series $V$:
|
||
|
||
$$
|
||
S_t = V_t - V_{t-1}
|
||
$$
|
||
|
||
This is the forward difference approximation of the derivative.
|
||
|
||
### Interpretation
|
||
|
||
| Slope Value | Meaning |
|
||
| :--- | :--- |
|
||
| $S > 0$ | Price ascending (bullish) |
|
||
| $S < 0$ | Price descending (bearish) |
|
||
| $S = 0$ | Price unchanged (consolidation) |
|
||
| $|S|$ large | Fast movement |
|
||
| $|S|$ small | Slow movement |
|
||
|
||
### Relationship to Higher Derivatives
|
||
|
||
SLOPE forms the basis of the derivative chain:
|
||
|
||
$$
|
||
\text{Accel}_t = \text{Slope}_t - \text{Slope}_{t-1}
|
||
$$
|
||
|
||
$$
|
||
\text{Jolt}_t = \text{Accel}_t - \text{Accel}_{t-1}
|
||
$$
|
||
|
||
## Performance Profile
|
||
|
||
### Operation Count (Streaming Mode, Scalar)
|
||
|
||
| Operation | Count | Cost (cycles) | Subtotal |
|
||
| :--- | :---: | :---: | :---: |
|
||
| SUB | 1 | 1 | 1 |
|
||
| MOV (state update) | 2 | 1 | 2 |
|
||
| CMP (IsFinite check) | 1 | 1 | 1 |
|
||
| **Total** | **4** | — | **~4 cycles** |
|
||
|
||
SLOPE is one of the fastest possible indicators—a single subtraction plus state bookkeeping.
|
||
|
||
### Batch Mode (512 values, SIMD)
|
||
|
||
| Architecture | Vector Width | Elements/Op | Total Ops (512 values) |
|
||
| :--- | :---: | :---: | :---: |
|
||
| AVX-512 | 512 bits | 8 doubles | 64 |
|
||
| AVX | 256 bits | 4 doubles | 128 |
|
||
| ARM64 Neon | 128 bits | 2 doubles | 256 |
|
||
| Scalar | 64 bits | 1 double | 512 |
|
||
|
||
**Batch efficiency (512 bars):**
|
||
|
||
| Mode | Cycles/bar | Total (512 bars) | Speedup |
|
||
| :--- | :---: | :---: | :---: |
|
||
| Scalar streaming | 4 | 2,048 | 1× |
|
||
| AVX-512 SIMD | 0.5 | 256 | 8× |
|
||
| AVX SIMD | 1 | 512 | 4× |
|
||
|
||
### Quality Metrics
|
||
|
||
| Metric | Score | Notes |
|
||
| :--- | :---: | :--- |
|
||
| **Accuracy** | 10/10 | Exact finite difference |
|
||
| **Timeliness** | 10/10 | Zero lag (instantaneous) |
|
||
| **Smoothness** | 3/10 | Amplifies noise |
|
||
| **Computational Cost** | 10/10 | Single subtraction |
|
||
| **Memory** | 10/10 | ~48 bytes state |
|
||
|
||
## Validation
|
||
|
||
SLOPE is a fundamental operation. Validation confirms exact match with manual calculation.
|
||
|
||
| Library | Status | Notes |
|
||
| :--- | :---: | :--- |
|
||
| **TA-Lib** | N/A | Uses ROC (percent change) |
|
||
| **Skender** | N/A | Uses Slope regression |
|
||
| **Manual Calculation** | ✅ | Exact match |
|
||
|
||
## Common Pitfalls
|
||
|
||
1. **Noise Amplification**: First derivatives amplify high-frequency noise. A 1% price wiggle becomes a full slope reversal. Consider smoothing the input or output for noisy data.
|
||
|
||
2. **Scale Dependency**: SLOPE output depends on input scale. A $100 stock has 100× larger slopes than a $1 stock. Normalize if comparing across instruments.
|
||
|
||
3. **Warmup Period**: SLOPE requires 2 values to produce meaningful output. The first output is always 0.
|
||
|
||
4. **Using isNew Incorrectly**: When processing live ticks within the same bar, use `Update(value, isNew: false)`. When a new bar opens, use `isNew: true` (default).
|
||
|
||
5. **Memory Footprint**: ~48 bytes per instance. Negligible for most use cases.
|
||
|
||
## References
|
||
|
||
- Newton, Isaac. (1687). "Philosophiæ Naturalis Principia Mathematica."
|
||
- Numerical Methods: Finite Difference Approximations. |