+---------------------------------------------------------------+ | DATA LAYER -> RISK MODEL -> INVERSE OPT -> FACTOR | | load_data() covariance MV,MRAR,Omega OLS,F-M | | currency garch mu*=lambda*Q*w pi=(B'B)^-1 | +---------------------------------------------------------------+ | OPTIMIZER <- REPORTING <- NEW ASSET | | min_var,sharpe dashboards mu=rf+B'pi | +---------------------------------------------------------------+ | BANTLEON: lambda_calibration, method1, method2, hybrid | +---------------------------------------------------------------+
GARCH time-decay
Factor shrinkage
1Y forecast
brisma/ +-- data/brisma_data.xlsx # 23MB +-- python/brisma/ # Main pkg | +-- data_loading, currency_conversion, returns | +-- covariance, garch_utils | +-- inverse_optimization, factor_premia | +-- optimizer, reporting, data_quality | +-- bantleon/ (lambda, m1, m2, hybrid) +-- R/examples/example1.R # Reference +-- docs/, tests/, outputs/
4-sheet Excel, mappings
load_data()EUR base, FX rates
convert_to_excess_returns()22-day rolling log returns
create_index_matrix_and_returns()GARCH weights, factor model
estimate_iterative_covariance()GARCH(1,1), 1Y forecast
fit_garch_models()MV, MRAR, Omega
inverse_optimize_mv()OLS, Fama-MacBeth
extract_factor_premia_ols()CVXPY/OSQP
optimize_max_sharpe()Plotly dashboards
create_dashboard()Outliers, validation
validate_data_quality()| Method | Formula | When |
|---|---|---|
| M1 | lambda=ln((1+y)/(1+rf))/beta | R^2>0.6 |
| M2 | lambda=sum(w_t*f_t) | R^2<0.3 |
| Hybrid | mu=R^2*mu1+(1-R^2)*mu2 | 0.3-0.6 |
1e-10 tolerance for Q_emp, Q_shrink. 2% for Q_garch (different optimizers).
source("R/examples/example1.R") # R reference
python python/main.py # Python equivalent
python python/simple_test.py # Comparison
| Py | R |
|---|---|
| polars, numpy, scipy | xts, Matrix |
| arch, cvxpy, plotly | tsgarch, dplyr |