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:
- WALCL representa la cantidad total de pasivos de la Reserva Federal, que incluye reservas bancarias y otros factores que ponen liquidez en el sistema.
- 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.
from openbb import obb
from pandas import DataFrameComo hemos mencionado, necesitamos dos modulos dentro de la libreria openbb, que llamaremos de la siguiente forma
obb.economy.fred_search()obb.economy.fred_series()
data = obb.economy.fred_series(["WALCL", "WLRRAL", "WDTGAL", "SP500"])
dataOBBject
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
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
obb.economy.fred_search("Wednesday Levels").to_df().head(3)
| series_id | title | observation_start | observation_end | frequency | frequency_short | units | units_short | seasonal_adjustment | seasonal_adjustment_short | last_updated | popularity | group_popularity | notes | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | WALCL | Assets: Total Assets: Total Assets (Less Elimi... | 2002-12-18 | 2024-08-14 | Weekly, As of Wednesday | W | Millions of U.S. Dollars | Mil. of U.S. $ | Not Seasonally Adjusted | NSA | 2024-08-15 15:37:22-05:00 | 94 | 94 | NaN |
| 1 | H41RESPPALDKNWW | Assets: Liquidity and Credit Facilities: Loans... | 2002-12-18 | 2024-08-14 | Weekly | W | Millions of U.S. Dollars | Mil. of U.S. $ | Not Seasonally Adjusted | NSA | 2024-08-15 15:37:01-05:00 | 76 | 76 | NaN |
| 2 | TREAST | Assets: Securities Held Outright: U.S. Treasur... | 2002-12-18 | 2024-08-14 | Weekly, As of Wednesday | W | Millions of U.S. Dollars | Mil. of U.S. $ |
Posteriormente, buscaremos las reverse repo leveles de los miercoles
obb.economy.fred_search("Wednesday Levels Reverse Repo").to_df().head(3)
| series_id | title | observation_start | observation_end | frequency | frequency_short | units | units_short | seasonal_adjustment | seasonal_adjustment_short | last_updated | notes | popularity | group_popularity | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | WLRRAL | Liabilities and Capital: Liabilities: Reverse ... | 2002-12-18 | 2024-08-14 | Weekly, As of Wednesday | W | Millions of U.S. Dollars | Mil. of U.S. $ | Not Seasonally Adjusted | NSA | 2024-08-15 15:37:49-05:00 | Reverse repurchase agreements are transactions... | 63 | 63 |
| 1 | WLRRAFOIAL | Liabilities and Capital: Liabilities: Reverse ... | 2002-12-18 | 2024-08-14 | Weekly, As of Wednesday | W | Millions of U.S. Dollars | Mil. of U.S. $ | Not Seasonally Adjusted | NSA | 2024-08-15 15:37:36-05:00 | Reverse repurchase agreements are transactions... | 40 | 40 |
| 2 | WLRRAOL | Liabilities and Capital: Liabilities: Reverse ... | 2002-12-18 | 2024-08-14 | Weekly, As of Wednesday | W | Millions of U.S. Dollars | Mil. of U.S. $ |
Y los niveles del Tesoro General de los miercoles
obb.economy.fred_search("Wednesday Levels Treasury General").to_df().head(3)
| series_id | title | observation_start | observation_end | frequency | frequency_short | units | units_short | seasonal_adjustment | seasonal_adjustment_short | last_updated | notes | popularity | group_popularity | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | WDTGAL | Liabilities and Capital: Liabilities: Deposits... | 2002-12-18 | 2024-08-14 | Weekly, As of Wednesday | W | Millions of U.S. Dollars | Mil. of U.S. $ | Not Seasonally Adjusted | NSA | 2024-08-15 15:38:33-05:00 | This account is the primary operational accoun... | 64 | 64 |
| 1 | D2WLTGAL | Liabilities and Capital: Liabilities: Deposits... | 2002-12-18 | 2024-08-14 | Weekly, As of Wednesday | W | Millions of U.S. Dollars | Mil. of U.S. $ | Not Seasonally Adjusted | NSA | 2024-08-15 15:38:37-05:00 | NaN | 60 | 60 |
| 2 | WLDLCL | Liabilities and Capital: Liabilities: Deposits... | 2002-12-18 | 2024-08-14 | Weekly, As of Wednesday | W | Millions of U.S. Dollars | Mil. of U.S. $ | Not Seasonally Adjusted |
Y el precio del S&P500
obb.economy.fred_search("SP500").to_df().head(2)
| series_id | title | observation_start | observation_end | frequency | frequency_short | units | units_short | seasonal_adjustment | seasonal_adjustment_short | last_updated | notes | popularity | group_popularity | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | SP500 | S&P 500 | 2014-08-22 | 2024-08-21 | Daily, Close | D | Index | Index | Not Seasonally Adjusted |
Printeamos los metadatos
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
data.to_df().head(4)
data.to_df().dropna().head(4)
liquidity_index = DataFrame(data.to_df().dropna())
| WALCL | WLRRAL | WDTGAL | SP500 | |
|---|---|---|---|---|
| date | ||||
| 2002-12-18 | 719542.0 | 21905.0 | 6595.0 | NaN |
| 2002-12-25 | 732059.0 | 20396.0 | 4662.0 | NaN |
| 2003-01-01 | 730994.0 | 21091.0 | 4420.0 | NaN |
| 2003-01-08 | 723762.0 | 18709.0 | 5490.0 | NaN |
| WALCL | WLRRAL | WDTGAL | SP500 | |
|---|---|---|---|---|
| date | ||||
| 2014-08-27 | 4413736.0 | 282002.0 | 29547.0 | 2000.12 |
| 2014-09-03 | 4415587.0 | 250306.0 | 21036.0 | 2000.72 |
| 2014-09-10 | 4421408.0 | 267602.0 | 31872.0 | 1995.69 |
| 2014-09-17 | 4449588.0 | 252224.0 | 123965.0 | 2001.57 |
Organizamos el Dataframe Final
liquidity_index["USD Liquidity Index"] = (
liquidity_index["WALCL"] - liquidity_index["WLRRAL"] - liquidity_index["WDTGAL"]
)
liquidity_index.tail(4)
| WALCL | WLRRAL | WDTGAL | SP500 | USD Liquidity Index | |
|---|---|---|---|---|---|
| date | |||||
| 2024-07-24 | 7205455.0 | 805967.0 | 767419.0 | 5427.13 | 5632069.0 |
| 2024-07-31 | 7178391.0 | 813261.0 | 854001.0 | 5522.30 | 5511129.0 |
| 2024-08-07 | 7175256.0 | 681881.0 | 785233.0 | 5199.50 | 5708142.0 |
| 2024-08-14 | 7177688.0 | 722198.0 | 788823.0 | 5455.21 | 5666667.0 |
Ploteamos usando Plotly y normalizando los datos para que puedan ser comparables
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)
| USD Liquidity Index | SP500 | |
|---|---|---|
| date | ||
| 2024-07-31 | 0.643578 | 0.970490 |
| 2024-08-07 | 0.698835 | 0.885139 |
| 2024-08-14 | 0.687202 | 0.952750 |
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,
)