¿Cómo ajusto una regresión restringida en R para que los coeficientes totales = 1?


36

Veo una regresión restringida similar aquí:

Regresión lineal restringida a través de un punto específico

Pero mi requisito es ligeramente diferente. Necesito los coeficientes para sumar 1. Específicamente, estoy retrocediendo los retornos de 1 serie de divisas frente a otras 3 series de divisas, para que los inversores puedan reemplazar su exposición a esa serie con una combinación de exposición a las otras 3, pero su el desembolso de efectivo no debe cambiar, y preferiblemente (pero esto no es obligatorio), los coeficientes deben ser positivos.

He intentado buscar regresión restringida en R y Google pero con poca suerte.


¿Estás seguro de que este es un problema de regresión restringido? Mientras leo la pregunta, buscas una relación de la forma (una serie de Forex) = β 1 y 1 + β 2 y 2 + β 3 y 3 (más, supongo, un cuarto término que representa una tasa segura prevaleciente de regreso). Eso es independiente de la decisión de inversión. Si un cliente desea invertir c capital en y 4 usando y 1 , y 2 e y 3 como representantes, entonces simplemente invertiría c βy4 4β1y1+β2y2+β3y3doy4 4y1y2y3 en y 1 , c β 2 en y 2 y c β 3 en y 3 . Eso no agrega ninguna complicación especial a la regresión, ¿verdad? doβ1y1doβ2y2doβ3y3
whuber

Lo hace porque si modela esto encontrará que B1 + B2 + B3> 1 en muchos casos (o <1 en otros). Esto se debe a que la moneda que uno intenta replicar con los descriptores generalmente tendrá una volatilidad mayor o menor que las demás, por lo que la regresión le dará pesos más o menos grandes en respuesta. Esto requiere que el inversor no esté totalmente invertido o que aproveche lo que no quiero. En cuanto a la tasa de rendimiento segura no. Todo lo que estamos tratando de hacer es replicar series1 usando otras variables. Siendo un experto en finanzas y no un estadístico, quizás he nombrado mal mi pregunta.
Thomas Browne el

La razón para incluir un término para una tasa de rendimiento segura es que a veces tendrá un coeficiente distinto de cero. Presumiblemente, los instrumentos seguros (depósitos bancarios durante la noche) están disponibles para todos a bajo costo, por lo que cualquiera que ignore esto como un componente de su canasta de inversión podría elegir combinaciones subóptimas. Ahora, si los coeficientes no se suman a la unidad, ¿y qué? Simplemente invierta todo lo que desee en las proporciones estimadas por la regresión.
whuber

correcto ..... simple como eso. Gracias. Me siento un poco tonto ahora jaja.
Thomas Browne el

1
No es tonto en absoluto. Simplemente hacer esta pregunta refleja un alto nivel de pensamiento. Estaba revisando mi propia comprensión de su pregunta para asegurarme de que obtuviera una respuesta efectiva. Aclamaciones.
whuber

Respuestas:


35

Si entiendo correctamente, su modelo es con k π k = 1 y π k0 . Debe minimizar i ( Y i - ( π 1 X i 1 + π 2 X i 2 + π 3 X i

Y=π1X1+π2X2+π3X3+ε,
kπk=1πk0 sujeto a estas restricciones. Este tipo de problema se conoce comoprogramación cuadrática.
i(Yi(π1Xi1+π2Xi2+π3Xi3))2

Aquí unas pocas líneas de códigos R dan una posible solución ( son las columnas de , los valores verdaderos de π k son 0.2, 0.3 y 0.5).X1,X2,X3Xπk

> library("quadprog");
> X <- matrix(runif(300), ncol=3)
> Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
> Rinv <- solve(chol(t(X) %*% X));
> C <- cbind(rep(1,3), diag(3))
> b <- c(1,rep(0,3))
> d <- t(Y) %*% X  
> solve.QP(Dmat = Rinv, factorized = TRUE, dvec = d, Amat = C, bvec = b, meq = 1)
$solution
[1] 0.2049587 0.3098867 0.4851546

$value
[1] -16.0402

$unconstrained.solution
[1] 0.2295507 0.3217405 0.5002459

$iterations
[1] 2 0

$Lagrangian
[1] 1.454517 0.000000 0.000000 0.000000

$iact
[1] 1

No conozco ningún resultado sobre la distribución asintótica de los estimadores, etc. Si alguien tiene punteros, tendré curiosidad por obtener algunos (si lo desea, puedo abrir una nueva pregunta sobre esto).


Pregunta realmente rápida. ¿No debería estar minimizando la varianza en lugar de la suma? ¿No es eso lo que hace una regresión es minimizar la varianza del cuadrado de los errores?
Thomas Browne el

66
Y=α1X1+α2X2+(1α1α2)X3+εYX3=α1(X1X3)+α2(X2X3)+επiα1α2

66
πk0πk>0

2
Un coeficiente positivo le dice que compre una moneda extranjera; un coeficiente negativo te dice que lo vendas. Si aún no posee esa moneda, debe pedirla prestada para venderla ("vender en corto"). Debido a que los préstamos no restringidos pueden causar problemas a las personas, existen restricciones sobre el monto de los préstamos y cómo se pagan ("requisitos de margen" y "costos de mantenimiento de capital" y procedimientos de "marcado al mercado"). Por lo tanto, los préstamos son posibles, pero a menudo se evitan, excepto por los principales actores en los mercados o, a menos que confieran grandes ventajas.
whuber

2
Muchas gracias a todos por toda la ayuda. En realidad, solo para hacer un comentario sobre los mercados de divisas en general, son más fáciles de poner en corto que las acciones o bonos porque uno no tiene que pedir prestado una acción antes de vender en corto. Uno simplemente voltea las monedas del denominador y numerador. Entonces, por ejemplo, vender EURUSD y vender USDEUR son operaciones exactamente equivalentes en términos del departamento de riesgo, pero por supuesto son posiciones exactamente opuestas. Es por eso que FX es un gran campo de juego para los operadores cuantitativos porque no tienen que preocuparse mucho por las fricciones direccionales que son mucho más importantes en renta variable
Thomas Browne

8

Como mencionó whuber, si solo le interesan las restricciones de igualdad, también puede usar la función estándar lm () reescribiendo su modelo:

Y=α+β1X1+β2X2+β3X3+ϵ=α+β1X1+β2X2+(1β1β2)X3+ϵ=α+β1(X1X3)+β2(X2X3)+X3+ϵ

¡Pero esto no garantiza que se cumplan sus restricciones de desigualdad! Sin embargo, en este caso, es así que obtienes exactamente el mismo resultado que usando el ejemplo de programación cuadrática anterior (colocando el X3 a la izquierda):

X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
X1 <- X[,1]; X2 <-X[,2]; X3 <- X[,3]
lm(Y-X3~-1+I(X1-X3)+I(X2-X3))

β1=0.75β2=0.5(1β1β2)=0.25

1
Thanks @A.S. for pointing this out. Indeed, this solution works only for the equality constraints, not the inequality ones. I edited the text accordingly.
Matifou

1

As I understand your model, you're seeking to find

x¯¯b¯=y¯
such that
[b¯]=1

I've found the easiest way to treat these sorts of problems is to use matrices' associative properties to treat b¯ as a function of other variables.

E.g. b¯ is a function of c¯ via the transform block Tc¯¯. In your case, r below is 1.

b¯=[k0k1k2]=Tc¯¯c¯=[100010111][k0k1r]
Here we can separate our knowns and unknowns.
c¯=[k0k1r]=Su¯¯cu¯+Sk¯¯ck¯=[100100][k0k1]+[001]r
While I could combine the different transform/separation blocks, that gets cumbersome with more intricate models. These blocks allow knowns and unknowns to be separated.
x¯¯Tc¯¯(Su¯¯cu¯+Sk¯¯ck¯)=y¯v¯¯=x¯¯Tc¯¯Su¯¯w¯=y¯x¯¯Tc¯¯Sk¯¯ck¯
Finally the problem is in a familiar form.
v¯¯cu¯=w¯

1

Old question but since I'm facing the same problem I thought to post my 2p...

Use quadratic programming as suggested by @Elvis but using sqlincon from the pracma package. I think the advantage over quadrpog::solve.QP is a simpler user interface to specify the constraints. (In fact, lsqlincon is a wrapper around solve.QP).

Example:

library(pracma)

set.seed(1234)

# Test data
X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2, 0.3, 0.5) + rnorm(100, sd=0.2)

# Equality constraint: We want the sum of the coefficients to be 1.
# I.e. Aeq x == beq  
Aeq <- matrix(rep(1, ncol(X)), nrow= 1)
beq <- c(1)

# Lower and upper bounds of the parameters, i.e [0, 1]
lb <- rep(0, ncol(X))
ub <- rep(1, ncol(X))

# And solve:
lsqlincon(X, Y, Aeq= Aeq, beq= beq, lb= lb, ub= ub)

[1] 0.1583139 0.3304708 0.5112153

Same results as Elvis's:

library(quadprog)
Rinv <- solve(chol(t(X) %*% X));
C <- cbind(rep(1,3), diag(3))
b <- c(1,rep(0,3))
d <- t(Y) %*% X  
solve.QP(Dmat = Rinv, factorized = TRUE, dvec = d, Amat = C, bvec = b, meq = 1)$solution

EDIT To try to address gung's comment here's some explanation. sqlincon emulates matlab's lsqlin which has a nice help page. Here's the relevant bits with some (minor) edits of mine:

X Multiplier matrix, specified as a matrix of doubles. C represents the multiplier of the solution x in the expression C*x - Y. C is M-by-N, where M is the number of equations, and N is the number of elements of x.

Y Constant vector, specified as a vector of doubles. Y represents the additive constant term in the expression C*x - Y. Y is M-by-1, where M is the number of equations.

Aeq: Linear equality constraint matrix, specified as a matrix of doubles. Aeq represents the linear coefficients in the constraints Aeq*x = beq. Aeq has size Meq-by-N, where Meq is the number of constraints and N is the number of elements of x

beq Linear equality constraint vector, specified as a vector of doubles. beq represents the constant vector in the constraints Aeq*x = beq. beq has length Meq, where Aeq is Meq-by-N.

lb Lower bounds, specified as a vector of doubles. lb represents the lower bounds elementwise in lb ≤ x ≤ ub.

ub Upper bounds, specified as a vector of doubles. ub represents the upper bounds elementwise in lb ≤ x ≤ ub.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.