import pandas as pd
import pandas_market_calendars as mcal
from datetime import date
import numpy as np
import matplotlib.pyplot as plt
import math
import time
import statsmodels.api as sm
import seaborn as sns
import datetime as dt
import pymc as pm
import arviz as az
C:\Users\isaxonov_rdy\AppData\Local\miniforge3\envs\sfr\Lib\site-packages\arviz\__init__.py:50: FutureWarning: 
ArviZ is undergoing a major refactor to improve flexibility and extensibility while maintaining a user-friendly interface.
Some upcoming changes may be backward incompatible.
For details and migration guidance, visit: https://python.arviz.org/en/latest/user_guide/migration_guide.html
  warn(

Read the CSV and convert dates to datetime

df = pd.read_csv("funding_liquidity_inputs.csv")
date_format = '%Y%m%d'
df["date"] = pd.to_datetime(df["date"], format=date_format, errors="coerce")

Create features and output

df["sofr_iorb_diff"] = df["sofr_rate"] - df["iorb"]
df["total_rrp"] =  df["rrp_total_bil"] # + df["rrp_foreign_bil"]
df["leverage_ratio"] = df["sofr_vol"] / (df["reserves"] + df["total_rrp"])
df = sm.add_constant(df)

Slice data to just this past year, and take differences of all the data

dfdiff = df

dfdiff["sofr_iorb_diff_diff"] = dfdiff["sofr_iorb_diff"].diff()
dfdiff["rrp_total_bil_diff"] = dfdiff["rrp_total_bil"].diff()
dfdiff["leverage_ratio_diff"] = dfdiff["leverage_ratio"].diff()
dfdiff["reserves_diff"] = dfdiff["reserves"].diff()

dfdiff = dfdiff.dropna()

start = dfdiff["date"].searchsorted(dt.datetime(2025,1,1))
dfdiff = dfdiff.iloc[start:]

Rolling mean to smooth our data

window = 30

dfdiff["rolling_sofr_iorb_diff_diff"] = dfdiff["sofr_iorb_diff_diff"].rolling(window=window).mean()
dfdiff["rolling_leverage_ratio_diff"] = dfdiff["leverage_ratio_diff"].rolling(window=window).mean()
dfdiff["rolling_rrp_total_bil_diff"] = dfdiff["rrp_total_bil_diff"].rolling(window=window).mean()
dfdiff["rolling_reserves_diff"] = dfdiff["reserves_diff"].rolling(window=window).mean()

dfdiff = dfdiff.dropna()

Normalize our data with z-scoring

def normalize(df, x):
    return [(df[x] - df[x].mean())/(df[x].std()), df[x].mean(), df[x].std()]
dfdiff["norm_leverage_ratio_diff"], leverage_mean, leverage_std = normalize(dfdiff, "leverage_ratio_diff")
dfdiff["norm_reserves_diff"], reserves_mean, reserves_std  = normalize(dfdiff, "reserves_diff")
dfdiff["norm_rrp_total_bil_diff"], rrp_mean, rrp_std = normalize(dfdiff, "rrp_total_bil_diff")
dfdiff["norm_sofr_iorb_diff_diff"], sofr_iorb_mean, sofr_iorb_std = normalize(dfdiff, "sofr_iorb_diff_diff")
input_df = dfdiff[['norm_leverage_ratio_diff', 'norm_reserves_diff', 'norm_rrp_total_bil_diff', 'const']]
model = sm.OLS(dfdiff["norm_sofr_iorb_diff_diff"], input_df)
results = model.fit()
print(results.summary())
                               OLS Regression Results                               
====================================================================================
Dep. Variable:     norm_sofr_iorb_diff_diff   R-squared:                       0.360
Model:                                  OLS   Adj. R-squared:                  0.352
Method:                       Least Squares   F-statistic:                     45.57
Date:                      Wed, 11 Feb 2026   Prob (F-statistic):           2.10e-23
Time:                              16:17:38   Log-Likelihood:                -294.85
No. Observations:                       247   AIC:                             597.7
Df Residuals:                           243   BIC:                             611.7
Df Model:                                 3                                         
Covariance Type:                  nonrobust                                         
============================================================================================
                               coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------------
norm_leverage_ratio_diff     0.5792      0.056     10.302      0.000       0.468       0.690
norm_reserves_diff           0.2707      0.056      4.871      0.000       0.161       0.380
norm_rrp_total_bil_diff      0.1999      0.052      3.844      0.000       0.097       0.302
const                    -1.388e-17      0.051  -2.71e-16      1.000      -0.101       0.101
==============================================================================
Omnibus:                       33.098   Durbin-Watson:                   2.154
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              138.310
Skew:                          -0.404   Prob(JB):                     9.26e-31
Kurtosis:                       6.576   Cond. No.                         1.55
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
az.plot_density(dfdiff["norm_sofr_iorb_diff_diff"])
array([[<Axes: title={'center': 'x'}>]], dtype=object)

dfdiff["end-of-month"] = 0
start_date = dfdiff["date"].min()
end_date = dfdiff["date"].max()
month_ends = pd.date_range(start=start_date, end=end_date, freq='ME')
month_ends
DatetimeIndex(['2025-02-28', '2025-03-31', '2025-04-30', '2025-05-31',
               '2025-06-30', '2025-07-31', '2025-08-31', '2025-09-30',
               '2025-10-31', '2025-11-30', '2025-12-31', '2026-01-31'],
              dtype='datetime64[ns]', freq='ME')
(dfdiff["date"].to_numpy()[31] in month_ends)
True
dfdiff.loc[dfdiff["date"].isin(month_ends), "end-of-month"] = 1
dfdiff.loc[dfdiff["date"].isin([date(2025,11,28), date(2025,8,29), date(2025,5,30)]), "end-of-month"] = 1
C:\Users\isaxonov_rdy\AppData\Local\Temp\ipykernel_7552\395586811.py:2: FutureWarning: The behavior of 'isin' with dtype=datetime64[ns] and castable values (e.g. strings) is deprecated. In a future version, these will not be considered matching by isin. Explicitly cast to the appropriate dtype before calling isin instead.
  dfdiff.loc[dfdiff["date"].isin([date(2025,11,28), date(2025,8,29), date(2025,5,30)]), "end-of-month"] = 1
dfdiff["date"].describe()
count                              247
mean     2025-08-10 04:10:41.295546624
min                2025-02-13 00:00:00
25%                2025-05-13 12:00:00
50%                2025-08-08 00:00:00
75%                2025-11-05 12:00:00
max                2026-02-06 00:00:00
Name: date, dtype: object
with pm.Model(coords={"day":dfdiff["date"]}) as model:
    leverage = pm.Data("leverage", dfdiff["norm_leverage_ratio_diff"], dims="day")
    reserves = pm.Data("reserves", dfdiff["norm_reserves_diff"], dims="day")
    rrp = pm.Data("rrp", dfdiff["norm_rrp_total_bil_diff"], dims="day")
    end_of_month = pm.Data("end_of_month", dfdiff["end-of-month"], dims="day")

    alpha = pm.Normal("alpha", 0, 0.05)
    
    beta_leverage = pm.Normal("beta_leverage", 1, 0.5)
    beta_reserves = pm.Normal("beta_reserves", -0.1, 0.5)
    beta_rrp = pm.Normal("beta_rrp", 0, 0.5)
    beta_end_of_month = pm.Normal("beta_end_of_month", 1, 1.5)

    sigma = pm.Exponential("sigma", lam=0.5)

    mu = alpha + (beta_leverage + beta_end_of_month * end_of_month) * leverage + beta_reserves * reserves + beta_rrp * rrp
    y_hat = pm.Normal("y_hat", mu=mu, sigma=sigma, observed=dfdiff["norm_sofr_iorb_diff_diff"], dims="day")
model.debug(verbose=True)
point={'alpha': array(0.), 'beta_leverage': array(1.), 'beta_reserves': array(-0.1), 'beta_rrp': array(0.), 'beta_end_of_month': array(1.), 'sigma_log__': array(0.69314718)}

No problems found
with model:
    idata=pm.sample(nuts_sampler="nutpie")
C:\Users\isaxonov_rdy\AppData\Local\miniforge3\envs\sfr\Lib\site-packages\threadpoolctl.py:1226: RuntimeWarning: 
Found Intel OpenMP ('libiomp') and LLVM OpenMP ('libomp') loaded at
the same time. Both libraries are known to be incompatible and this
can cause random crashes or deadlocks on Linux when loaded in the
same Python program.
Using threadpoolctl may cause crashes or deadlocks. For more
information and possible workarounds, please see
    https://github.com/joblib/threadpoolctl/blob/master/multiple_openmp.md

  warnings.warn(msg, RuntimeWarning)

Sampler Progress

Total Chains: 4

Active Chains: 0

Finished Chains: 4

Sampling for now

Estimated Time to Completion: now

Progress Draws Divergences Step Size Gradients/Draw
2000 0 0.81 3
2000 0 0.84 3
2000 0 0.79 7
2000 0 0.80 7
model.to_graphviz()

Sampling our prior distribution to see if it aligns with our data.

with model:
    prior = pm.sample_prior_predictive()
Sampling: [alpha, beta_end_of_month, beta_leverage, beta_reserves, beta_rrp, sigma, y_hat]
fig, ax = plt.subplots();

dfdiff["norm_sofr_iorb_diff_diff"].plot(ax=ax);
ax.plot(dfdiff.index,prior.prior_predictive.y_hat.sel(chain=0, draw=1), alpha = 0.25);

Not great but not terrible

pm.plot_trace(idata)
plt.tight_layout()
plt.show();

with model:
    idata=pm.sample_posterior_predictive(idata, extend_inferencedata=True)
    pm.compute_log_likelihood(idata)
Sampling ... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   0% -:--:-- / 0:00:00


pm.plot_ppc(idata)

Perhaps we should use a generalized normal distribution here- it looks like we want our posterior predictive to be slightly less kurtotic…

pm.plot_ppc(idata)
C:\Users\isaxonov_rdy\AppData\Local\miniforge3\envs\sfr\Lib\site-packages\IPython\core\events.py:96: UserWarning: Creating legend with loc="best" can be slow with large amounts of data.
  func(*args, **kwargs)
C:\Users\isaxonov_rdy\AppData\Local\miniforge3\envs\sfr\Lib\site-packages\IPython\core\pylabtools.py:170: UserWarning: Creating legend with loc="best" can be slow with large amounts of data.
  fig.canvas.print_figure(bytes_io, **kw)

idata
arviz.InferenceData
    • <xarray.Dataset> Size: 200kB
      Dimensions:        (chain: 4, draw: 1000)
      Coordinates:
        * chain          (chain) int64 32B 0 1 2 3
        * draw           (draw) int64 8kB 0 1 2 3 4 5 6 ... 994 995 996 997 998 999
      Data variables:
          alpha          (chain, draw) float64 32kB -0.03466 0.03224 ... 0.01315
          beta_leverage  (chain, draw) float64 32kB 0.6218 0.7952 ... 0.6892 0.7543
          beta_reserves  (chain, draw) float64 32kB 0.0547 0.2745 ... 0.09361 0.09422
          beta_rrp       (chain, draw) float64 32kB 0.1009 0.1178 ... 0.0352 0.1103
          sigma_log__    (chain, draw) float64 32kB -0.2758 -0.2878 ... -0.3154
          sigma          (chain, draw) float64 32kB 0.7589 0.7499 ... 0.6958 0.7295
      Attributes:
          created_at:                 2026-02-10T18:34:29.476208+00:00
          arviz_version:              0.23.4
          inference_library:          nutpie
          inference_library_version:  0.16.5
          sampling_time:              0.16512465476989746
          tuning_steps:               1000

    • <xarray.Dataset> Size: 8MB
      Dimensions:  (chain: 4, draw: 1000, day: 247)
      Coordinates:
        * chain    (chain) int64 32B 0 1 2 3
        * draw     (draw) int64 8kB 0 1 2 3 4 5 6 7 ... 993 994 995 996 997 998 999
        * day      (day) datetime64[ns] 2kB 2025-02-13 2025-02-14 ... 2026-02-06
      Data variables:
          y_hat    (chain, draw, day) float64 8MB -1.904 0.07099 ... -0.5723 -0.3517
      Attributes:
          created_at:                 2026-02-10T18:34:55.625717+00:00
          arviz_version:              0.23.4
          inference_library:          pymc
          inference_library_version:  5.27.1

    • <xarray.Dataset> Size: 8MB
      Dimensions:  (chain: 4, draw: 1000, day: 247)
      Coordinates:
        * chain    (chain) int64 32B 0 1 2 3
        * draw     (draw) int64 8kB 0 1 2 3 4 5 6 7 ... 993 994 995 996 997 998 999
        * day      (day) datetime64[ns] 2kB 2025-02-13 2025-02-14 ... 2026-02-06
      Data variables:
          y_hat    (chain, draw, day) float64 8MB -1.778 -0.6509 ... -0.6227 -0.6189
      Attributes:
          created_at:                 2026-02-10T18:34:55.856763+00:00
          arviz_version:              0.23.4
          inference_library:          pymc
          inference_library_version:  5.27.1

    • <xarray.Dataset> Size: 340kB
      Dimensions:               (chain: 4, draw: 1000)
      Coordinates:
        * chain                 (chain) int64 32B 0 1 2 3
        * draw                  (draw) int64 8kB 0 1 2 3 4 5 ... 995 996 997 998 999
      Data variables: (12/13)
          depth                 (chain, draw) uint64 32kB 3 3 2 3 2 2 ... 2 3 3 3 3 2
          maxdepth_reached      (chain, draw) bool 4kB False False ... False False
          index_in_trajectory   (chain, draw) int64 32kB 3 4 -2 -2 -2 ... 4 -5 6 5 -1
          logp                  (chain, draw) float64 32kB -281.1 -279.2 ... -279.7
          energy                (chain, draw) float64 32kB 282.5 283.4 ... 284.6 284.0
          energy_error          (chain, draw) float64 32kB 0.01677 0.1483 ... -0.2772
          ...                    ...
          step_size_bar         (chain, draw) float64 32kB 0.7936 0.7936 ... 0.8091
          mean_tree_accept      (chain, draw) float64 32kB 0.9377 0.7526 ... 0.8853
          mean_tree_accept_sym  (chain, draw) float64 32kB 0.9668 0.8437 ... 0.8585
          n_steps               (chain, draw) uint64 32kB 7 7 7 7 3 7 ... 7 7 7 7 7 7
          tuning                (chain, draw) bool 4kB False False ... False False
          diverging             (chain, draw) bool 4kB False False ... False False
      Attributes:
          created_at:     2026-02-10T18:34:29.450563+00:00
          arviz_version:  0.23.4

    • <xarray.Dataset> Size: 4kB
      Dimensions:  (day: 247)
      Coordinates:
        * day      (day) datetime64[ns] 2kB 2025-02-13 2025-02-14 ... 2026-02-06
      Data variables:
          y_hat    (day) float64 2kB -2.232 -1.062 0.6285 ... -0.2816 -0.5417 -0.2816
      Attributes:
          created_at:                 2026-02-10T18:34:29.475204+00:00
          arviz_version:              0.23.4
          inference_library:          pymc
          inference_library_version:  5.27.1

    • <xarray.Dataset> Size: 8kB
      Dimensions:   (day: 247)
      Coordinates:
        * day       (day) datetime64[ns] 2kB 2025-02-13 2025-02-14 ... 2026-02-06
      Data variables:
          leverage  (day) float64 2kB -1.069 -1.228 -0.2134 ... -0.5865 -0.5959
          reserves  (day) float64 2kB -0.1624 -0.1624 -0.1624 ... 0.01753 0.01753
          rrp       (day) float64 2kB -3.769 -1.585 -1.376 ... 0.2508 0.2592 0.2299
      Attributes:
          created_at:                 2026-02-10T18:34:29.471195+00:00
          arviz_version:              0.23.4
          inference_library:          pymc
          inference_library_version:  5.27.1

    • <xarray.Dataset> Size: 200kB
      Dimensions:        (chain: 4, draw: 1000)
      Coordinates:
        * chain          (chain) int64 32B 0 1 2 3
        * draw           (draw) int64 8kB 0 1 2 3 4 5 6 ... 994 995 996 997 998 999
      Data variables:
          alpha          (chain, draw) float64 32kB -0.101 -0.101 ... 0.007163
          beta_leverage  (chain, draw) float64 32kB 0.3314 0.3314 ... 0.8766 0.9102
          beta_reserves  (chain, draw) float64 32kB -0.06851 -0.06851 ... 0.3301
          beta_rrp       (chain, draw) float64 32kB 0.03469 0.03469 ... 0.0375 0.04218
          sigma_log__    (chain, draw) float64 32kB 0.3867 0.3867 ... -0.296 -0.2535
          sigma          (chain, draw) float64 32kB 1.472 1.472 ... 0.7438 0.7761
      Attributes:
          created_at:     2026-02-10T18:34:29.443305+00:00
          arviz_version:  0.23.4

    • <xarray.Dataset> Size: 340kB
      Dimensions:               (chain: 4, draw: 1000)
      Coordinates:
        * chain                 (chain) int64 32B 0 1 2 3
        * draw                  (draw) int64 8kB 0 1 2 3 4 5 ... 995 996 997 998 999
      Data variables: (12/13)
          depth                 (chain, draw) uint64 32kB 4 0 3 3 0 1 ... 2 3 2 2 1 2
          maxdepth_reached      (chain, draw) bool 4kB False False ... False False
          index_in_trajectory   (chain, draw) int64 32kB 12 0 7 -7 0 0 ... -3 1 -3 0 3
          logp                  (chain, draw) float64 32kB -363.5 -363.5 ... -278.8
          energy                (chain, draw) float64 32kB 578.6 364.3 ... 284.3 280.3
          energy_error          (chain, draw) float64 32kB -0.9422 0.0 ... 0.0 -0.1128
          ...                    ...
          step_size_bar         (chain, draw) float64 32kB 1.179 0.3955 ... 0.8091
          mean_tree_accept      (chain, draw) float64 32kB 0.8905 0.0 ... 0.541 0.8791
          mean_tree_accept_sym  (chain, draw) float64 32kB 0.522 0.0 ... 0.701 0.9106
          n_steps               (chain, draw) uint64 32kB 31 1 7 7 1 3 ... 7 7 7 7 3 3
          tuning                (chain, draw) bool 4kB True True True ... True True
          diverging             (chain, draw) bool 4kB False True ... False False
      Attributes:
          created_at:     2026-02-10T18:34:29.459145+00:00
          arviz_version:  0.23.4

pred_mean = idata.posterior_predictive.y_hat.mean(dim=["draw", "chain"]).to_numpy()
r2_data = az.r2_score(dfdiff["norm_sofr_iorb_diff_diff"].to_numpy(), pred_mean)
print(r2_data)
r2        0.365583
r2_std    0.000000
dtype: float64
r2_data = az.r2_score(dfdiff["norm_sofr_iorb_diff_diff"].to_numpy(), pred_mean)
print(r2_data)
r2        0.365583
r2_std    0.000000
dtype: float64
# 1. Get your observed data
y_obs = dfdiff["norm_sofr_iorb_diff_diff"].to_numpy()

# 2. Extract y_hat and flatten the chain/draw dimensions
# .stack(sample=("chain", "draw")) merges the first two dimensions
# .transpose("sample", ...) ensures the samples are the first dimension
y_pred = idata.posterior_predictive.y_hat.stack(sample=("chain", "draw")).transpose("sample", ...)

# 3. Pass to r2_score
r2_results = az.r2_score(y_obs, y_pred.values)

print(r2_results)
r2        0.441476
r2_std    0.026424
dtype: float64
# 1. Get your observed data
y_obs = dfdiff["norm_sofr_iorb_diff_diff"].to_numpy()

# 2. Extract y_hat and flatten the chain/draw dimensions
# .stack(sample=("chain", "draw")) merges the first two dimensions
# .transpose("sample", ...) ensures the samples are the first dimension
y_pred = idata.posterior_predictive.y_hat.stack(sample=("chain", "draw")).transpose("sample", ...)

# 3. Pass to r2_score
r2_results = az.r2_score(y_obs, y_pred.values)

print(r2_results)
r2        0.439907
r2_std    0.026064
dtype: float64
dfdiff.loc[1350]
const                                               1.0
date                                2025-05-27 00:00:00
sofr_rate                                          4.31
iorb                                                4.4
reserves                                      3289469.0
rrp_on_bil                                      138.066
rrp_foreign_mm                                 371341.0
sofr_vol                                         2655.0
tgcr_vol                                         1025.0
rrp_foreign_bil                                 371.341
rrp_total_bil                                   509.407
repo_vol_total                                   3680.0
sofr_iorb_diff                                    -0.09
total_rrp                                       509.407
leverage_ratio                                 0.000807
sofr_iorb_diff_diff                                0.05
rrp_total_bil_diff                              -16.775
leverage_ratio_diff                            0.000034
reserves_diff                                       0.0
rolling_sofr_iorb_diff_diff                   -0.000667
rolling_leverage_ratio_diff                    0.000002
rolling_rrp_total_bil_diff                     1.491267
rolling_reserves_diff                      -6173.766667
norm_rolling_leverage_ratio_diff               0.240395
norm_rolling_reserves_diff                    -0.943992
norm_rolling_rrp_total_bil_diff                0.667187
norm_rolling_sofr_iorb_diff_diff              -0.411636
Name: 1350, dtype: object

Inference

input_leverage = 0.000002
norm_leverage = (input_leverage - leverage_mean)/(leverage_std)

input_reserves = 1.491267
norm_reserves = (input_reserves - reserves_mean)/(reserves_std)

input_rrp = -6173.766667
norm_rrp = (input_rrp - rrp_mean)/(rrp_std)

target_sofr_iorb = -0.000667
norm_target_sofr_iorb = (target_sofr_iorb - sofr_iorb_mean)/(sofr_iorb_std)

input_data = [norm_leverage, norm_reserves, norm_rrp, 1]

input_data = [0.240395, -0.943992, 0.667187, 1]

input_matrix = np.stack(input_data)
input_matrix.shape
(4,)
beta_leverage = idata.posterior["beta_leverage"].values.ravel()
beta_reserves = idata.posterior["beta_reserves"].values.ravel()
beta_rrp = idata.posterior["beta_rrp"].values.ravel()
alpha = idata.posterior["alpha"].values.ravel()

beta_leverage
array([0.62178427, 0.79520919, 0.85059116, ..., 0.85020105, 0.68924423,
       0.75431369], shape=(4000,))
arrays = [beta_leverage, beta_reserves, beta_rrp, alpha]
matrix = np.stack(arrays)
matrix.shape
(4, 4000)
mult_matrix = input_matrix[:, None] * matrix
matrix
array([[ 0.62178427,  0.79520919,  0.85059116, ...,  0.85020105,
         0.68924423,  0.75431369],
       [ 0.054698  ,  0.27447922,  0.2449931 , ...,  0.2338219 ,
         0.09361395,  0.09421615],
       [ 0.10089523,  0.1177578 ,  0.05479198, ...,  0.09184013,
         0.03519808,  0.11025619],
       [-0.03466254,  0.03224332,  0.05949509, ..., -0.05404182,
         0.03384539,  0.01315091]], shape=(4, 4000))
outputs = mult_matrix.sum(axis=0)
az.plot_density(outputs)
array([[<Axes: title={'center': 'x'}>]], dtype=object)

norm_target_sofr_iorb
np.float64(-0.41176579153356735)

ols test

dfdiff
const date sofr_rate iorb reserves rrp_on_bil rrp_foreign_mm sofr_vol tgcr_vol rrp_foreign_bil ... leverage_ratio_diff reserves_diff rolling_sofr_iorb_diff_diff rolling_leverage_ratio_diff rolling_rrp_total_bil_diff rolling_reserves_diff norm_rolling_leverage_ratio_diff norm_rolling_reserves_diff norm_rolling_rrp_total_bil_diff norm_rolling_sofr_iorb_diff_diff
1280 1.0 2025-02-13 4.33 4.40 3220027.0 67.820 384797.0 2329.0 907.0 384.797 ... 4.968171e-06 0.0 -0.005333 -1.012450e-06 -13.713367 -2073.400000 -1.068793 -0.162450 -3.768942 -2.231887
1281 1.0 2025-02-14 4.33 4.40 3220027.0 58.770 384797.0 2319.0 913.0 384.797 ... -3.103104e-06 0.0 -0.002333 -1.391825e-06 -6.228300 -2073.400000 -1.227637 -0.162450 -1.585087 -1.061726
1282 1.0 2025-02-18 4.37 4.40 3220027.0 77.817 384797.0 2452.0 913.0 384.797 ... 4.129381e-05 0.0 0.002000 1.030453e-06 -5.510700 -2073.400000 -0.213431 -0.162450 -1.375718 0.628508
1283 1.0 2025-02-19 4.35 4.40 3270082.0 73.196 387833.0 2394.0 914.0 387.833 ... -2.938638e-05 50055.0 0.002667 5.484018e-07 -5.381833 -404.900000 -0.415266 0.155571 -1.338120 0.888544
1284 1.0 2025-02-20 4.33 4.40 3270082.0 63.207 387833.0 2403.0 914.0 387.833 ... 2.754081e-06 0.0 0.002000 9.141867e-07 -4.927133 -404.900000 -0.262112 0.155571 -1.205456 0.628508
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1522 1.0 2026-02-02 3.69 3.65 2901600.0 10.415 326048.0 3307.0 1299.0 326.048 ... 1.102681e-05 0.0 0.000000 9.400342e-07 0.140600 -1914.800000 -0.251289 -0.132220 0.273114 -0.151600
1523 1.0 2026-02-03 3.69 3.65 2901600.0 1.785 326048.0 3268.0 1297.0 326.048 ... -1.343595e-05 0.0 0.001000 6.724041e-07 -0.191967 -1914.800000 -0.363346 -0.132220 0.176084 0.238454
1524 1.0 2026-02-04 3.65 3.65 2925170.0 2.414 324445.0 3310.0 1306.0 324.445 ... 5.283817e-06 23570.0 -0.000333 1.242652e-06 0.064267 -1129.133333 -0.124584 0.017530 0.250843 -0.281618
1525 1.0 2026-02-05 3.65 3.65 2925170.0 1.748 324445.0 3228.0 1290.0 324.445 ... -2.802918e-05 0.0 -0.001000 1.393720e-07 0.092867 -1129.133333 -0.586526 0.017530 0.259188 -0.541654
1526 1.0 2026-02-06 3.65 3.65 2925170.0 3.111 324445.0 3228.0 1290.0 324.445 ... -5.140793e-10 0.0 -0.000333 1.168816e-07 -0.007367 -1129.133333 -0.595943 0.017530 0.229943 -0.281618

247 rows × 27 columns

inputdf = dfdiff[["norm_rolling_leverage_ratio_diff", "norm_rolling_reserves_diff", "norm_rolling_rrp_total_bil_diff", "const"]]
dfmatrix = inputdf.to_numpy()
dfmatrix.shape
(247, 4)
dfmatrix
array([[-1.06879262e+00, -1.62449903e-01, -3.76894205e+00,
         1.00000000e+00],
       [-1.22763679e+00, -1.62449903e-01, -1.58508657e+00,
         1.00000000e+00],
       [-2.13430993e-01, -1.62449903e-01, -1.37571840e+00,
         1.00000000e+00],
       [-4.15265515e-01,  1.55570991e-01, -1.33812005e+00,
         1.00000000e+00],
       [-2.62111693e-01,  1.55570991e-01, -1.20545602e+00,
         1.00000000e+00],
       [ 1.08953639e-01,  3.30201344e-01, -8.83448402e-01,
         1.00000000e+00],
       [ 2.24138808e-01,  3.30201344e-01, -6.42706131e-01,
         1.00000000e+00],
       [ 4.33348904e-01,  3.30201344e-01, -5.58999710e-01,
         1.00000000e+00],
       [ 3.06292504e-01,  6.93407825e-01, -3.34518289e-01,
         1.00000000e+00],
       [ 7.36819914e-01,  6.93407825e-01,  4.38027687e-01,
         1.00000000e+00],
       [ 1.08793589e+00,  1.46549122e-01,  1.35544305e+00,
         1.00000000e+00],
       [ 7.28211268e-01,  1.46549122e-01,  4.90398905e-01,
         1.00000000e+00],
       [ 3.84458383e-01,  1.46549122e-01,  4.07071775e-01,
         1.00000000e+00],
       [ 1.29731362e-01,  5.36365745e-02,  7.20404348e-01,
         1.00000000e+00],
       [ 6.28883729e-01,  1.07882152e-01,  2.73094820e-01,
         1.00000000e+00],
       [ 2.87671723e-01,  1.07882152e-01,  2.63233276e-01,
         1.00000000e+00],
       [ 3.21813403e-01,  1.07882152e-01,  4.56797687e-01,
         1.00000000e+00],
       [ 1.03917402e-01,  1.07882152e-01,  6.53931316e-01,
         1.00000000e+00],
       [ 9.44523762e-03,  6.64506076e-01,  3.96675334e-01,
         1.00000000e+00],
       [-5.93060651e-01,  1.34745523e+00,  3.11296147e-01,
         1.00000000e+00],
       [-8.78323331e-01,  1.34745523e+00,  3.95673619e-01,
         1.00000000e+00],
       [-1.45634573e+00,  1.34745523e+00, -5.64086088e-01,
         1.00000000e+00],
       [-9.70387437e-01,  1.34745523e+00,  8.96074044e-01,
         1.00000000e+00],
       [-1.22710365e+00,  1.77665478e+00,  1.31431438e+00,
         1.00000000e+00],
       [-1.12556814e+00,  2.07984042e+00,  1.35368276e+00,
         1.00000000e+00],
       [-1.19807430e+00,  2.07984042e+00,  1.42190636e+00,
         1.00000000e+00],
       [-1.01832428e+00,  2.07984042e+00,  1.23177501e+00,
         1.00000000e+00],
       [-9.18444585e-01,  2.07984042e+00,  1.36614098e+00,
         1.00000000e+00],
       [-8.43717649e-01,  1.97274702e+00,  1.93928731e+00,
         1.00000000e+00],
       [-6.89372092e-01,  1.69979100e+00,  2.43545719e+00,
         1.00000000e+00],
       [-8.71914525e-01,  1.69979100e+00,  2.38332911e+00,
         1.00000000e+00],
       [-3.64235472e-02,  1.69979100e+00,  3.56634484e+00,
         1.00000000e+00],
       [-8.02272630e-01,  1.69979100e+00,  1.73650323e+00,
         1.00000000e+00],
       [-3.10796768e-01,  9.26902698e-01,  1.80005865e+00,
         1.00000000e+00],
       [-2.58274220e-01,  9.26902698e-01,  1.53519741e+00,
         1.00000000e+00],
       [-2.04124020e-01,  9.26902698e-01,  1.36459464e+00,
         1.00000000e+00],
       [-1.33107495e-01,  9.26902698e-01,  9.34849168e-01,
         1.00000000e+00],
       [-1.96682459e-01,  9.26902698e-01,  8.33539794e-01,
         1.00000000e+00],
       [-3.80627891e-01,  1.16945121e+00,  4.50612340e-01,
         1.00000000e+00],
       [-6.98006781e-01,  1.16945121e+00, -4.65042730e-01,
         1.00000000e+00],
       [-1.52353998e+00,  1.16945121e+00, -1.28000113e+00,
         1.00000000e+00],
       [-1.41499828e+00,  1.16945121e+00, -1.25189022e-01,
         1.00000000e+00],
       [-1.24511579e+00,  1.16945121e+00, -4.09462134e-01,
         1.00000000e+00],
       [-1.12251559e+00,  1.11844588e+00, -9.19986687e-01,
         1.00000000e+00],
       [-1.29391259e+00,  1.11844588e+00, -7.83325526e-01,
         1.00000000e+00],
       [-1.09836941e+00,  1.11844588e+00, -3.11858133e-01,
         1.00000000e+00],
       [-9.81949571e-01,  1.11844588e+00, -9.51524942e-03,
         1.00000000e+00],
       [-5.79774016e-01, -1.22353412e-01,  3.90460811e-01,
         1.00000000e+00],
       [ 3.22973364e-02, -6.78977336e-01,  4.79228962e-02,
         1.00000000e+00],
       [ 2.41724451e-01, -6.78977336e-01, -1.30664416e-01,
         1.00000000e+00],
       [ 3.36331417e-01, -6.78977336e-01,  2.76138867e-01,
         1.00000000e+00],
       [ 4.44811484e-01, -6.78977336e-01,  7.19869451e-01,
         1.00000000e+00],
       [ 1.50568827e+00, -9.17357996e-01,  1.12218933e+00,
         1.00000000e+00],
       [ 1.88358254e+00, -1.34655755e+00, -8.49842656e-02,
         1.00000000e+00],
       [ 1.22233181e+00, -1.34655755e+00, -1.69916085e-01,
         1.00000000e+00],
       [ 9.29541626e-01, -1.34655755e+00, -4.75312741e-01,
         1.00000000e+00],
       [ 8.25182625e-01, -1.34655755e+00, -3.83378641e-01,
         1.00000000e+00],
       [ 4.46638697e-01, -1.35022983e+00, -4.32452953e-01,
         1.00000000e+00],
       [ 3.93282550e-01, -1.24313643e+00, -9.26668030e-01,
         1.00000000e+00],
       [ 1.23450559e-01, -1.24313643e+00, -1.39261140e+00,
         1.00000000e+00],
       [ 4.79424554e-01, -1.24313643e+00, -1.29104917e+00,
         1.00000000e+00],
       [-1.82681159e-01, -1.24313643e+00, -2.41805638e+00,
         1.00000000e+00],
       [-1.46765770e-01, -1.13457538e+00, -7.21870795e-01,
         1.00000000e+00],
       [ 3.88795081e-01, -6.79707980e-01, -1.31062637e+00,
         1.00000000e+00],
       [ 1.64457228e-04, -6.79707980e-01, -6.82502421e-01,
         1.00000000e+00],
       [-2.44009130e-01, -6.79707980e-01, -1.43871494e-01,
         1.00000000e+00],
       [-4.90535724e-01, -6.79707980e-01, -2.21976091e-01,
         1.00000000e+00],
       [-9.43169166e-01, -3.38236579e-01,  1.19929674e-01,
         1.00000000e+00],
       [-5.64628937e-01, -9.43991571e-01,  3.30377360e-01,
         1.00000000e+00],
       [-5.32106009e-01, -9.43991571e-01,  5.24768429e-01,
         1.00000000e+00],
       [ 2.40394824e-01, -9.43991571e-01,  6.67187021e-01,
         1.00000000e+00],
       [ 1.84090482e-01, -1.06348687e+00,  9.62809661e-01,
         1.00000000e+00],
       [ 5.25167785e-01, -1.06348687e+00,  1.02095776e+00,
         1.00000000e+00],
       [ 4.63585878e-01, -9.19568989e-01,  2.89392174e+00,
         1.00000000e+00],
       [ 1.05120986e+00, -9.19568989e-01,  1.10791246e+00,
         1.00000000e+00],
       [ 9.40846626e-01, -9.19568989e-01,  7.36616571e-01,
         1.00000000e+00],
       [ 2.58836676e-01, -7.68865651e-01,  7.02023363e-01,
         1.00000000e+00],
       [ 1.23528574e-01,  4.71933640e-01,  6.46408393e-02,
         1.00000000e+00],
       [-2.39922564e-01,  4.71933640e-01,  4.37444164e-01,
         1.00000000e+00],
       [-4.40356385e-01,  4.71933640e-01,  1.07945597e+00,
         1.00000000e+00],
       [-4.86875241e-01,  4.71933640e-01,  5.81341015e-01,
         1.00000000e+00],
       [-1.23518180e+00,  1.18813664e+00,  6.72779119e-01,
         1.00000000e+00],
       [-2.00494840e+00,  1.42651730e+00, -5.38838979e-01,
         1.00000000e+00],
       [-1.90535833e+00,  1.42651730e+00,  2.43821400e-01,
         1.00000000e+00],
       [-1.27643543e+00,  1.42651730e+00,  6.47283678e-02,
         1.00000000e+00],
       [-1.02833564e+00,  1.42651730e+00,  5.64341035e-01,
         1.00000000e+00],
       [-1.19113444e+00,  1.42180306e+00,  8.72120411e-01,
         1.00000000e+00],
       [-8.24610458e-01,  1.42547534e+00,  7.43988415e-01,
         1.00000000e+00],
       [-6.17912110e-01,  1.42547534e+00,  2.41419229e-01,
         1.00000000e+00],
       [-1.67984813e-01,  1.42547534e+00,  4.80002465e-01,
         1.00000000e+00],
       [-4.39503820e-01,  1.42547534e+00,  6.43534876e-01,
         1.00000000e+00],
       [-2.85090062e-01,  1.19015703e+00,  9.14250795e-01,
         1.00000000e+00],
       [-7.37590670e-03,  1.08159599e+00,  1.26678641e+00,
         1.00000000e+00],
       [-7.36211469e-01,  1.08159599e+00,  2.13135401e+00,
         1.00000000e+00],
       [ 2.69013656e-01,  1.08159599e+00,  3.56707424e+00,
         1.00000000e+00],
       [ 3.64957351e-01,  1.08159599e+00,  1.04995887e+00,
         1.00000000e+00],
       [ 8.06654272e-01,  1.70844635e-01,  1.60255545e+00,
         1.00000000e+00],
       [ 9.88063956e-01, -1.70626766e-01,  9.55204407e-01,
         1.00000000e+00],
       [ 8.90528303e-01, -1.70626766e-01,  8.55849836e-01,
         1.00000000e+00],
       [ 7.43555492e-01, -1.70626766e-01,  1.06535416e+00,
         1.00000000e+00],
       [ 5.21807572e-02, -1.70626766e-01,  1.24196722e+00,
         1.00000000e+00],
       [-2.27985630e-01,  6.11334228e-01,  8.70681054e-01,
         1.00000000e+00],
       [-4.99619911e-01,  6.11334228e-01,  5.21024154e-01,
         1.00000000e+00],
       [-3.72552618e-01,  6.11334228e-01, -9.54307584e-01,
         1.00000000e+00],
       [-9.06999910e-01,  6.11334228e-01,  1.14657088e+00,
         1.00000000e+00],
       [-5.46123522e-01,  6.11334228e-01,  7.87704037e-01,
         1.00000000e+00],
       [-3.87173169e-01,  8.96304584e-01,  5.31226087e-01,
         1.00000000e+00],
       [-7.56322915e-01,  8.96304584e-01,  6.55020560e-01,
         1.00000000e+00],
       [-5.48728827e-01,  8.96304584e-01,  7.43336814e-01,
         1.00000000e+00],
       [-8.04202558e-01,  8.96304584e-01,  5.91008051e-01,
         1.00000000e+00],
       [-7.49590316e-01,  8.96304584e-01,  3.89673055e-01,
         1.00000000e+00],
       [-2.58027358e-01, -5.20844858e-02,  1.44038913e-01,
         1.00000000e+00],
       [-2.42017196e-01, -5.20844858e-02, -1.88938945e-01,
         1.00000000e+00],
       [ 5.86040199e-03, -5.20844858e-02,  1.13472016e-01,
         1.00000000e+00],
       [-1.40814557e-01, -5.20844858e-02,  5.78734611e-01,
         1.00000000e+00],
       [-2.40604587e-01, -5.20844858e-02,  3.10070748e-01,
         1.00000000e+00],
       [-8.75065527e-02, -1.41801258e-01, -2.68842739e-01,
         1.00000000e+00],
       [ 7.71035366e-01, -1.41801258e-01,  3.04605080e-01,
         1.00000000e+00],
       [ 3.21255505e-01, -1.41801258e-01, -1.84115153e-01,
         1.00000000e+00],
       [-8.02408416e-02, -1.41801258e-01, -1.71783360e-01,
         1.00000000e+00],
       [ 9.45617977e-02, -1.41801258e-01, -7.88586961e-01,
         1.00000000e+00],
       [-1.23898817e-01, -1.28882010e-03, -1.11172273e+00,
         1.00000000e+00],
       [-2.94014176e-01, -1.28882010e-03, -1.65204587e+00,
         1.00000000e+00],
       [-3.41213788e-01, -1.28882010e-03, -1.95322171e+00,
         1.00000000e+00],
       [-1.13671282e+00, -1.28882010e-03, -3.63647253e+00,
         1.00000000e+00],
       [-9.96225772e-01, -1.28882010e-03, -1.78399022e+00,
         1.00000000e+00],
       [-1.35866811e+00,  8.30413171e-01, -1.99440873e+00,
         1.00000000e+00],
       [-1.32483163e+00,  8.30413171e-01, -2.05025191e+00,
         1.00000000e+00],
       [-1.09787268e+00,  8.30413171e-01, -2.00221822e+00,
         1.00000000e+00],
       [-1.00569554e+00,  8.30413171e-01, -1.99134523e+00,
         1.00000000e+00],
       [-1.00384805e+00,  8.30413171e-01, -2.15940967e+00,
         1.00000000e+00],
       [-8.01037574e-01,  1.50424714e-01, -1.81711489e+00,
         1.00000000e+00],
       [-7.38337431e-01,  1.50424714e-01, -1.48360214e+00,
         1.00000000e+00],
       [-6.66551413e-01,  1.50424714e-01, -1.36087746e+00,
         1.00000000e+00],
       [-3.21431430e-01,  1.50424714e-01, -1.60315634e+00,
         1.00000000e+00],
       [-4.47218465e-01,  1.50424714e-01, -1.59760314e+00,
         1.00000000e+00],
       [ 4.79595424e-01, -8.71829323e-01, -1.53335723e+00,
         1.00000000e+00],
       [ 5.12336217e-01, -8.71829323e-01, -1.52705517e+00,
         1.00000000e+00],
       [ 4.24069203e-01, -8.71829323e-01, -1.13518036e+00,
         1.00000000e+00],
       [ 1.07144505e+00, -8.71829323e-01, -1.82762804e+00,
         1.00000000e+00],
       [ 9.34534826e-01, -1.14671679e+00, -1.76396564e+00,
         1.00000000e+00],
       [ 7.49595403e-01, -9.14530720e-01, -1.67476438e+00,
         1.00000000e+00],
       [ 5.32500684e-01, -9.14530720e-01, -1.10762834e+00,
         1.00000000e+00],
       [ 4.72056924e-01, -9.14530720e-01, -1.30120247e+00,
         1.00000000e+00],
       [ 3.62082397e-01, -9.14530720e-01, -1.46123374e+00,
         1.00000000e+00],
       [ 2.87386932e-01, -1.04748893e+00, -1.37683682e+00,
         1.00000000e+00],
       [ 4.72753800e-01, -9.53057914e-01, -1.18030617e+00,
         1.00000000e+00],
       [-3.76920219e-01, -9.53057914e-01, -1.84678705e+00,
         1.00000000e+00],
       [ 3.02639134e-02, -9.53057914e-01, -7.12398266e-01,
         1.00000000e+00],
       [ 1.79676396e-01, -9.53057914e-01, -9.69547268e-01,
         1.00000000e+00],
       [ 3.74209030e-01, -1.50846833e+00, -5.74968798e-01,
         1.00000000e+00],
       [ 4.94346222e-01, -1.41366246e+00, -4.93032399e-01,
         1.00000000e+00],
       [ 4.81340209e-01, -1.41366246e+00, -3.79624641e-01,
         1.00000000e+00],
       [ 7.53977368e-01, -1.41366246e+00, -3.75073159e-01,
         1.00000000e+00],
       [ 7.10242567e-01, -1.41366246e+00, -3.91431263e-01,
         1.00000000e+00],
       [ 8.69781729e-01, -1.86562635e+00,  2.11678991e-01,
         1.00000000e+00],
       [ 1.38463497e+00, -1.78657699e+00,  2.64166914e-01,
         1.00000000e+00],
       [ 1.28321572e+00, -1.78657699e+00,  7.61017571e-01,
         1.00000000e+00],
       [ 9.44665576e-01, -1.78657699e+00,  7.92216618e-01,
         1.00000000e+00],
       [ 2.17621782e+00, -1.78657699e+00,  6.79090897e-01,
         1.00000000e+00],
       [ 2.22127801e+00, -2.01608826e+00,  4.01596381e-01,
         1.00000000e+00],
       [ 2.19797685e+00, -1.99856550e+00,  7.61265234e-02,
         1.00000000e+00],
       [ 2.18745698e+00, -1.99856550e+00,  3.34792686e-01,
         1.00000000e+00],
       [ 1.86199310e+00, -1.99856550e+00,  1.93453612e-01,
         1.00000000e+00],
       [ 1.33146137e+00, -1.99856550e+00, -8.31947941e-02,
         1.00000000e+00],
       [ 1.10050270e+00, -1.79286053e+00, -1.25821173e-01,
         1.00000000e+00],
       [ 4.57704914e-01, -1.20628018e+00, -1.37968183e-01,
         1.00000000e+00],
       [ 4.09598915e-01, -1.20628018e+00, -1.14568898e-01,
         1.00000000e+00],
       [ 5.38706825e-01, -1.20628018e+00, -5.67188487e-01,
         1.00000000e+00],
       [ 7.42729810e-01, -1.07567274e+00, -7.49962914e-02,
         1.00000000e+00],
       [ 7.98441499e-01, -8.00785279e-01,  4.38674091e-02,
         1.00000000e+00],
       [ 8.93906301e-01, -8.00785279e-01, -5.37223384e-03,
         1.00000000e+00],
       [ 4.80961397e-01, -8.00785279e-01,  3.96413930e-03,
         1.00000000e+00],
       [ 4.26778485e-01, -8.00785279e-01,  7.35829995e-03,
         1.00000000e+00],
       [ 8.62154961e-01, -1.34712300e+00,  4.44023055e-02,
         1.00000000e+00],
       [ 1.27605704e+00, -1.21416479e+00, -1.68384671e-02,
         1.00000000e+00],
       [ 1.14293223e+00, -1.21416479e+00, -3.63184206e-02,
         1.00000000e+00],
       [ 1.22442336e+00, -1.21416479e+00,  1.36530912e-01,
         1.00000000e+00],
       [ 1.24527324e+00, -1.21416479e+00,  1.73788877e-01,
         1.00000000e+00],
       [ 1.73970447e+00, -1.75430792e+00,  1.83854654e-01,
         1.00000000e+00],
       [ 1.58041345e+00, -1.19889750e+00,  1.88367234e-01,
         1.00000000e+00],
       [ 1.94774810e+00, -1.19889750e+00,  5.08254719e-01,
         1.00000000e+00],
       [ 2.13431653e+00, -1.19889750e+00,  2.58642893e-01,
         1.00000000e+00],
       [ 1.57986509e+00, -1.19889750e+00,  1.65094379e-01,
         1.00000000e+00],
       [ 1.62339853e+00, -1.10646781e+00,  2.35564545e-01,
         1.00000000e+00],
       [ 1.48390696e+00, -6.54503927e-01, -1.46040256e-01,
         1.00000000e+00],
       [ 5.34560841e-01, -6.54503927e-01, -1.65957852e-01,
         1.00000000e+00],
       [ 1.07950870e+00, -6.54503927e-01, -3.64890677e-01,
         1.00000000e+00],
       [ 1.59328323e+00, -7.02402429e-01, -6.82055053e-01,
         1.00000000e+00],
       [ 3.49340244e-01, -7.02402429e-01, -6.33194701e-01,
         1.00000000e+00],
       [ 5.04623752e-01, -4.72891156e-01, -2.22520712e-01,
         1.00000000e+00],
       [ 1.15965219e+00, -4.72891156e-01, -1.89882308e-01,
         1.00000000e+00],
       [ 8.95069285e-01, -4.72891156e-01, -3.76833455e-01,
         1.00000000e+00],
       [ 6.87990721e-01, -2.59333343e-01, -4.40038756e-01,
         1.00000000e+00],
       [ 8.09069678e-01, -2.59333343e-01, -2.20779868e-01,
         1.00000000e+00],
       [ 1.22043851e+00, -4.65038317e-01, -3.25060683e-02,
         1.00000000e+00],
       [ 1.36519608e+00, -4.65038317e-01, -3.92263119e-02,
         1.00000000e+00],
       [ 1.90613618e+00, -4.65038317e-01, -2.35781615e-02,
         1.00000000e+00],
       [ 1.59362009e+00, -4.14573030e-01,  2.08085125e-02,
         1.00000000e+00],
       [ 1.40776314e+00, -5.45180472e-01,  1.33302083e-01,
         1.00000000e+00],
       [ 1.92055810e+00, -5.45180472e-01,  7.69240052e-02,
         1.00000000e+00],
       [ 1.80041126e+00, -5.45180472e-01,  1.27865591e-01,
         1.00000000e+00],
       [ 2.14682012e+00, -7.88529514e-01,  7.86356736e-02,
         1.00000000e+00],
       [ 1.79840952e+00, -7.88529514e-01,  8.78845183e-02,
         1.00000000e+00],
       [ 1.01682304e+00, -2.42191792e-01,  9.53678702e-03,
         1.00000000e+00],
       [ 7.39387326e-01, -2.42191792e-01, -1.68968194e-02,
         1.00000000e+00],
       [ 9.19753465e-01, -2.42191792e-01,  4.15916681e-02,
         1.00000000e+00],
       [ 3.25950416e-01,  2.26869173e-01, -5.48258353e-02,
         1.00000000e+00],
       [ 4.64075826e-01,  2.26869173e-01, -1.09531147e-01,
         1.00000000e+00],
       [-1.22892917e-01,  7.67012302e-01, -1.57516214e-01,
         1.00000000e+00],
       [-2.61363477e-01,  7.67012302e-01, -1.37083173e-01,
         1.00000000e+00],
       [-5.81648959e-01,  7.67012302e-01, -4.64663440e-01,
         1.00000000e+00],
       [-9.94460217e-01,  9.38122854e-01, -1.51632354e-01,
         1.00000000e+00],
       [-6.28976647e-01,  9.38122854e-01, -7.23120842e-02,
         1.00000000e+00],
       [-7.05848844e-01,  8.45693168e-01, -2.29240956e-01,
         1.00000000e+00],
       [-6.88734340e-01,  8.45693168e-01, -2.25136842e-01,
         1.00000000e+00],
       [-2.55236224e-01,  8.45693168e-01, -1.25733644e-01,
         1.00000000e+00],
       [-8.46972329e-01,  8.23691243e-01, -2.08273018e-01,
         1.00000000e+00],
       [-1.09342240e+00,  8.71589745e-01,  1.80752255e-01,
         1.00000000e+00],
       [-4.72858075e-01,  8.71589745e-01,  1.06226601e-01,
         1.00000000e+00],
       [-5.81145486e-01,  8.71589745e-01,  1.47617856e-01,
         1.00000000e+00],
       [-2.23399630e-01,  8.83210166e-01,  1.42401677e+00,
         1.00000000e+00],
       [ 1.69169889e-01,  8.83210166e-01,  4.70354879e-01,
         1.00000000e+00],
       [ 2.34154565e-01,  6.69652354e-01,  5.76682554e-01,
         1.00000000e+00],
       [ 3.70331340e-02,  6.69652354e-01,  4.86294791e-01,
         1.00000000e+00],
       [-9.03112885e-01,  9.17239133e-01,  2.28863753e-01,
         1.00000000e+00],
       [-1.12704403e+00,  9.17239133e-01,  2.28153799e-01,
         1.00000000e+00],
       [-1.92423194e+00,  9.17239133e-01,  2.18039395e-01,
         1.00000000e+00],
       [-1.96089690e+00,  8.66773845e-01,  1.80752255e-01,
         1.00000000e+00],
       [-2.04099364e+00,  8.66773845e-01,  1.27564104e-01,
         1.00000000e+00],
       [-2.88006716e+00,  1.20510030e+00,  7.96860156e-02,
         1.00000000e+00],
       [-2.41108415e+00,  1.20510030e+00,  4.46746163e-02,
         1.00000000e+00],
       [-2.57544831e+00,  1.44844934e+00,  6.85212694e-02,
         1.00000000e+00],
       [-2.28709845e+00,  1.44844934e+00,  9.34668914e-02,
         1.00000000e+00],
       [-1.79182619e+00,  8.46608061e-01,  1.52811213e-01,
         1.00000000e+00],
       [-1.57265921e+00,  8.46608061e-01,  1.38184229e-01,
         1.00000000e+00],
       [-1.66796273e+00,  8.46608061e-01,  1.12518928e-01,
         1.00000000e+00],
       [-1.13618532e+00,  3.77547097e-01,  1.34585835e-01,
         1.00000000e+00],
       [-1.49322328e+00,  3.77547097e-01,  1.53404462e-01,
         1.00000000e+00],
       [-1.03477770e+00,  3.88902656e-02,  2.30137779e-01,
         1.00000000e+00],
       [-9.81423325e-01,  3.88902656e-02,  2.30001623e-01,
         1.00000000e+00],
       [-6.90447571e-01,  3.88902656e-02,  3.06093064e-01,
         1.00000000e+00],
       [-2.51289340e-01, -1.32220287e-01,  2.73114271e-01,
         1.00000000e+00],
       [-3.63345859e-01, -1.32220287e-01,  1.76084068e-01,
         1.00000000e+00],
       [-1.24583700e-01,  1.75300369e-02,  2.50843131e-01,
         1.00000000e+00],
       [-5.86525956e-01,  1.75300369e-02,  2.59187515e-01,
         1.00000000e+00],
       [-5.95942639e-01,  1.75300369e-02,  2.29943271e-01,
         1.00000000e+00]])
np.array([0.8067, 0.2317, 0.0750, -4.163e-17])[None, :]
array([[ 8.067e-01,  2.317e-01,  7.500e-02, -4.163e-17]])
inference_output = (dfmatrix * np.array([0.8067, 0.2317, 0.0750, -4.163e-17])[None, :]).sum(axis=1)
pred_mean = idata.posterior_predictive.y_hat.mean(dim=["draw", "chain"]).to_numpy()
pred_mean.shape
(247,)
fig, ax = plt.subplots(figsize=(12, 6)) # Added figsize for better visibility

# Your existing plots
#ax.plot(dfdiff["date"], inference_output, label="Inference Output")
#ax.plot(dfdiff["date"], pred_mean, label="Pred Mean")
ax.plot(dfdiff["date"], dfdiff["sofr_iorb_diff_diff"], label="Actual", alpha=0.7)

# --- 1. Get the boundaries of your timeline ---
start_date = dfdiff["date"].min()
end_date = dfdiff["date"].max()

# --- 2. Generate month-end dates ---
# Note: Pandas recently updated frequency strings. 
# Use freq='ME' (Month End) for newer Pandas, or freq='M' if you are on an older version.
month_ends = pd.date_range(start=start_date, end=end_date, freq='ME')

# --- 3. Draw the lines ---
for me_date in month_ends:
    ax.axvline(x=me_date, color='gray', linestyle=':', alpha=0.4)

ax.legend(loc="upper left")
plt.show()

df
const date sofr_rate iorb reserves rrp_on_bil rrp_foreign_mm sofr_vol tgcr_vol rrp_foreign_bil rrp_total_bil repo_vol_total sofr_iorb_diff total_rrp leverage_ratio sofr_iorb_diff_diff rrp_total_bil_diff leverage_ratio_diff reserves_diff
0 1.0 2020-01-08 1.55 1.55 1654086.0 0.876 274047.0 1007.0 355.0 274.047 274.923 1362.0 0.00 274.923 0.000609 NaN NaN NaN NaN
1 1.0 2020-01-09 1.55 1.55 1654086.0 0.401 274047.0 1011.0 361.0 274.047 274.448 1372.0 0.00 274.448 0.000611 0.00 -0.475 2.418028e-06 0.0
2 1.0 2020-01-10 1.55 1.55 1654086.0 0.627 274047.0 1013.0 367.0 274.047 274.674 1380.0 0.00 274.674 0.000612 0.00 0.226 1.208843e-06 0.0
3 1.0 2020-01-13 1.54 1.55 1654086.0 1.000 274047.0 1021.0 377.0 274.047 275.047 1398.0 -0.01 275.047 0.000617 -0.01 0.373 4.835566e-06 0.0
4 1.0 2020-01-14 1.55 1.55 1654086.0 0.656 274047.0 1009.0 371.0 274.047 274.703 1380.0 0.00 274.703 0.000610 0.01 -0.344 -7.253429e-06 0.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1522 1.0 2026-02-02 3.69 3.65 2901600.0 10.415 326048.0 3307.0 1299.0 326.048 336.463 4606.0 0.04 336.463 0.001140 0.01 0.786 1.102681e-05 0.0
1523 1.0 2026-02-03 3.69 3.65 2901600.0 1.785 326048.0 3268.0 1297.0 326.048 327.833 4565.0 0.04 327.833 0.001126 0.00 -8.630 -1.343595e-05 0.0
1524 1.0 2026-02-04 3.65 3.65 2925170.0 2.414 324445.0 3310.0 1306.0 324.445 326.859 4616.0 0.00 326.859 0.001131 -0.04 -0.974 5.283817e-06 23570.0
1525 1.0 2026-02-05 3.65 3.65 2925170.0 1.748 324445.0 3228.0 1290.0 324.445 326.193 4518.0 0.00 326.193 0.001103 0.00 -0.666 -2.802918e-05 0.0
1526 1.0 2026-02-06 3.65 3.65 2925170.0 3.111 324445.0 3228.0 1290.0 324.445 327.556 4518.0 0.00 327.556 0.001103 0.00 1.363 -5.140793e-10 0.0

1527 rows × 19 columns

dfdiff.sort_values(by="sofr_iorb_diff_diff")[["date", "sofr_iorb_diff_diff"]].tail(40)
date sofr_iorb_diff_diff
1460 2025-10-30 0.02
1290 2025-02-28 0.03
1457 2025-10-27 0.03
1468 2025-11-12 0.03
1476 2025-11-24 0.03
1521 2026-01-30 0.03
1455 2025-10-23 0.03
1289 2025-02-27 0.03
1322 2025-04-15 0.03
1330 2025-04-28 0.03
1329 2025-04-25 0.04
1385 2025-07-15 0.04
1282 2025-02-18 0.04
1364 2025-06-16 0.04
1372 2025-06-26 0.04
1413 2025-08-22 0.04
1478 2025-11-26 0.04
1458 2025-10-28 0.04
1448 2025-10-14 0.04
1477 2025-11-25 0.05
1471 2025-11-17 0.05
1419 2025-09-02 0.05
1436 2025-09-25 0.05
1350 2025-05-27 0.05
1332 2025-04-30 0.05
1371 2025-06-25 0.06
1374 2025-06-30 0.06
1393 2025-07-25 0.06
1397 2025-07-31 0.07
1311 2025-03-31 0.07
1317 2025-04-08 0.07
1453 2025-10-21 0.07
1479 2025-11-28 0.07
1490 2025-12-15 0.08
1428 2025-09-15 0.09
1449 2025-10-15 0.10
1498 2025-12-26 0.10
1439 2025-09-30 0.11
1501 2025-12-31 0.16
1461 2025-10-31 0.18
dfdiff["sofr_iorb_diff_diff"].mean()
np.float64(0.00032388663967611363)
start = dfdiff.sort_values(by="date")[dfdiff.sort_values(by="date")["date"] == dt.datetime(2025,8,29)].index
int(start[0])
dfdiff.sort_values(by="date")[["date", "sofr_iorb_diff_diff"]].loc[int(start[0])-10: int(start[0])+10]
date sofr_iorb_diff_diff
1408 2025-08-15 0.02
1409 2025-08-18 -0.02
1410 2025-08-19 -0.01
1411 2025-08-20 -0.02
1412 2025-08-21 0.01
1413 2025-08-22 0.04
1414 2025-08-25 0.01
1415 2025-08-26 0.01
1416 2025-08-27 -0.02
1417 2025-08-28 -0.02
1418 2025-08-29 0.00
1419 2025-09-02 0.05
1420 2025-09-03 0.00
1421 2025-09-04 0.02
1422 2025-09-05 0.01
1423 2025-09-08 -0.02
1424 2025-09-09 0.00
1425 2025-09-10 -0.01
1426 2025-09-11 0.02
1427 2025-09-12 0.01
1428 2025-09-15 0.09
print(results.summary())
                                   OLS Regression Results                                   
============================================================================================
Dep. Variable:     norm_rolling_sofr_iorb_diff_diff   R-squared:                       0.445
Model:                                          OLS   Adj. R-squared:                  0.438
Method:                               Least Squares   F-statistic:                     65.01
Date:                              Tue, 10 Feb 2026   Prob (F-statistic):           6.80e-31
Time:                                      14:24:24   Log-Likelihood:                -277.21
No. Observations:                               247   AIC:                             562.4
Df Residuals:                                   243   BIC:                             576.5
Df Model:                                         3                                         
Covariance Type:                          nonrobust                                         
====================================================================================================
                                       coef    std err          t      P>|t|      [0.025      0.975]
----------------------------------------------------------------------------------------------------
norm_rolling_leverage_ratio_diff     0.8067      0.080     10.116      0.000       0.650       0.964
norm_rolling_reserves_diff           0.2317      0.083      2.793      0.006       0.068       0.395
norm_rolling_rrp_total_bil_diff      0.0750      0.055      1.370      0.172      -0.033       0.183
const                            -4.163e-17      0.048  -8.73e-16      1.000      -0.094       0.094
==============================================================================
Omnibus:                       29.572   Durbin-Watson:                   0.537
Prob(Omnibus):                  0.000   Jarque-Bera (JB):               86.585
Skew:                          -0.474   Prob(JB):                     1.58e-19
Kurtosis:                       5.741   Cond. No.                         3.16
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
dfdiffcopy = dfdiff
dfdiffcopy["month_leverage"] = dfdiff['norm_leverage_ratio_diff'] * dfdiff["end-of-month"]
dfdiffcopy["month_reserves"] = dfdiff['norm_reserves_diff'] * dfdiff["end-of-month"] 
dfdiffcopy["month_rrp"] = dfdiff['norm_rrp_total_bil_diff'] * dfdiff["end-of-month"] 
input_df = dfdiffcopy[['norm_leverage_ratio_diff', 'norm_reserves_diff', 'norm_rrp_total_bil_diff', 'end-of-month', 'const']]

model = sm.OLS(dfdiffcopy["norm_sofr_iorb_diff_diff"], input_df)
results = model.fit()
print(results.summary())
                               OLS Regression Results                               
====================================================================================
Dep. Variable:     norm_sofr_iorb_diff_diff   R-squared:                       0.368
Model:                                  OLS   Adj. R-squared:                  0.358
Method:                       Least Squares   F-statistic:                     35.25
Date:                      Wed, 11 Feb 2026   Prob (F-statistic):           3.41e-23
Time:                              16:55:04   Log-Likelihood:                -293.28
No. Observations:                       247   AIC:                             596.6
Df Residuals:                           242   BIC:                             614.1
Df Model:                                 4                                         
Covariance Type:                  nonrobust                                         
============================================================================================
                               coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------------
norm_leverage_ratio_diff     0.5252      0.064      8.224      0.000       0.399       0.651
norm_reserves_diff           0.2492      0.057      4.399      0.000       0.138       0.361
norm_rrp_total_bil_diff      0.1555      0.058      2.697      0.007       0.042       0.269
end-of-month                 0.5565      0.316      1.760      0.080      -0.066       1.179
const                       -0.0248      0.053     -0.468      0.640      -0.129       0.079
==============================================================================
Omnibus:                       35.839   Durbin-Watson:                   2.093
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              124.204
Skew:                          -0.537   Prob(JB):                     1.07e-27
Kurtosis:                       6.304   Cond. No.                         7.52
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.