Return Retracement Ratio (RRR)
Source: Notion | Last edited: 2023-06-26 | ID: 6c45966d-d79...
The return retracement ratio (RRR) is similar to the MAR and Calmar ratios in that it is a measure of the average annual compounded return divided by a retracement measure. The key difference, however, is that instead of being based on a single retracement (the maximum retracement), the RRR divides return by the average maximum retracement (AMR), which is based on a maximum retracement calculation for each month. The maximum retracement for each month is equal to the greater of the following two numbers:
- The largest possible cumulative loss that could have been experienced by any existing investor in that month (the percentage decline from the prior peak NAV to the current month-end NAV).
- The largest loss that could have been experienced by any new investor starting at the end of that month (the percentage decline from the current month-end NAV to the subsequent lowest NAV).
where:
annual compounded return
risk-free return
average maximum retracement
where:
number of months
where:
is the maximum retracement from prior NAV high, and is defined as:
where:
prior NAV high (prior to month )
is the maximum retracement to a subsequent NAV low, and is defined as:
where:
is the subsequent NAV low (subsequent to month ).
The reason for using both metrics to determine a maximum retracement for each month is that each of the two conditions would be biased to show small retracement levels during a segment of the track record. The first condition would invariably show small retracements for the early months in the track record because there would not have been an opportunity for any large retracements to develop. Similarly, the second condition would inevitably show small retracements during the latter months of the track record for analogous reasons. By using the maximum of both conditions, we assure a true worst-case number for each month.
The average maximum retracement is the average of all these monthly maximum retracements. The return retracement ratio is statistically far more meaningful than the MAR and Calmar ratios because it is based on multiple data points (one for each month) as opposed to a single statistic (the maximum drawdown in the entire record).
Understanding the Return Retracement Ratio
Section titled “Understanding the Return Retracement Ratio”The Return Retracement Ratio (RRR) is an advanced metric used in the field of financial analysis, closely associated with the MAR and Calmar ratios. Like the MAR and Calmar ratios, the RRR seeks to quantify risk-adjusted performance by dividing the average annual compounded return (ACR) by a specific retracement measure. However, the defining distinction lies in the specific retracement measure employed.
In contrast to the MAR and Calmar ratios, which base their calculations on a single maximum retracement measure, the RRR opts for a different approach. It divides the return by the Average Maximum Retracement (AMR), which incorporates a maximum retracement calculation for each month. This is calculated as follows:
RRR = (ACR - RF) / AMRWhere:
ACRdenotes the annual compounded return.RFsymbolizes the risk-free return.AMRrepresents the average maximum retracement. The AMR is determined by averaging out the maximum retracements of each month. A unique characteristic of this calculation is that each month’s maximum retracement is determined by comparing two distinct conditions:
- The largest possible cumulative loss that an existing investor could have encountered within a given month. This is calculated as the percentage decline from the highest Net Asset Value (NAV) recorded before that month to the NAV at the end of that month.
- The greatest potential loss for a new investor who started investing at the end of that month. This is the percentage decrease from the NAV at the end of the month to the lowest NAV noted after that month. These conditions, although seemingly redundant, serve a vital function. They address the potential bias in retracement calculations in the early and later stages of the investment period. For instance, the first condition would likely show smaller retracements during the initial months because there wouldn’t have been ample time for any significant retracements to materialize. In contrast, the second condition would yield smaller retracements in the later months for similar reasons. The maximum of both these conditions provides a more accurate “worst-case” retracement value for each month.
The Return Retracement Ratio (RRR) outshines the MAR and Calmar ratios in terms of its statistical validity, thanks to its use of multiple data points. Instead of relying on a solitary measure, the maximum drawdown across the entire record (as the MAR and Calmar ratios do), the RRR considers a data point for each month. This granularity provides a more robust and reliable measure of an investment’s risk-adjusted performance.
Python implementation
Section titled “Python implementation”The following Python script can be used to calculate the Return Retracement Ratio (RRR) as defined above. We assume that the daily PnL series is passed to the function calculate_rrr as a Pandas DataFrame with a datetime index.
This script calculates the RRR based on monthly windows of 28 days, which isn’t the standard definition of a month but matches your instructions.
Please, be aware that for real-world data, the assumption of 28-day months can lead to inaccuracies in the calculations.
import pandas as pdimport numpy as np
def calculate_rrr(df, rf): # Calculate monthly NAV df['NAV'] = (1 + df).cumprod()
# Calculate prior NAV high for each 28-day month df['PNH'] = df['NAV'].rolling(window=28, min_periods=1).max()
# Shift it to make it "prior to month i" df['PNH'] = df['PNH'].shift(28)
# Calculate maximum retracement from prior NAV high df['MRPNH'] = (df['PNH'] - df['NAV']) / df['PNH']
# Calculate subsequent NAV low for each 28-day month df['SNL'] = df['NAV'].rolling(window=28, min_periods=1).min().shift(-28)
# Calculate maximum retracement to a subsequent NAV low df['MRSNL'] = (df['NAV'] - df['SNL']) / df['NAV']
# Calculate maximum retracement for each month df['MR'] = df[['MRPNH', 'MRSNL']].max(axis=1)
# Calculate average maximum retracement amr = df['MR'].mean()
# Calculate annual compounded return acr = ((df['NAV'].iloc[-1] / df['NAV'].iloc[0]) ** (1 / (len(df) / 28)) - 1) * 100
# Finally, calculate return retracement ratio rrr = (acr - rf) / amr
return rrr
# Test the function with some random datanp.random.seed(42)df = pd.DataFrame(np.random.normal(0, 0.01, 365), columns=['Return'], index=pd.date_range(start='2022-01-01', periods=365))
print("RRR: ", calculate_rrr(df, 0.01))In this script, rf is the risk-free return rate.
Also note that this script is written in a vectorized manner to ensure it runs as fast as possible on large datasets.