5.5 KiB
CMF: Chaikin Money Flow
Money flow tells you what the big players are doing. CMF tells you if they're winning.
| Property | Value |
|---|---|
| Category | Volume |
| Inputs | OHLCV bar (TBar) |
| Parameters | period (default 20) |
| Outputs | Single series (CMF) |
| Output range | Unbounded |
| Warmup | > period bars |
| PineScript | cmf.pine |
- Chaikin Money Flow (CMF) is the normalized cousin of the Accumulation/Distribution Line.
- Similar: Adosc, MFI | Complementary: RSI | Trading note: Chaikin Money Flow; volume-weighted close location within H-L range. +/− indicates buying/selling pressure.
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
Chaikin Money Flow (CMF) is the normalized cousin of the Accumulation/Distribution Line. While ADL is cumulative and unbounded, CMF oscillates between -1 and +1, measuring the persistence of buying or selling pressure over a rolling window.
The genius of CMF is that it answers not just "Are they buying?" but "Have they been buying consistently?" A CMF reading of +0.25 means 25% more money flow went into accumulation than distribution over the lookback period.
Historical Context
Developed by Marc Chaikin as an evolution of his ADL work, CMF was designed to address ADL's major weakness: its unbounded nature made comparison across different securities impossible. By normalizing against volume, CMF became a true oscillator that traders could use with fixed thresholds.
Chaikin recommended watching for:
- CMF > 0: Bullish pressure dominates
- CMF < 0: Bearish pressure dominates
- CMF divergences: When price makes new highs but CMF fails to confirm
Architecture & Physics
CMF builds on the Money Flow Multiplier concept but adds a rolling summation window. Instead of accumulating forever like ADL, it asks: "Over the last N periods, what's the net money flow relative to total volume?"
The key insight is normalization by volume. This means CMF can never exceed ±1, regardless of the absolute volume levels. A stock trading 10 million shares daily and one trading 10 thousand shares daily can both produce a CMF of 0.5—and that reading means the same thing for both.
Component Breakdown
- Money Flow Multiplier (MFM): Same as ADL, ranges [-1, +1]
- Money Flow Volume (MFV): MFM × Volume
- Rolling Numerator: Sum of MFV over period
- Rolling Denominator: Sum of Volume over period
- CMF: Numerator / Denominator
Mathematical Foundation
1. Money Flow Multiplier (MFM)
MFM_t = \frac{(Close_t - Low_t) - (High_t - Close_t)}{High_t - Low_t}
Special case: If High = Low (no range), MFM = 0.
2. Money Flow Volume (MFV)
MFV_t = MFM_t \times Volume_t
3. Chaikin Money Flow (CMF)
CMF_t = \frac{\sum_{i=t-n+1}^{t} MFV_i}{\sum_{i=t-n+1}^{t} Volume_i}
where n is the lookback period (default: 20).
Performance Profile
Operation Count (Streaming Mode)
| Operation | Count | Notes |
|---|---|---|
| SUB | 4 | Range calc, MFM numerator |
| DIV | 2 | MFM, final CMF |
| MUL | 1 | MFV calculation |
| ADD | 2 | Rolling sum updates |
| Total | ~9 | Per bar |
Batch Mode (SIMD)
The MFM/MFV calculation is fully vectorizable. The rolling sum phase is inherently sequential but O(n) overall.
| Metric | Score | Notes |
|---|---|---|
| Throughput | 9 | O(1) per bar after warmup |
| Allocations | 0 | Two RingBuffers allocated once |
| Complexity | O(1) | Rolling sums, not recomputation |
| Accuracy | 10 | Matches reference implementations |
| Timeliness | 9 | 1-bar lag inherent in rolling window |
| Overshoot | 10 | Bounded [-1, +1] by construction |
| Smoothness | 5 | Smoother than raw ADL, but still responsive |
Validation
| Library | Status | Notes |
|---|---|---|
| QuanTAlib | ✅ | Validated |
| TA-Lib | N/A | No direct CMF function |
| Skender | ✅ | Matches GetCmf exactly |
| Tulip | N/A | No CMF implementation |
| Ooples | ✅ | Matches CalculateChaikinMoneyFlow |
Common Pitfalls
-
Division by Zero: If all volume in the period is zero (unlikely but possible with bad data), CMF is undefined. Implementation returns 0.
-
Warmup Period: CMF needs
periodbars before the rolling sums are meaningful. Before that, the calculation uses a growing window. -
Inside Bars: When High = Low, the MFM is 0 regardless of close location. This is mathematically correct but can create unexpected readings.
-
Volume Quality: Like all volume-based indicators, CMF is only as good as the volume data. Crypto exchanges with wash trading, or futures with overnight gaps, can produce misleading readings.
-
Threshold Fixation: While ±0.25 is often cited as "strong" pressure, the appropriate threshold depends on the security's typical CMF volatility.
-
isNew Parameter: When correcting a bar (isNew=false), the implementation properly rolls back state. Failure to handle this causes cumulative errors.
References
- Chaikin, M. (1996). "Chaikin Money Flow." Technical Analysis of Stocks & Commodities.
- StockCharts. "Chaikin Money Flow (CMF)." Technical Indicators