Files

123 lines
5.5 KiB
Markdown
Raw Permalink Normal View History

# CMF: Chaikin Money Flow
> *Money flow tells you what the big players are doing. CMF tells you if they're winning.*
2026-02-27 07:48:12 -08:00
| 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](cmf.pine) |
2026-02-27 07:48:12 -08:00
- Chaikin Money Flow (CMF) is the normalized cousin of the Accumulation/Distribution Line.
- **Similar:** [Adosc](../adosc/Adosc.md), [MFI](../mfi/Mfi.md) | **Complementary:** RSI | **Trading note:** Chaikin Money Flow; volume-weighted close location within H-L range. +/ indicates buying/selling pressure.
2026-02-27 07:48:12 -08:00
- 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
1. **Money Flow Multiplier (MFM)**: Same as ADL, ranges [-1, +1]
2. **Money Flow Volume (MFV)**: MFM × Volume
3. **Rolling Numerator**: Sum of MFV over period
4. **Rolling Denominator**: Sum of Volume over period
5. **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
1. **Division by Zero**: If all volume in the period is zero (unlikely but possible with bad data), CMF is undefined. Implementation returns 0.
2. **Warmup Period**: CMF needs `period` bars before the rolling sums are meaningful. Before that, the calculation uses a growing window.
3. **Inside Bars**: When High = Low, the MFM is 0 regardless of close location. This is mathematically correct but can create unexpected readings.
4. **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.
5. **Threshold Fixation**: While ±0.25 is often cited as "strong" pressure, the appropriate threshold depends on the security's typical CMF volatility.
6. **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](https://school.stockcharts.com/doku.php?id=technical_indicators:chaikin_money_flow_cmf)