La regularización significa que se impone una estructura al problema; una estructura que no podría reconocerse a partir de la muestra de datos.
En el contexto de la optimización de la media-varianza, la regularización se discute sobre todo cuando se estiman cantidades a partir de datos históricos (por ejemplo, varianzas) y y las introducen en su función objetivo. (Sin embargo, el término "regularización" no se utiliza tan comúnmente en finanzas como en estadística, por ejemplo).
El problema es que los estimadores estándar pueden ser manejados por unos pocos puntos de datos extremos, lo que a su vez significa que el modelo puede considerar unos pocos activos específicos ("afortunados") como demasiado demasiado buenos, lo que a su vez conduce a carteras carteras. Si sólo nos preocupamos por la varianza (es decir, ignoramos los rendimientos medios), el impacto es menos dramático, pero sigue estando ahí.
La gente ha tratado esencialmente de dos maneras este problema: o bien han restringido ("regularizado") las (por ejemplo, la matriz de varianza-covarianza), o bien la cartera resultante, normalmente imponiendo ponderaciones mínimas y máximas. imponiendo ponderaciones mínimas y máximas. Con cualquiera de los dos enfoques, el resultado es que los activos se vuelven "más iguales", es decir, se es decir, se refuerza la diversificación y se reducen las grandes apuestas. (Incluso se puede demostrar que ambos enfoques están estrechamente relacionados; véase Reducción del riesgo en las grandes carteras: Por qué es útil imponer las restricciones equivocadas .)
Tenga en cuenta que el uso de un método como el Lazo va en contra de esta idea, ya que suele proporcionar soluciones dispersas: más bien reducirá el número de activos es decir, reducirá la diversificación. (Esto puede ser útil, sin embargo, si está interesado en reequilibrar una cartera, en cuyo caso es posible que desee realizar pocas operaciones).
En cambio, dos enfoques que se han utilizado mucho en en particular para la media-varianza/mínima-varianza son los modelos factoriales y la contracción.
En un modelo factorial, se asume que toda la covariación es impulsada por factores comunes. Por lo tanto, en lugar de estimar directamente la matriz de covarianza completa, se estiman modelos factoriales para todos los activos y luego se construye la matriz de covarianza a partir de los modelos factoriales estimados.
La contracción significa esencialmente que se sustituye el estimador estándar de la matriz de varianza-covarianza por una combinación lineal (convexa) combinación del estimador estándar y una estimación más estimación más estructurada. Esta última puede ser una simple matriz diagonal, por ejemplo; o puede ser la propia matriz de matriz de varianza-covarianza derivada de un de un modelo factorial generalmente simple. Un buen comienzo debería ser un artículo como www.ledoit.net/honey.pdf.
Si eres completamente libre en cuanto a lo que significa la regularización, yo empezaría con estimadores alternativos (es decir, estimadores más estructurados) para la matriz de varianza-covarianza.
En caso de que también quiera usar R: existen varias implementaciones de dichos estimadores; una colección completa está en el paquete RiskPortfolios
. Incluso si utiliza Python, puede que la lista de posibilidades del paquete le resulte interesante. Un simple (en R) para ejecutar un backtest en el conjunto de datos mencionado podría ser el siguiente:
library("RiskPortfolios")
library("NMOF") ## https://github.com/enricoschumann/NMOF
library("PMwR")
library("zoo")
P <- French("~/Downloads/French", ## path where to store raw file
dataset = "48_Industry_Portfolios_daily_CSV.zip",
weighting = "value",
frequency = "daily",
price.series = TRUE,
na.rm = TRUE)
## use data from January 2000
P <- window(zoo(P, as.Date(row.names(P))),
start = as.Date("2000-01-01"),
end = as.Date("2019-01-31"))
signal_mv <- function(cov_fun, wmin, wmax, n, ...) {
## cov_fun .. takes a matrix R of returns
## (plus ...), and evaluates to
## the variance--covariance matrix
## of those returns
## fetch prices for the last 10 years
## (~2500 trading days)
P <- Close(n = 2500)
## compute returns: use only every nth price
R <- returns(P[seq(1, nrow(P), by = n), ])
minvar(cov_fun(R, ...), wmin, wmax)
}
## Backtest 1: Standard Covariance estimator
bt.mv <- btest(prices = list(coredata(P)),
signal = signal_mv,
do.signal = "lastofquarter",
convert.weights = TRUE,
initial.cash = 100,
b = 2500,
cov_fun = cov,
wmin = 0.00,
wmax = 0.2,
n = 20,
timestamp = index(P),
instrument = colnames(P))
summary(as.NAVseries(bt.mv))
## [....]
## Return (%) 11.5 (annualised)
## Volatility (%) 10.1 (annualised)
## [....]
## Backtest 2: Covariance estimator with constant correlation
cov_const <- function(R, ...)
covEstimation(R, list(type = "const"))
bt.mv <- btest(prices = list(coredata(P)),
signal = signal_mv,
do.signal = "lastofquarter",
convert.weights = TRUE,
initial.cash = 100,
b = 2500,
cov_fun = cov_const,
wmin = 0.00,
wmax = 0.2,
n = 20,
timestamp = index(P),
instrument = colnames(P))
summary(as.NAVseries(bt.mv))
## [....]
## Return (%) 11.1 (annualised)
## Volatility (%) 9.8 (annualised)
## [....]