Una implementación de codificación para la optimización de la cartera con skfolio para crear pruebas, ajustar y comparar estrategias de inversión modernas
precios_factor = load_factors_dataset() X_full, F_full = precios_to_returns(precios, precios_factor) X_tr, X_te, F_tr, F_te = train_test_split( X_full, F_full, test_size=0.33, shuffle=False ) fm = MeanRisk( Objective_function=ObjectiveFunction.MAXIMIZE_RATIO, Risk_measure=RiskMeasure.VARIANCE, prior_estimator=FactorModel(), ) fm.fit(X_tr, F_tr) ptf_fm = fm.predict(X_te); ptf_fm.name = “Modelo de factores” print(f”\nFactor-modelo Sharpe: {ptf_fm.annualized_sharpe_ratio:.3f}”) pipe = Pipeline([
(“preselect”, SelectKExtremes(k=8, highest=True)),
(“optimize”, MeanRisk(
objective_function=ObjectiveFunction.MAXIMIZE_RATIO,
risk_measure=RiskMeasure.VARIANCE)),
]) tubería.fit(X_train) ptf_pipe = tubería.predict(X_test); ptf_pipe.name = “Top-8 + Max Sharpe” wf_model = MeanRisk( Objective_function=ObjectiveFunction.MAXIMIZE_RATIO, Risk_measure=RiskMeasure.VARIANCE, ) mp_portfolio = cross_val_predict( wf_model, X, cv=WalkForward(train_size=252*2, test_size=63), n_jobs=-1, ) mp_portfolio.name = “Walk-Forward Max Sharpe” print(f”\nWalk-forward portafolio Sharpe={mp_portfolio.annualized_sharpe_ratio:.3f} ” f”CalmarRatio={mp_portfolio.calmar_ratio:.3f}”) mp_portfolio.plot_cumulative_returns().show() tuned = RiesgoMedio( función_objetiva=FunciónObjetiva.MAXIMIZE_RATIO, medida_riesgo=MedidaRiesgo.VARIANCE,estimador_previo=EmpiricalPrior(mu_estimator=EWMu(alpha=0.1)), ) grid = GridSearchCV( estimador=tuned, cv=WalkForward(train_size=252*2, test_size=63), n_jobs=-1, param_grid={ “l2_coef”: [0.0, 0.01, 0.1]”estimador_prior__mu_estimator__alpha”: [0.05, 0.1, 0.2, 0.5]}, ) grid.fit(X_train) print(“\nMejores parámetros:”, grid.best_params_) print(f”Mejor puntuación CV (Sharpe): {grid.best_score_:.3f}”) ptf_tuned = grid.best_estimator_.predict(X_test); ptf_tuned.name = “Max Sharpe sintonizado” final = Población([
*baseline_population,
ptf_min_var, ptf_max_sharpe,
ptf_rb_var, ptf_rb_cvar,
ptf_hrp, ptf_nco,
ptf_robust, ptf_gerber,
ptf_constr, ptf_bl, ptf_fm,
ptf_pipe, ptf_tuned,
]) _full = final.summary() _wanted_final = [
“Annualized Mean”, “Annualized Standard Deviation”,
“Annualized Sharpe Ratio”, “Annualized Sortino Ratio”,
“CVaR at 95%”, “Maximum Drawdown”, “Max Drawdown”,
]
_tener_final = [r for r in _wanted_final if r in _full.index]
resumen = _full.loc[_have_final].T.sort_values( “Proporción anualizada de Sharpe”, ascending=False ) print(“\n” + “=” * 80) print(“CARRERA DE CABALLOS FINAL – ordenada por Sharpe (conjunto de pruebas fuera de muestra)”) print(“=” * 80) print(summary.to_string()) final.plot_cumulative_returns().show() final.plot_composition().show() ptf_rb_var.plot_contribution(measure=RiskMeasure.VARIANCE).show() print(“\nHecho. Intente intercambiar medidas de riesgo, agregar restricciones o conectar”) print(“su propio DataFrame de retornos: cada estimador sigue la API de sklearn.”)