Direct answer
A worked example of Ulcer Index starts by choosing a fixed observation window and a “peak” value within that window. Then it converts each period’s drop from the running peak into a drawdown percentage. Finally, it combines those drawdown percentages into one number that reflects both how large and how frequent the drawdowns are.
Because the exact computation is straightforward but the input choices are not, every worked example depends on explicit assumptions: which dates are included, what counts as a “price” series value, and how the running peak is defined.
Mechanics: definition and step-by-step method
Ulcer Index is a volatility-style risk metric focused on drawdowns. The core idea is simple: it penalizes declines below the most recent peak.
A common computation uses these ingredients for a time series of prices (or any monotonically comparable index values) over N periods:
- Choose the N observations in order: P1, P2, …, PN.
- Compute the running peak at each period i: Hi = max(P1, …, Pi).
- Compute the drawdown percentage at each period i (relative to the running peak):
- Di = (Pi − Hi) / Hi
- Di is 0 when Pi equals the running peak, and negative when below the peak.
- Convert drawdown magnitude into a non-negative number by squaring the drawdown percentage:
- Di^2 = (Pi − Hi)^2 / Hi^2
- Average the squared drawdowns across the N periods and take the square root:
- Ulcer Index = sqrt( (1/N) * Σ(i=1..N) Di^2 )
Important: this example assumes the Ulcer Index is computed from drawdown percentages derived from prices in the chosen window, and that the running peak resets only when a new maximum is reached within that window.
Worked numerical example (with explicit assumptions)
Assume you observe a price series over N = 5 periods. You use the price values directly as P1..P5, and you measure drawdowns relative to the running peak within those five periods.
Assumptions
- The series is: P = [100, 110, 105, 95, 120].
- N = 5 (you do not extend beyond these points).
- You compute running peaks Hi within the window only.
- Ulcer Index is computed using drawdown percentages Di = (Pi − Hi)/Hi.
Now compute period-by-period:
-
Period 1: P1 = 100
- H1 = max(100) = 100
- D1 = (100 − 100)/100 = 0
- D1^2 = 0
-
Period 2: P2 = 110
- H2 = max(100,110) = 110
- D2 = (110 − 110)/110 = 0
- D2^2 = 0
-
Period 3: P3 = 105
- H3 = max(100,110,105) = 110
- D3 = (105 − 110)/110 = −5/110 = −0.0454545
- D3^2 ≈ 0.00206612
-
Period 4: P4 = 95
- H4 = max(…,95) = 110
- D4 = (95 − 110)/110 = −15/110 = −0.1363636
- D4^2 ≈ 0.01859504
-
Period 5: P5 = 120
- H5 = max(…,120) = 120
- D5 = (120 − 120)/120 = 0
- D5^2 = 0
Average squared drawdown:
- (1/5) * (0 + 0 + 0.00206612 + 0.01859504 + 0)
- = (1/5) * 0.02066116
- ≈ 0.004132232
Ulcer Index:
- sqrt(0.004132232) ≈ 0.0643
So, under these assumptions, the Ulcer Index for this 5-period window is about 0.064 (dimensionless, derived from squared drawdown percentages).
If you changed any assumption—such as including more periods, using a different input series (e.g., returns instead of prices), or using a different definition of peak—then the computed value could change even if the underlying “feeling” of the drawdown remained similar.
Limitations and verification: what can go wrong
A worked example helps you compute Ulcer Index mechanically, but it does not guarantee anything about future behavior.
Material limitations and failure modes include:
- Window dependence: The running peak is computed inside the chosen window. Extending the window can lower or raise the index because earlier peaks may change future drawdown percentages.
- Input definition: The “price” series value you use (close price vs. another measure, or a transformed series) changes drawdowns and therefore changes Ulcer Index.
- Interpretation risk: A single number summarizes drawdown depth variability, but it does not tell you why drawdowns occurred, how quickly recovery happens, or whether other risk dimensions (like upside volatility) differ.
- No predictive promise: Historical relationships between drawdowns and future outcomes do not establish that the index will behave the same way next.