En la rutaLiquidez3/3

Calcular la liquidez del USD de forma aproximada

Índice aproximado de liquidez del dólar (WALCL − RRP − TGA) con series de FRED descargadas vía OpenBB y comparado con el S&P 500.

Research-0015Actualizado 5 min

Fig. — Liquidez neta del USD: balance de la Fed menos TGA y RRP (ilustrativo)
Índice

Que es el USD Liquidity Index

El USD Liquidity Index es una medida que indica los dolares disponibles en el mercado. Este indice indica la facilidad de los bancos y las empresas de acceder a dolares para sus actividades.

Cuando existe una alta disponibilidad de dolares, usualmente los tipos de interes suelen ser bajos, y en contra cuando la liquidez es baja,aumenta las tasas de interes, dificultado el acceso a la financiacion.

Los factores implicados en este indice son las politicas monetarias de la Reserva Federal de los Estados Unidos, las condiciones economicas globales, y la demanda global de dolares

La formula la definicmos como:

WALCL (All Liabilities) – WLRRAL (RRP) – WDTGAL (TGA)

Siendo:

  1. WALCL representa la cantidad total de pasivos de la Reserva Federal, que incluye reservas bancarias y otros factores que ponen liquidez en el sistema.
  2. WLRRAL (RRP) y WDTGAL (TGA) son mecanismos que drenan o retiran liquidez del sistema. Al restarlos, estás eliminando las operaciones que disminuyen la cantidad de dólares disponibles en el sistema financiero.

Resultado: La diferencia neta te proporciona una medida de la liquidez disponible en el sistema financiero de EE.UU. Cuanto mayor sea el número, mayor es la cantidad de dinero que circula en el sistema.

Calculando el Usd Liquidity Index en Python

Para obetener estas series, utilizaremos openbb, en especial la extension openbb-fred y la extension openbb-economy. El primer paso es importar todas las librerias necesarias.

IN [01]python
from openbb import obb
from pandas import DataFrame

Como hemos mencionado, necesitamos dos modulos dentro de la libreria openbb, que llamaremos de la siguiente forma

  • obb.economy.fred_search()
  • obb.economy.fred_series()
IN [02]python
data = obb.economy.fred_series(["WALCL", "WLRRAL", "WDTGAL", "SP500"])
data

OBBject

id: 066c7874-2012-7189-8000-1e79898a8a3c
results: [{'date': datetime.date(2002, 12, 18), 'WALCL': 719542.0, 'WLRRAL': 21905....
provider: fred
warnings: None
chart: None
extra: {'results_metadata': {'WALCL': {'title': 'Assets: Total Assets: Total Assets...

Para acceder a los metadatos

IN [03]python
metadata = data.extra["results_metadata"]

metadata.keys()
metadata["WALCL"].get("title") 
metadata["WALCL"].get("units")

dict_keys(['WALCL', 'WLRRAL', 'WDTGAL', 'SP500'])'Assets: Total Assets: Total Assets (Less Eliminations from Consolidation): Wednesday Level''Millions of U.S. Dollars'

Buscando y obteniendo indices desde FRED

Primero, vamos a buscar los indices de los niveles de los miercoles

IN [04]python
obb.economy.fred_search("Wednesday Levels").to_df().head(3)
OUT [04]
series_idtitleobservation_startobservation_endfrequencyfrequency_shortunitsunits_shortseasonal_adjustmentseasonal_adjustment_shortlast_updatedpopularitygroup_popularitynotes
0WALCLAssets: Total Assets: Total Assets (Less Elimi...2002-12-182024-08-14Weekly, As of WednesdayWMillions of U.S. DollarsMil. of U.S. $Not Seasonally AdjustedNSA2024-08-15 15:37:22-05
9494NaN
1H41RESPPALDKNWWAssets: Liquidity and Credit Facilities: Loans...2002-12-182024-08-14WeeklyWMillions of U.S. DollarsMil. of U.S. $Not Seasonally AdjustedNSA2024-08-15 15:37:01-05
7676NaN
2TREASTAssets: Securities Held Outright: U.S. Treasur...2002-12-182024-08-14Weekly, As of WednesdayWMillions of U.S. DollarsMil. of U.S. $

Posteriormente, buscaremos las reverse repo leveles de los miercoles

IN [05]python

obb.economy.fred_search("Wednesday Levels Reverse Repo").to_df().head(3)
OUT [05]
series_idtitleobservation_startobservation_endfrequencyfrequency_shortunitsunits_shortseasonal_adjustmentseasonal_adjustment_shortlast_updatednotespopularitygroup_popularity
0WLRRALLiabilities and Capital: Liabilities: Reverse ...2002-12-182024-08-14Weekly, As of WednesdayWMillions of U.S. DollarsMil. of U.S. $Not Seasonally AdjustedNSA2024-08-15 15:37:49-05
Reverse repurchase agreements are transactions...6363
1WLRRAFOIALLiabilities and Capital: Liabilities: Reverse ...2002-12-182024-08-14Weekly, As of WednesdayWMillions of U.S. DollarsMil. of U.S. $Not Seasonally AdjustedNSA2024-08-15 15:37:36-05
Reverse repurchase agreements are transactions...4040
2WLRRAOLLiabilities and Capital: Liabilities: Reverse ...2002-12-182024-08-14Weekly, As of WednesdayWMillions of U.S. DollarsMil. of U.S. $

Y los niveles del Tesoro General de los miercoles

IN [06]python
obb.economy.fred_search("Wednesday Levels Treasury General").to_df().head(3)
OUT [06]
series_idtitleobservation_startobservation_endfrequencyfrequency_shortunitsunits_shortseasonal_adjustmentseasonal_adjustment_shortlast_updatednotespopularitygroup_popularity
0WDTGALLiabilities and Capital: Liabilities: Deposits...2002-12-182024-08-14Weekly, As of WednesdayWMillions of U.S. DollarsMil. of U.S. $Not Seasonally AdjustedNSA2024-08-15 15:38:33-05
This account is the primary operational accoun...6464
1D2WLTGALLiabilities and Capital: Liabilities: Deposits...2002-12-182024-08-14Weekly, As of WednesdayWMillions of U.S. DollarsMil. of U.S. $Not Seasonally AdjustedNSA2024-08-15 15:38:37-05
NaN6060
2WLDLCLLiabilities and Capital: Liabilities: Deposits...2002-12-182024-08-14Weekly, As of WednesdayWMillions of U.S. DollarsMil. of U.S. $Not Seasonally Adjusted

Y el precio del S&P500

IN [07]python
obb.economy.fred_search("SP500").to_df().head(2)
OUT [07]
series_idtitleobservation_startobservation_endfrequencyfrequency_shortunitsunits_shortseasonal_adjustmentseasonal_adjustment_shortlast_updatednotespopularitygroup_popularity
0SP500S&P 5002014-08-222024-08-21Daily, CloseDIndexIndexNot Seasonally Adjusted

Printeamos los metadatos

IN [08]python
for id in metadata:
    display(f"{id}: {metadata[id]['units']}")

'WALCL: Millions of U.S. Dollars''WLRRAL: Millions of U.S. Dollars''WDTGAL: Millions of U.S. Dollars''SP500: Index'

Y generamos el Liquidity Index

IN [09]python
data.to_df().head(4)
data.to_df().dropna().head(4)
liquidity_index = DataFrame(data.to_df().dropna())
OUT [09]
WALCLWLRRALWDTGALSP500
date
---------------
2002-12-18719542.021905.06595.0NaN
2002-12-25732059.020396.04662.0NaN
2003-01-01730994.021091.04420.0NaN
2003-01-08723762.018709.05490.0NaN
WALCLWLRRALWDTGALSP500
date
---------------
2014-08-274413736.0282002.029547.02000.12
2014-09-034415587.0250306.021036.02000.72
2014-09-104421408.0267602.031872.01995.69
2014-09-174449588.0252224.0123965.02001.57

Organizamos el Dataframe Final

IN [10]python
liquidity_index["USD Liquidity Index"] = (
    liquidity_index["WALCL"] - liquidity_index["WLRRAL"] - liquidity_index["WDTGAL"]
)
liquidity_index.tail(4)
OUT [10]
WALCLWLRRALWDTGALSP500USD Liquidity Index
date
------------------
2024-07-247205455.0805967.0767419.05427.135632069.0
2024-07-317178391.0813261.0854001.05522.305511129.0
2024-08-077175256.0681881.0785233.05199.505708142.0
2024-08-147177688.0722198.0788823.05455.215666667.0

Ploteamos usando Plotly y normalizando los datos para que puedan ser comparables

IN [11]python
y_axis = liquidity_index[["USD Liquidity Index", "SP500"]]


def absolute_maximum_scale(series):
    return series / series.abs().max()


def min_max_scaling(series):
    return (series - series.min()) / (series.max() - series.min())


def z_score_standardization(series):
    return (series - series.mean()) / series.std()


methods = {
    "z": z_score_standardization,
    "m": min_max_scaling,
    "a": absolute_maximum_scale,
}


def normalize(data: DataFrame, method: str = "z") -> DataFrame:
    for col in data.columns:
        data.loc[:, col] = methods[f"{method}"](data.loc[:, col])

    return data


normalized = normalize(y_axis, method="m")

normalized.tail(3)
OUT [11]
USD Liquidity IndexSP500
date
---------
2024-07-310.6435780.970490
2024-08-070.6988350.885139
2024-08-140.6872020.952750
IN [12]python
import pandas as pd

pd.options.plotting.backend = "plotly"
normalized.plot()



fig = go.Figure()

fig.add_scatter(
    x=normalized.index, y=normalized["USD Liquidity Index"], name="USD Liquidity Index"
)

fig.add_scatter(x=normalized.index, y=normalized["SP500"], name="S&P 500 Index")

fig.update_layout(
    title="USD Liquidity Index vs. S&P 500 Index (Normalized)",
    title_y=0.90,
    title_x=0.5,
    autosize=True,
)

Related posts: Liquidez Order Book: Trading Liquidez Agregada · Bancos Centrales y Politica Monetaria en Python.

¿Has visto un error? Avísanos

Escrito por

Inversor desde 2014. Research desde 2017. He trabajado en diferentes gestoras de capital y Hedgefunds Crypto. Apasionado del codigo, los datos y las finanzas. Actualmente localizado en Ucrania.