Introduccion al Volatility Targeting
En este estudio, nos proponemos implementar una técnica de Volatility Targeting en Python partiendo de cero. Para ello, haremos uso de una metodología sencilla pero efectiva.
¿Qué son los Objetivos de Volatilidad? (Volatility Targeting)
La historia de la volatilidad targeting se remonta a la década de 1980, cuando los inversores comenzaron a darse cuenta de que la volatilidad era un factor importante en la rentabilidad de las carteras. A medida que los mercados financieros se volvían cada vez más complejos, la necesidad de controlar la volatilidad se hizo más evidente.
En esencia,Volatility Targetingconsiste en condicionar la asignación de un activo en función de su nivel de volatilidad. La volatilidad histórica se presenta como una de las métricas más utilizadas en este enfoque. Buscamos gestionar la exposición de la cartera en relación con un objetivo de volatilidad. El target buscado y la volatilidad máxima realizada deben ser similares, de esta forma podremos entender las técnicas realizamos son las correctas.
En caso de que la volatilidad aumente, se reducirá la asignación de activos, mientras que si la volatilidad disminuye, se requerirá un mayor apalancamiento. Por defecto, los objetivos de volatilidad se considerarán a nivel anual, a menos que se especifique lo contrario.
La aplicación de técnicas de Volatility Targeting permite suavizar la volatilidad de la cartera, eliminando una gran parte de la volatilidad presente. Asimismo, podría aumentar la rentabilidad, aunque su principal objetivo es modelar la volatilidad futura de la cartera, más que un aumento en los rendimientos.
Método de Volatility Targeting Básico

Antecedentes
Imaginemos un portfolio con esta composición:
- 60% SPY
- 40% IEF
Por lo general, esta cartera suele clasificarse como el target risk medio y se considera una de las opciones más utilizadas para fines de benchmarking. Debido a que se trata de una cartera con condiciones fijas, es decir, que no se modifica independientemente de las circunstancias del mercado, resulta altamente vulnerable en periodos de volatilidad. A pesar de que su exposición al tesoro americano le confiere una volatilidad inferior a la de la renta variable, la verdad es que, más allá del objetivo de benchmarking, se trata de un portfolio susceptible de mejora sin tener que agregar demasiada complejidad al modelo preestablecido.
Aplicando Volatility Targeting

Dado que partimos de un portfolio que puede ser mejorado con facilidad, comenzaremos a programar la base de nuestro estudio. Lo primero será crear la cabecera, que incluirá todas las librerías necesarias y las variables del modelo.
### QUANTARMY 2023 - [jcx@QA]#
### GNU PUBLIC LICENSE CODE
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
import quantstats as qs
qs.extend_pandas()
plt.style.use('dark_background')
st1 = 'SPY'
st2 = 'TLT'
N = 100
data = pd.DataFrame()
Hemos cargado todas las librerías necesarias y asignado las variables “st1” y “st2” a los dos activos que analizaremos en este estudio. En este caso, hemos elegido utilizar SPY, un ETF que replica de forma eficiente el índice S&P500, y TLT, un ETF que sigue un universo de bonos seleccionados con un plazo de vencimiento superior a los 20 años. Otra opción que se utiliza con frecuencia son los IEF, que tienen un plazo de duración intermedia.
Una vez definida la cabecera, vamos a crear el dataframe principal, y procedemos a descargar toda la información necesaria.
data['s1'] = yf.download(st1)[['Adj Close']].pct_change() * 10
data['s2'] = yf.download(st2)[['Adj Close']].pct_change() * 10
Ahora, es necesario calcular la volatilidad actual y establecer el objetivo de volatilidad que deseamos aplicar en nuestro estudio.
En esta ocasión, fijaremos nuestro objetivo de volatilidad en la volatilidad histórica media del activo desde el inicio de la serie. Para ello, evaluaremos la desviación de la volatilidad del activo en relación con su volatilidad histórica mediante el cálculo de la media móvil de N periodos.
data['v1'] = data['s1'].rolling(N).std().shift(-2)
data['v2'] = data['s2'].rolling(N).std().shift(-2)
data['p1'] = data['v1'] / data['s1'].std().mean()
data['p2'] = data['v2'] / data['s2'].std().mean()
Hemos declarado “v1” y “v2” como la media móvil de la volatilidad en un periodo anterior de 2 días al actual. La razón de ello es evitar posibles sesgos y filtraciones de información del futuro en nuestro análisis.
Hemos definido las variables “p1” y “p2” como el cociente entre la volatilidad actual y nuestro objetivo de volatilidad, en este caso, la volatilidad histórica del activo.
Dado que este estimador aumenta junto con la volatilidad móvil, necesitamos crear un nuevo indicador que nos permita ponderar los activos en nuestra cesta de forma adecuada. Este indicador se calculará de la siguiente manera:
Para limitar el apalancamiento y controlar la dirección de nuestro modelo, utilizaremos el indicador 1 – P. Este indicador nos permitirá reducir la exposición del modelo en aquellos activos con mayor volatilidad. Es decir, cuanto mayor sea la volatilidad del activo, menor será su ponderación en nuestra cesta.
data['a_p1'] = 1 - data['p1']
data['a_p1'] = np.where(data['a_p1']<0,0,data['a_p1'])
data['a_p2'] = 1 - data['p2']
data['a_p2'] = np.where(data['a_p2']<0,0,data['a_p2'])
Creando un df tal que:
Date | s1 | s2 | v1 | v2 | p1 | p2 | a_p1 | a_p2 |
---|---|---|---|---|---|---|---|---|
2002-10-21 00:00:00 | 0.17261071532545857 | -0.07678772806501866 | 0.21429774757254774 | 0.05430005328809122 | 1.8004102606957961 | 1.2611821875770743 | 0.0 | 0.0 |
2002-10-22 00:00:00 | -0.07208206352421698 | -0.004771642364100881 | 0.21590918493442254 | 0.05340940433602003 | 1.8139486594594405 | 1.240495824936198 | 0.0 | 0.0 |
Analizando los resultados del Volatility Targeting
Una vez hemos creado la matriz con toda la información necesaria para nuestros cálculos, procederemos a visualizar los estimadores P1 para SPY y P2 para TLT en esta ocasión.
data[['p1','p2']].dropna().plot()

Podemos observar que la volatilidad del activo SPY es significativamente mayor que la del activo TLT. Sin embargo, se presenta una anomalía en los datos debido a las variaciones de tipos de interés en una economía inflacionaria, donde se observa que la volatilidad realizada en la renta fija del Tesoro Americano es incluso mayor que en el SPY. Se trata de una situación muy particular.
Ahora vamos a analizar cómo serían las ponderaciones de nuestro modelo a lo largo del tiempo.
data[['a_p1','a_p2']].plot()

Podemos observar cómo este método busca reducir la volatilidad del portafolio, centrándose únicamente en períodos de mercado tranquilos. El poder predictivo del modelo es bajo, por lo que no se recomienda utilizarlo para tomar decisiones de inversión a largo plazo. No obstante, la principal ventaja del modelo radica en su capacidad de adaptación al entorno, ya que busca exposición e incluso apalancamiento cuando lo considera apropiado, y puede mantener ponderaciones muy bajas, o incluso salir completamente del mercado, en momentos de alta volatilidad.
Vamos a sumar las dos ponderaciones para analizar si hay momentos en que el modelo está fuera del mercado o está utilizando apalancamiento.
(data['a_p1'] + data['a_p2']) .plot()

Como se puede observar en la gráfica, en general el modelo se mantiene por debajo de su nivel máximo sin utilizar apalancamiento, aunque en algunos momentos específicos adopta una estrategia de apalancamiento. Todas las condiciones para un apalancamiento productivo pueden ser definidas en el propio modelo, pero dado el carácter introductorio de este artículo, no se limitará el modelo en este sentido.
Uniendo Retornos con Assets Allocations
Ahora que hemos confirmado que las premisas fundamentales sobre las que se basa este modelo se cumplen, es decir, su capacidad de adaptación a la volatilidad del mercado a través de mecanismos de targeting de volatilidad, podemos pasar al siguiente paso.
Vamos a calcular las curvas de equity para cada activo por separado. Empezaremos con ST1 (SPY).
data['n1'] = data['a_p1'] * data['s1']
Después de aplicar Volatility Targeting, el procedimiento para el cálculo de las curvas de equity es extremadamente sencillo: los retornos porcentuales se multiplican por la ponderación correspondiente. A continuación, presentamos los resultados obtenidos para el activo SPY:


Para TLT:


Para comprender mejor si estos dos activos tienen un comportamiento similar o son diferentes, realizaremos un test de correlación. Se espera encontrar valores que no superen 0.2 o estén por debajo de -0.2. Además, con el Volatility Targeting se ha ajustado la volatilidad de ambos activos.
data[['n1','n2']].corr(method='kendall')
index | n1 | n2 |
---|---|---|
n1 | 1.0 | -0.14748243489589113 |
n2 | -0.14748243489589113 | 1.0 |
Resultado Final – Volatility Targeting
Para visualizar los resultados de los dos portfolios, simplemente debemos sumarlos. La curva resultante con la aplicación de Volatility Targeting sería la siguiente:
(data['n1'] + data['n2']).cumsum().plot()

Usos del Volatility Targeting
Uno de los gestores de mayor reputacion, que ha construido su impero en base al concepto de volatility targeting ha sido Ray Dalio. Su fondo aplicaba un concepto derivado del volatility targeting. Utilizaba la tecnica denominada como Risk Parity
Recursos:
Si estas buscando entender la volatilidad realizada, te recomendamos que te pases por aqui!
Si estas buscando entender la volatilidad implicita, te recomendamos que te pases por aqui!
Si quieres entender los tres usos mas comunes de la volatilidad, te recomendamos que te pases
Ampliacion para Miembros
La siguente parte, unicamente para miembros de nuestra army, avanzaremos en el volatility targeting, a nivel activo, y a nivel estrategia. Profundizaremos en los metodos para ajustar nuestro objetivo, que puede ser reutilizado como base para empezar en los metodos de volatility targeting
Volatility Targeting – A nivel Activo
Dentro del Portfolio management, existen tres niveles relevantes de gestion de riesgo de forma esquematica.
- A nivel de Portfolio: Donde el objetivo es controlar la volatilidad de un portofolio multi-strategy, y poder realizar tactical switching.
- A nivel Estrategia: Donde el objetivo, es targetear la volatilidad en una unica estraegia
- A nivel Activo: Donde el objetivo esta asignado en ajustar la ponderacion del asset a la estrategia, de los distintos activos del portfolio.
Aunque existen muchisimas situaciones donde no es posible distingir entre diferentes niveles de riesgo por la estructura hierarchical de las cestras de riesgo.
Por ejemplo, múltiples estrategias (como diferentes cruces de MA) pueden considerarse como medias o puede ser Momentum . Esto puede depender de la preferencias subjetivas del trader, o depender de exposiciones a la estructura de covarianza tanto en formas empíricas como teóricas.
Vamos a programar un bloque que sea utilizable a nivel estrategia, y a nivel assets. Donde targeteamos las volatilidades condicionales como unico factor de exposicion
Cuando nos referimos a la exposicion, no tenemos una definicion acotada de la misma. Considerando la exposicion no solo a retornos, sino a cualquier otro factor estimable de la estrategia o activo que estemos analizando, incluso una mezcla de ellas.
Estas serian algunas de los objetivos que deberias controlar la exposicion a los portfolio:
- ALpha (Desde el punto de vista del EV)
- Valor Nominal de la exposicion
- Exposicion al Riesgo como tal