2 votos

Regularizadores para calcular las ponderaciones de la cartera de varianza mínima

Necesito calcular la cartera de mínima varianza utilizando diferentes regularizadores, para comparar los resultados y utilizar métodos de validación para encontrar los parámetros óptimos. Actualmente mi trabajo se ha realizado utilizando python. La siguiente pregunta muestra mi trabajo actual

La frontera eficiente no tiene buena pinta

Lo que necesito es ampliar este trabajo para poder utilizarlo con diferentes regularizadores. El conjunto de datos es 48_Industry_Portfolios_daily dataset. Hay bastantes tutoriales para usar lasso y Ridge, cuando tengo un dataset con variables de clase. Pero no para esta situación.

¿Puede alguien compartir conmigo los pasos exactos que debo seguir, para ampliar mi código, de modo que pueda utilizar regularizadores para comparar las varianzas de la cartera. Incluso una visión general para hacer esto es muy apreciada.

Entiendo los siguientes cálculos,

https://towardsdatascience.com/ridge-and-lasso-regression-a-complete-guide-with-python-scikit-learn-e20e34bcbf0b

Pero, no estoy seguro de cómo se pueden utilizar estos cálculos para la comparación de la varianza de la cartera

6voto

David Rickman Puntos 2787

La Cartera de Varianza Mínima (sin restricciones, aparte de que las ponderaciones sumen uno) se suele encontrar como $$w=\frac{\Sigma^{-1} \iota}{\iota^T\Sigma^{-1} \iota}$$ donde $\Sigma$ es la matriz de covarianza y $\iota$ es un vector de todos los unos.

Sin embargo, hay otro (equivalente) para encontrarlo. Memmel y Kempf (2006) SSRN 940367 demostró que se puede encontrar a partir de la serie temporal de rendimientos utilizando una regresión OLS:

Se selecciona una (por ejemplo la n-ésima) serie temporal de rendimientos y se hace una regresión de las diferencias con las otras n-1 series temporales (véase la ecuación (5) en su documento):

$$\tilde{r}_n= \alpha +\beta_1 (\tilde{r}_n-\tilde{r}_1) + \beta_2 (\tilde{r}_n-\tilde{r}_2) +\cdots + \beta_{n-1}(\tilde{r}_n-\tilde{r}_{n-1})+\tilde{\epsilon}$$

Los coeficientes $\beta_1,\cdots,\beta_{n-1}$ así encontradas son de hecho iguales a las ponderaciones de la cartera de varianza mínima deseada $w_1,\cdots,w_{n-1}$ . (Extraño pero cierto). El último peso $w_n$ se puede encontrar por $w_n=1-\sum_{i=1}^{n-1} w_i $ .

Sabiendo esto, ¿cómo podemos encontrar la cartera de varianza mínima utilizando regularizadores? De la misma manera, salvo que en lugar de utilizar una rutina de regresión OLS, utilizamos una rutina que realiza una regresión regularizada, por ejemplo la Regresión Ridge.

Por lo tanto, utilizando cualquier código disponible que realice la Regresión Ridge o Lasso podemos encontrar una Cartera de Varianza Mínima regularizada. No es necesario escribir ningún código nuevo, sólo tenemos que llamar a la rutina con los parámetros adecuados.

(Como se menciona en otra pregunta Comparación de la varianza de la cartera con diferentes regularizadores la varianza así encontrada será mayor que el verdadero mínimo, pero la solución se comportará mejor, con menos posibilidades de pesos absurdamente grandes/pequeños (como dos pesos de +1000 , -1000) que tienden a ocurrir con la solución no regularizada. Como se mencionó allí, la imposición de una restricción de que los pesos tienen que ser positivos (no hay venta en corto) es también una forma leve de regularización. Así que usted tiene 3 formas fáciles de regularizar, cresta, lasso y minimización cuadrática con restricciones de pesos positivos).

3voto

Arlene Serrano Puntos 6

En el código Python de tu otro post, ya tienes la matriz de covarianza de la muestra como:

cov_matrix = returns.cov()

Para obtener también la covarianza utilizada por la regresión de cresta, ponga en la línea siguiente:

cov_ridge = cov_matrix + lamda*np.eye(N)

El segundo término aumenta los valores a lo largo de la diagonal de cov_matrix, utilizando un $\lambda$ ( lamda ) factor de regularización para la regresión de cresta que tiene que establecer, y la matriz de identidad np.ojo(N) para $N$ activos. Si el conjunto de datos de los rendimientos es $T\times N$ con forma, entonces N=np.shape(returns)[1] o si $N\times T$ entonces N=len(retornos) ). Ridge suele necesitar valores mucho más altos para $\lambda$ que el lazo para lograr una diferencia notable.

Ahora, sustituye matriz_cov en cualquiera de sus otras funciones principales con la matriz de covarianza de la cresta cov_ridge para que el resto de su código derive las ponderaciones de la cartera de crestas:

def rendimiento_anualizado_de_la_cartera(pesos, rendimientos_medios, cov_ridge ):

y

def carteras_aleatorias(número_carteras, media_retornos, cov_ridge , tasa_de_riesgo):

Dado que $(\Sigma+\lambda I)$ es cov_ridge La ponderación de la cartera de crestas utilizando la solución analítica para la cartera GMV (varianza mínima global) será ahora:

$$\omega^{ridge} = \frac{(\Sigma+\lambda I)^{-1}\iota}{\iota^{\top}(\Sigma+\lambda I)^{-1}\iota}$$

En cuanto a lasso, no hay una solución de forma cerrada como ridge, por lo que querrá ejecutar un paquete como Sci-kit learn en la fórmula de regresión de Kempf y Memmel (2006) que se muestra a continuación utilizando la propia de lasso $\lambda$ (introducido en la función lasso preconstruida del paquete), y luego reordenar los coeficientes en las ponderaciones de la cartera GMV de lasso.

$$\tilde{r}_n= \alpha +\beta_1 (\tilde{r}_n-\tilde{r}_1) + \beta_2 (\tilde{r}_n-\tilde{r}_2) +\cdots + \beta_{n-1}(\tilde{r}_n-\tilde{r}_{n-1})+\tilde{\epsilon}$$

$$\boldsymbol{\omega}^{lasso} = \begin{bmatrix} \hat{\beta}_1 \\ \vdots \\ \hat{\beta}_{N-1} \\ 1-\sum_{n=1}^{N-1}\hat{\beta}_{n} \end{bmatrix}$$ La documentación de Sci-kit learn para lasso se puede encontrar aquí . También puede utilizar su módulo de regresión de cresta utilizando la misma cresta $\lambda$ que usaste en el atajo analítico que describí antes para obtener la misma respuesta para la cresta. Su código, sin embargo, está utilizando el enfoque de covarianza para la selección de la cartera, que está bien para obtener las fronteras eficientes, pero si desea utilizar la regresión regularizada para el GMV, crear una nueva función exclusivamente para ese propósito.

2voto

BigCanOfTuna Puntos 210

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)
## [....]

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X