mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-20 03:28:05 +00:00
148 lines
6.0 KiB
Markdown
148 lines
6.0 KiB
Markdown
# TSI: True Strength Index
|
||
|
||
> *True Strength Index double-smooths momentum, filtering out noise while preserving the directional signal in price change.*
|
||
|
||
| Property | Value |
|
||
| ---------------- | -------------------------------- |
|
||
| **Category** | Momentum |
|
||
| **Inputs** | Source (close) |
|
||
| **Parameters** | `longPeriod` (default 25), `shortPeriod` (default 13), `signalPeriod` (default 13) |
|
||
| **Outputs** | Single series (Tsi) |
|
||
| **Output range** | $-100$ to $+100$ |
|
||
| **Warmup** | `longPeriod + shortPeriod + signalPeriod` bars (51 default) |
|
||
| **PineScript** | [tsi.pine](tsi.pine) |
|
||
|
||
- The True Strength Index (TSI) is a momentum oscillator developed by William Blau that uses double-smoothed exponential moving averages of price mom...
|
||
- **Similar:** [MACD](../macd/Macd.md), [PMO](../pmo/Pmo.md) | **Complementary:** Signal line crossovers | **Trading note:** True Strength Index; double-smoothed momentum ratio. Range ±100. Good for divergence analysis.
|
||
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
|
||
|
||
The True Strength Index (TSI) is a momentum oscillator developed by William Blau that uses double-smoothed exponential moving averages of price momentum to reduce noise and identify trend strength and direction.
|
||
|
||
## Historical Context
|
||
|
||
William Blau introduced the TSI in his 1995 book "Momentum, Direction, and Divergence." The indicator was designed to provide a smoother momentum measure by applying double exponential smoothing to price changes, reducing the whipsaws common in simpler momentum indicators.
|
||
|
||
## Algorithm and Implementation
|
||
|
||
### 1. Momentum Calculation
|
||
|
||
```csharp
|
||
mom = Price - Price[1]
|
||
absMom = |mom|
|
||
```
|
||
|
||
Price momentum captures the direction and magnitude of price change.
|
||
|
||
### 2. Double EMA Smoothing
|
||
|
||
```csharp
|
||
// First smoothing with long period
|
||
smoothedMomLong = EMA(mom, longPeriod)
|
||
smoothedAbsMomLong = EMA(absMom, longPeriod)
|
||
|
||
// Second smoothing with short period
|
||
doubleSmoothedMom = EMA(smoothedMomLong, shortPeriod)
|
||
doubleSmoothedAbsMom = EMA(smoothedAbsMomLong, shortPeriod)
|
||
```
|
||
|
||
Double smoothing reduces noise while preserving trend information.
|
||
|
||
### 3. TSI Calculation
|
||
|
||
```csharp
|
||
TSI = 100 × doubleSmoothedMom / doubleSmoothedAbsMom
|
||
```
|
||
|
||
The ratio normalizes momentum to a percentage scale.
|
||
|
||
### 4. Signal Line
|
||
|
||
```csharp
|
||
Signal = EMA(TSI, signalPeriod)
|
||
```
|
||
|
||
The signal line provides crossover signals.
|
||
|
||
## Mathematical Formula
|
||
|
||
### Core Formula
|
||
|
||
$$TSI = 100 \times \frac{EMA(EMA(Price_t - Price_{t-1}, long), short)}{EMA(EMA(|Price_t - Price_{t-1}|, long), short)}$$
|
||
|
||
### Signal Line
|
||
|
||
$$Signal = EMA(TSI, signalPeriod)$$
|
||
|
||
### Default Parameters
|
||
|
||
- Long Period: 25
|
||
- Short Period: 13
|
||
- Signal Period: 13
|
||
|
||
## Interpretation
|
||
|
||
### Range
|
||
- TSI oscillates between -100 and +100
|
||
- Positive values indicate bullish momentum
|
||
- Negative values indicate bearish momentum
|
||
|
||
### Signals
|
||
- **Zero Line Crossover**: TSI crossing above zero is bullish; below zero is bearish
|
||
- **Signal Line Crossover**: TSI crossing above signal is bullish; below is bearish
|
||
- **Divergence**: Price and TSI moving in opposite directions suggests trend reversal
|
||
|
||
### Overbought/Oversold
|
||
- Commonly used levels: +25/-25 or +30/-30
|
||
- Extreme readings suggest potential reversal
|
||
|
||
## Performance Profile
|
||
|
||
### Operation Count (Streaming Mode)
|
||
|
||
TSI(long, short, signal) maintains 5 EMA states: two first-pass EMA smoothers (mom + |mom| on `longPeriod`), two second-pass EMA smoothers (output of first pass on `shortPeriod`), and one signal EMA. All are scalar FMA operations.
|
||
|
||
| Operation | Count | Cost (cycles) | Subtotal |
|
||
| :--- | :---: | :---: | :---: |
|
||
| Price delta (SUB) | 1 | 1 | ~1 |
|
||
| ABS of delta | 1 | 1 | ~1 |
|
||
| EMA1 mom (FMA: α_long × delta + decay × prev) | 1 | 4 | ~4 |
|
||
| EMA1 abs (FMA: α_long × |delta| + decay × prev) | 1 | 4 | ~4 |
|
||
| EMA2 mom (FMA: α_short × EMA1_mom + decay × prev) | 1 | 4 | ~4 |
|
||
| EMA2 abs (FMA: α_short × EMA1_abs + decay × prev) | 1 | 4 | ~4 |
|
||
| TSI ratio (× 100 + DIV) | 2 | 9 | ~18 |
|
||
| Signal EMA (FMA: α_sig × TSI + decay × prev) | 1 | 4 | ~4 |
|
||
| **Total** | **9** | — | **~40 cycles** |
|
||
|
||
O(1) per bar. Default WarmupPeriod = longPeriod + shortPeriod + signalPeriod = 51 bars. The division is the dominant cost; Wilder-smoothed variants can replace all EMAs with RMA (same FMA count, slower convergence).
|
||
|
||
### Batch Mode (SIMD Analysis)
|
||
|
||
| Operation | Vectorizable? | Notes |
|
||
| :--- | :---: | :--- |
|
||
| Price delta series | Yes | `VSUBPD` across full input span |
|
||
| ABS series | Yes | `VABSPD` — single instruction |
|
||
| First EMA pass (long period) | No | Recursive IIR; each value depends on previous |
|
||
| Second EMA pass (short period) | No | Recursive IIR on output of first pass |
|
||
| TSI ratio | Yes | `VMULPD` + `VDIVPD` once both EMA series are computed |
|
||
| Signal EMA | No | Recursive IIR |
|
||
|
||
All three EMA passes are recursive IIR filters — inherently serial. A batch implementation can vectorize the delta and ABS computation (4 bars/cycle on AVX2) before the scalar EMA sweeps. The ratio and optional signal computation can be vectorized after the EMA passes complete. Net batch speedup for long series (~1000 bars): approximately 1.3–1.5× over fully scalar.
|
||
## Validation
|
||
|
||
Cross-validated against:
|
||
- TradingView's ta.tsi()
|
||
- Stock.Indicators library
|
||
- TA-Lib implementations
|
||
|
||
## Common Pitfalls
|
||
|
||
1. **Short Warmup**: Ensure sufficient warmup period for convergence
|
||
2. **Division by Zero**: When no price movement, denominator approaches zero
|
||
3. **Lag Inherent**: Double smoothing introduces lag in trend identification
|
||
4. **Parameter Sensitivity**: Results vary significantly with period choices
|
||
|
||
## References
|
||
|
||
- Blau, William. "Momentum, Direction, and Divergence." Wiley, 1995
|
||
- Blau, William. "True Strength Index." Technical Analysis of Stocks & Commodities, 1991
|
||
- [TradingView TSI Documentation](https://www.tradingview.com/support/solutions/43000502302-true-strength-index-tsi/) |