En esta nueva entrega, vamos a crear estrategia de Ray Dalio (Bridgewater Associates), All Weather en Python. La primera entrega de portfolios en el blog fue la entrega de Portfolios de Darwinex en Python. La estrategia de Ray Dalio, All-Weather (tambien conocida como All-Seasons) es una estrategia de portfolios “casi” permanentes, y esta diseñada para todo tipo de escenarios económicos, tales como, crecimiento, inflación, recesión y deflación. La única diferencia mas notable con una cartera permanente, es que pondera los activos por una aproximación a “Risky Parity”.

Ciertos activos, tienden a minimizar la volatilidad frente a otros. Un claro ejemplo serian los bonos del tesoro americano, que suelen ser menos volátiles que la renta variable americana. Lo cual, si en un portfolio, ponderamos por igual todos los activos, los activos mas volátiles, tendrían una impacto mayor en la cartera, exagerando los retornos.
Una cartera “Risk Parity” intenta igualar el riesgo, ponderando mas los activos menos volátiles, y ponderando menos los mas volátiles.

No todo deben ser finanzas… Ray Dalio en el Burning Man 2019


La estrategia fue publicada por primera vez en el libro de Tony Robbins” Money, mastering the game”, con las siguientes allocations:

  • 30% US Equities
  • 15% Intermediate-term Treasuries
  • 40% Long Term Treasuries
  • 7.5% Commodities
  • 7.5% Gold
all weather
Ciclos economicos, y activos optimos para los mismos.

Para este estudio, utilizaremos ETFs. Si no tienes muy claro, que es un ETF, sus ventajas y riesgos, te recomiendo que pases por los siguientes artículos de Enric Jaimez (UnEspeculador.com): link1 link2 link3

  • US Equities (SPY)
  • Long Term Treasuries (TLT)
  • Intermediate-term Treasuries (IEF)
  • Commodities (DBC)
  • Gold (GLD)

Nota1: El backtest esta claramente sesgado, por el un ciclo alcista. En una estrategia de estas características, necesitaríamos un histórico desde 1960 hasta el día de hoy, para poder verificar la validez de la misma, yo lo he hecho, con datos propietarios, y la realidad es que, quedan mas o menos even contra un benchmark 40% renta fija, 60% renta variable, y minimiza algo la volatilidad anualizada. Pero a corto plazo, los resultados son los que son, y no se puede negar. ¿Es una mala estrategia? Yo no la usaría, pero últimamente he visto demasiada gente hablando de ella, y me ha parecido lo suficientemente curioso como para escribir estas lineas.¡

All Weather de Ray Dalio en Python

Para empezar, cargamos las librerias necesarias para poder backtestear la estrategia

In [73]:
import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
import quantstats as qt
%matplotlib inline

Descargamos las timeseries de las cotizaciones historicas de los activos, de una fuente gratuita como puede ser Yahoo

In [135]:
spy = yf.download('SPY')
tlt = yf.download('TLT')
ief = yf.download('IEF')
dbc = yf.download('DBC')
gld = yf.download('GLD')
splv = yf.download('SPLV')
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed

Asignamos los pesos a cada uno de los activos, segun el asset allocation que dio Ray Dalio en el libro "Money, Mastering The Game" de Tony Robbins.

In [125]:
peso_spy = 0.3
peso_tlt = 0.4
peso_ief = 0.15
peso_dbc = 0.075
peso_gld = 0.075

Creamos un dataframe, con los que nos interesa, en este caso, el porcentaje de cambio de los cierres ajustados para cada activo.

In [138]:
assets = pd.DataFrame()
assets['gld'] = gld['Adj Close'].pct_change()
assets['dbc'] = tlt['Adj Close'].pct_change()
assets['ief'] = ief['Adj Close'].pct_change()
assets['tlt'] = dbc['Adj Close'].pct_change()
assets['spy'] = spy['Adj Close'].pct_change()
assets['splv'] = splv['Adj Close'].pct_change()
assets = assets.dropna()

Y creamos los retornos de dicha composicion de cartera, multiplicando la ponderacion por el retorno y sumandolo a el resto de ponderaciones.

In [120]:
all_weather = peso_spy * assets['spy'] + \
peso_tlt * assets['tlt'] + \
peso_ief * assets['ief'] + \
peso_dbc * assets['dbc'] + \
peso_gld * assets['gld']
Crecimiento de 100.000$ invertidos en la estrategia All Weather de Ray Dalio desde 2006 hasta el dia de hoy

Es una estrategia ganadora, con muchísimo drawdown. Ahora vamos a analizar sus ratios en profundidad.

In [134]:
qt.reports.full(all_weather,"SPY")

Performance Metrics

                           Strategy    Benchmark
-------------------------  ----------  -----------
Start Period               2006-02-07  2006-02-07
End Period                 2019-12-24  2019-12-24
Risk-Free Rate             0.0%        0.0%
Time in Market             100.0%      100.0%

Cumulative Return          79.9%       236.82%
CAGR%                      4.32%       9.14%
Sharpe                     0.43        0.56
Sortino                    0.61        0.79
Max Drawdown               -38.63%     -55.19%
Longest DD Days            1310        1772
Volatility (ann.)          11.23%      18.83%
R^2                        0.53        0.53
Calmar                     0.11        0.17
Skew                       -0.16       0.15
Kurtosis                   6.45        15.95

Expected Daily %           0.02%       0.03%
Expected Monthly %         0.35%       0.73%
Expected Yearly %          4.28%       9.06%
Kelly Criterion            0.54%       3.69%
Risk of Ruin               0.0%        0.0%
Daily Value-at-Risk        -1.14%      -1.91%
Expected Shortfall (cVaR)  -1.78%      -1.78%

Payoff Ratio               0.89        0.87
Profit Factor              1.08        1.12
Common Sense Ratio         1.06        1.01
CPC Index                  0.51        0.54
Tail Ratio                 0.98        0.9
Outlier Win Ratio          5.36        3.62
Outlier Loss Ratio         5.53        3.53

MTD                        2.98%       2.7%
3M                         3.87%       8.22%
6M                         5.79%       10.3%
YTD                        17.79%      30.96%
1Y                         19.39%      35.98%
3Y (ann.)                  7.36%       14.68%
5Y (ann.)                  3.73%       11.27%
10Y (ann.)                 4.27%       13.35%
All-time (ann.)            4.32%       9.14%

Best Day                   6.27%       14.52%
Worst Day                  -4.48%      -9.84%
Best Month                 8.29%       10.92%
Worst Month                -16.25%     -16.52%
Best Year                  19.02%      32.31%
Worst Year                 -18.84%     -36.8%

Avg. Drawdown              -2.32%      -1.62%
Avg. Drawdown Days         57          24
Recovery Factor            2.07        4.29
Ulcer Index                1.02        1.02

Avg. Up Month              2.43%       3.38%
Avg. Down Month            -3.14%      -4.2%
Win Days %                 53.25%      55.26%
Win Month %                57.49%      68.67%
Win Quarter %              71.43%      75.0%
Win Year %                 71.43%      85.71%

Beta                       0.43        -
Alpha                      0.0         -
None

5 Worst Drawdowns

StartValleyEndDaysMax Drawdown99% Max Drawdown
12008-07-032009-03-032011-04-201021-38.634523-36.819824
22014-06-262016-01-202018-01-261310-26.883576-25.159584
32018-10-042018-12-242019-07-10279-13.369631-11.655631
42011-05-022011-10-032012-01-26269-9.206435-8.683408
52012-02-272012-06-212012-08-21176-8.206030-7.830688

Strategy Visualization

In [ ]:
 

Mientras que la estrategia ha ganado un 80% aproximadamente, el mercado ha hecho un 237%. Vemos un coste de oportunidad inasumible para cualquier inversor. La realidad es que a minimizado el drawdown, mientras el mercado ha tenido un drawdown máximo de 55%, la estrategia de Dalio tan solo un 38%, y también ha reducido la volatilidad analizada, mientras que el mercado ha tenido una volatilidad de un 19%, la estrategia de Dalio un 11%. Con una beta de 0.43.

Por consecuencia, tiene un alto coste de oportunidad esta estrategia en periodos alcistas, quizá sea mucho mas optimas en cualquier otra circunstancia de mercado, que no sea el ciclo alcista mas largo de toda la historia.

Agradecimientos a Ran Aroussi por sus fantásticas herramientas yfinance (descarga de dataframes con series de temporales de cotizaciones con fuente en Yahoo) y quantstats,donde hemos creado todas estas preciosas estadísticas!