Home

Architecture

System

+---------------------------------------------------------------+
|  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       |
+---------------------------------------------------------------+

Pipeline

Excel
->
load_data()
->
FX Conv
->
TimeSeries
v
Returns
->
Cov (Q)
->
Inv Opt (mu*)
->
Factor (pi)

Outputs

Q_emp

GARCH time-decay

Q_shrink

Factor shrinkage

Q_garch

1Y forecast

Layers

1: Data
data_loadingcurrency_conversionreturns
2: Risk
covariancegarch_utils
3: Returns
inverse_optimizationfactor_premiabantleon/*
4: Tools
optimizerreportingdata_quality

Structure

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/

Modules

data_loading

4-sheet Excel, mappings

load_data()

currency_conversion

EUR base, FX rates

convert_to_excess_returns()

returns

22-day rolling log returns

create_index_matrix_and_returns()

covariance

GARCH weights, factor model

estimate_iterative_covariance()

garch_utils

GARCH(1,1), 1Y forecast

fit_garch_models()

inverse_optimization

MV, MRAR, Omega

inverse_optimize_mv()

factor_premia

OLS, Fama-MacBeth

extract_factor_premia_ols()

optimizer

CVXPY/OSQP

optimize_max_sharpe()

reporting

Plotly dashboards

create_dashboard()

data_quality

Outliers, validation

validate_data_quality()

Bantleon

MethodFormulaWhen
M1lambda=ln((1+y)/(1+rf))/betaR^2>0.6
M2lambda=sum(w_t*f_t)R^2<0.3
Hybridmu=R^2*mu1+(1-R^2)*mu20.3-0.6

R/Python

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

Deps

PyR
polars, numpy, scipyxts, Matrix
arch, cvxpy, plotlytsgarch, dplyr