mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-06 04:57:44 +00:00
137 lines
7.0 KiB
Markdown
137 lines
7.0 KiB
Markdown
# IMI: Intraday Momentum Index
|
||
|
||
> *Intraday momentum index applies RSI logic to candle bodies — bullish closes accumulate strength, bearish closes accumulate weakness.*
|
||
|
||
| Property | Value |
|
||
| ---------------- | -------------------------------- |
|
||
| **Category** | Oscillator |
|
||
| **Inputs** | OHLCV bar (TBar) |
|
||
| **Parameters** | `period` (default 14) |
|
||
| **Outputs** | Single series (IMI) |
|
||
| **Output range** | Varies (see docs) |
|
||
| **Warmup** | `period` bars |
|
||
| **PineScript** | [imi.pine](imi.pine) |
|
||
|
||
- The Intraday Momentum Index measures buying and selling pressure using the open-to-close relationship within each bar, rather than the close-to-clo...
|
||
- **Similar:** [RSI](../../momentum/rsi/Rsi.md), [MFI](../../volume/mfi/Mfi.md) | **Complementary:** Volume | **Trading note:** Intraday Momentum Index; RSI variant using open-close relationship. Measures intrabar conviction.
|
||
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
|
||
|
||
The Intraday Momentum Index measures buying and selling pressure using the open-to-close relationship within each bar, rather than the close-to-close changes used by RSI. Each bar is classified as a gain (close > open) or loss (close < open), with the magnitude being the absolute open-close difference. Rolling sums of gains and losses over the lookback period produce an RSI-like ratio scaled to 0-100. This bridges Japanese candlestick analysis with Western oscillator theory: bullish candles contribute to the gain sum, bearish candles contribute to the loss sum. Unlike RSI, IMI does not require a previous close and uses simple rolling sums rather than exponential smoothing, making it more responsive but noisier. Output is bounded 0-100 with conventional overbought (>70) and oversold (<30) zones.
|
||
|
||
## Historical Context
|
||
|
||
Tushar Chande introduced the Intraday Momentum Index in *The New Technical Trader* (1994), alongside innovations like the Chande Momentum Oscillator. Chande observed that traditional momentum indicators like RSI ignored the intraday price action captured by candlestick patterns. By using the open-close relationship instead of close-close changes, IMI measures a fundamentally different quantity: the directional conviction *within* each bar rather than the change *between* bars. On daily charts, the open-close relationship has clear meaning — it captures overnight positioning gaps plus session direction. The indicator is self-contained within each bar, requiring no previous bar's close, which makes it particularly clean for session-based analysis. The formula structure deliberately mirrors RSI (sum of gains over total) to provide familiar overbought/oversold levels while measuring intra-session momentum.
|
||
|
||
## Architecture & Physics
|
||
|
||
### 1. Gain/Loss Classification
|
||
|
||
Each bar is classified based on the open-close relationship:
|
||
|
||
$$G_t = \begin{cases} C_t - O_t & \text{if } C_t > O_t \\ 0 & \text{otherwise} \end{cases}$$
|
||
|
||
$$L_t = \begin{cases} O_t - C_t & \text{if } C_t < O_t \\ 0 & \text{otherwise} \end{cases}$$
|
||
|
||
Doji bars ($C = O$) contribute zero to both sums.
|
||
|
||
### 2. Rolling Sums
|
||
|
||
Simple rolling sums over the lookback window (no exponential smoothing):
|
||
|
||
$$\text{SumGains}_t = \sum_{i=t-N+1}^{t} G_i$$
|
||
|
||
$$\text{SumLosses}_t = \sum_{i=t-N+1}^{t} L_i$$
|
||
|
||
Implemented with ring buffers and incremental add/subtract for $O(1)$ per bar.
|
||
|
||
### 3. IMI Value
|
||
|
||
$$\text{IMI}_t = 100 \times \frac{\text{SumGains}_t}{\text{SumGains}_t + \text{SumLosses}_t}$$
|
||
|
||
When both sums are zero (all doji bars in window), IMI defaults to 50.0 (neutral).
|
||
|
||
### 4. Complexity
|
||
|
||
- **Time:** $O(1)$ per bar — rolling sum add/subtract
|
||
- **Space:** $O(N)$ — two ring buffers for gain and loss history
|
||
- **Warmup:** $N$ bars
|
||
|
||
## Mathematical Foundation
|
||
|
||
### Parameters
|
||
|
||
| Symbol | Parameter | Default | Constraint |
|
||
|--------|-----------|---------|------------|
|
||
| $N$ | period | 14 | $N \geq 1$ |
|
||
|
||
### IMI vs RSI Comparison
|
||
|
||
| Property | RSI | IMI |
|
||
|----------|-----|-----|
|
||
| Input | Close-to-close change | Open-to-close change |
|
||
| Measures | Inter-session momentum | Intra-session momentum |
|
||
| Smoothing | Wilder's RMA (exponential) | Simple rolling sum |
|
||
| Previous bar | Required ($C_{t-1}$) | Not required (self-contained) |
|
||
| Response | Smoother, more lag | More responsive, noisier |
|
||
| Range | 0-100 | 0-100 |
|
||
|
||
### Interpretation
|
||
|
||
| IMI Value | Meaning |
|
||
|-----------|---------|
|
||
| > 70 | Overbought — strong bullish intra-session pressure |
|
||
| < 30 | Oversold — strong bearish intra-session pressure |
|
||
| 50 | Neutral — balanced buying/selling within bars |
|
||
| Rising toward 70 | Increasing proportion of bullish candles |
|
||
| Falling toward 30 | Increasing proportion of bearish candles |
|
||
|
||
### Timeframe Sensitivity
|
||
|
||
On daily charts, the open-close relationship captures overnight gaps plus session direction — the most informative timeframe for IMI. On very short intraday charts (1-minute), the open-close relationship carries less structural information since the open price has minimal gap significance. Choose timeframes where the opening price carries genuine information about session sentiment.
|
||
|
||
### OHLC Requirement
|
||
|
||
IMI requires both Open and Close prices per bar. It implements `ITValuePublisher` directly rather than `AbstractBase` since it operates on `TBar` (OHLC) input, not single `TValue` input.
|
||
|
||
## Performance Profile
|
||
|
||
### Operation Count (Streaming Mode)
|
||
|
||
IMI (Intraday Momentum Index) tracks rolling sums of up-body and total-body candles over N bars.
|
||
|
||
| Operation | Count | Cost (cycles) | Subtotal |
|
||
| :--- | :---: | :---: | :---: |
|
||
| SUB (Close − Open = body) | 1 | 1 | 1 |
|
||
| CMP (up body vs down body) | 1 | 1 | 1 |
|
||
| RingBuffer add + oldest sub × 2 (ΣUp, ΣTotal) | 4 | 1 | 4 |
|
||
| DIV (ΣUp / ΣTotal) | 1 | 15 | 15 |
|
||
| MUL × 100 | 1 | 3 | 3 |
|
||
| CMP (guard div-by-zero) | 1 | 1 | 1 |
|
||
| **Total** | **9** | — | **~25 cycles** |
|
||
|
||
~25 cycles per bar. Fast O(1) running sums.
|
||
|
||
### Batch Mode (SIMD Analysis)
|
||
|
||
| Operation | Vectorizable? | Notes |
|
||
| :--- | :---: | :--- |
|
||
| Body computation | Yes | VSUBPD — independent per bar |
|
||
| Up/total conditional accumulation | Partial | VCMPPD mask + VADDPD (masked add) |
|
||
| Prefix-sum sliding window | Partial | Sum scan with subtract-lag |
|
||
| Division + scale | Yes | VDIVPD + VMULPD |
|
||
|
||
The conditional accumulation (masked add for up bodies) is SIMD-friendly with AVX2 blend/mask operations.
|
||
|
||
### Quality Metrics
|
||
|
||
| Metric | Score | Notes |
|
||
| :--- | :---: | :--- |
|
||
| **Accuracy** | 10/10 | Exact running sum arithmetic; integer-like body logic |
|
||
| **Timeliness** | 7/10 | N-bar window; reacts immediately to intraday momentum shifts |
|
||
| **Smoothness** | 5/10 | Raw ratio can swing sharply with candle character changes |
|
||
| **Noise Rejection** | 6/10 | Window averaging provides moderate smoothing |
|
||
|
||
## Resources
|
||
|
||
- Chande, T.S. & Kroll, S. — *The New Technical Trader* (John Wiley & Sons, 1994)
|
||
- PineScript reference: `imi.pine` in indicator directory |