Como ajusto uma regressão restrita em R para que os coeficientes totalizem = 1?

36

Eu vejo uma regressão restrita semelhante aqui:

Regressão linear restrita através de um ponto especificado

mas minha exigência é um pouco diferente. Preciso que os coeficientes totalizem até 1. Especificamente, estou regredindo os retornos de 1 série de câmbio contra 3 outras séries de câmbio, para que os investidores possam substituir sua exposição a essa série por uma combinação de exposição a outras 3, mas suas as despesas de caixa não devem mudar e, de preferência (mas isso não é obrigatório), os coeficientes devem ser positivos.

Eu tentei procurar por regressão restrita no R e no Google, mas com pouca sorte.

Thomas Browne
fonte
Tem certeza de que este é um problema de regressão restrito? Enquanto leio a pergunta, você procura um relacionamento da forma (uma série de Forex) = β 1 y 1 + β 2 y 2 + β 3 y 3 (mais, presumo, um quarto termo que representa uma taxa segura predominante de Retorna). Isso é independente da decisão de investimento. Se um cliente deseja investir c capital em y 4 usando y 1 , y 2 e y 3 como proxies, eles investem apenas c βy4β1y1+β2y2+β3y3cy4y1y2y3 em y 1 , c β 2 em y 2 e c β 3 em y 3 . Isso não adiciona complicação especial à regressão, acrescenta? cβ1y1cβ2y2cβ3y3
whuber
Isso ocorre porque, se você modelar isso, verá que B1 + B2 + B3> 1 em muitos casos (ou <1 em outros). Isso ocorre porque a moeda que um está tentando replicar com os descritores normalmente apresenta uma volatilidade maior ou menor que os outros e, portanto, a regressão fornece pesos menores ou maiores em resposta. Isso exige que o investidor não seja totalmente investido ou aproveite, o que eu não quero. Quanto à taxa de retorno segura no. Tudo o que estamos tentando fazer é replicar a série1 usando outras variáveis. Sendo um sujeito financeiro e não estatístico, talvez eu tenha errado o nome da minha pergunta.
Thomas Browne
A razão para incluir um termo para uma taxa de retorno segura é que, às vezes, ele tem um coeficiente diferente de zero. Presumivelmente, os instrumentos seguros (depósitos bancários overnight) estão disponíveis para todos a baixo custo, portanto, qualquer pessoa que ignore isso como um componente de sua cesta de investimentos pode estar escolhendo combinações abaixo do ideal. Agora, se os coeficientes não aumentam a unidade, e daí? Basta investir o quanto quiser nas proporções estimadas pela regressão.
whuber
certo ..... simples assim. Obrigado. Eu me sinto um pouco boba agora haha.
Thomas Browne
1
Não é bobo. Apenas fazer essa pergunta reflete um alto nível de pensamento. Eu estava apenas checando meu próprio entendimento de sua pergunta para garantir que você recebesse uma resposta eficaz. Felicidades.
whuber

Respostas:

35

Se bem entendi, seu modelo é com k π k = 1 e π k0 . Você precisa minimizar i ( Y i - ( π 1 X i 1 + π 2 X i 2 + π 3 X i

Y=π1X1+π2X2+π3X3+ε,
kπk=1πk0 sujeitos a essas restrições. Esse tipo de problema é conhecido comoprogramação quadrática.
i(Yi(π1Xi1+π2Xi2+π3Xi3))2

Aqui, algumas linhas de códigos R que fornecem uma solução possível ( são as colunas de , os valores reais de π k são 0,2, 0,3 e 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

Não conheço nenhum resultado sobre a distribuição assintótica dos estimadores, etc. Se alguém tiver indicadores, ficarei curioso para obter alguns (se desejar, posso abrir uma nova pergunta sobre isso).

Elvis
fonte
Pergunta realmente rápida. Eu não deveria estar minimizando a variação em vez da soma? Não é isso que uma regressão faz é minimizar a variação do quadrado dos erros?
Thomas Browne
6
Y=α1X1+α2X2+(1α1α2)X3+εYX3=α1(X1X3)+α2(X2X3)+επiα1α2
6
πk0πk>0
2
Um coeficiente positivo diz para você comprar uma moeda estrangeira; um coeficiente negativo diz para você vendê-lo. Se você já não possui essa moeda, precisa emprestá-la para vendê-la ("vendendo a descoberto"). Como o empréstimo irrestrito pode causar problemas às pessoas, existem restrições quanto ao valor do empréstimo e como ele é pago (procedimentos de "requisitos de margem" e "custos de transporte de capital" e "marcação a mercado"). Portanto, o empréstimo é possível, mas muitas vezes é evitado, exceto pelos principais players do mercado ou a menos que confira grandes vantagens.
whuber
2
Muito obrigado a todos por toda a ajuda. Na verdade, apenas para fazer um comentário sobre os mercados de câmbio em geral, eles são mais fáceis de vender do que ações ou títulos, porque não é necessário emprestar uma ação antes da venda a descoberto. Simplesmente vira-se o denominador e as moedas do numerador. Assim, por exemplo, vender EURUSD e vender USDEUR são operações exatamente equivalentes em termos de departamento de risco, mas é claro que são posições exatamente opostas. É por isso que o FX é um ótimo playground para os negociadores de quant, porque eles não precisam se preocupar muito com atritos direcionais que são muito mais importantes em ações
Thomas Browne
8

Conforme mencionado pelo whuber, se você estiver interessado apenas nas restrições de igualdade, também poderá usar a função lm () padrão, reescrevendo seu modelo:

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

Mas isso não garante que suas restrições de desigualdade sejam satisfeitas! Nesse caso, porém, você obtém exatamente o mesmo resultado de usar o exemplo de programação quadrática acima (colocando o X3 à esquerda):

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))
Matifou
fonte
β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¯
Augi Lynch
fonte
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.

dariober
fonte