Come posso adattare una regressione vincolata in R in modo che i coefficienti totali = 1?


36

Vedo una regressione limitata simile qui:

Regressione lineare vincolata attraverso un punto specificato

ma il mio requisito è leggermente diverso. Ho bisogno dei coefficienti per sommare a 1. In particolare, sto regredendo i rendimenti di 1 serie di cambi contro 3 altre serie di cambi, in modo che gli investitori possano sostituire la loro esposizione a quella serie con una combinazione di esposizione alle altre 3, ma il loro l'esborso di denaro non deve cambiare e, preferibilmente (ma non è obbligatorio), i coefficienti dovrebbero essere positivi.

Ho provato a cercare una regressione limitata in R e Google, ma con poca fortuna.


Sei sicuro che si tratti di un problema di regressione vincolata? Mentre leggo la domanda, cerchi una relazione del modulo (una serie Forex) = (in più, presumo, un quarto termine che rappresenta un tasso di rendimento sicuro prevalente). Questo è indipendente dalla decisione di investimento. Se un cliente desidera investire capitale in y_4 utilizzando y_1 , y_2 e y_3 come proxy, allora investe semplicemente c \ beta_1 in y_1 , c \ beta_2 in y_2 e c \ beta_3 in y_3β 1 y 1 + β 2 y 2 + β 3 y 3 c y 4 y 1 y 2 y 3 c β 1 y 1 c β 2 y 2 c β 3 y 3y4β1y1+β2y2+β3y3cy4y1y2y3cβ1y1cβ2y2cβ3y3. Ciò non aggiunge alcuna complicazione speciale alla regressione, vero?
whuber

Lo fa perché se modellerai questo troverai che B1 + B2 + B3> 1 in molti casi (o <1 in altri). Questo perché la valuta che si sta tentando di replicare con i descrittori avrà in genere una volatilità maggiore o minore rispetto alle altre, e quindi la regressione ti darà pesi più o meno grandi in risposta. Ciò richiede che l'investitore non sia completamente investito o che faccia leva, cosa che non desidero. Per quanto riguarda il tasso di rendimento sicuro n. Tutto ciò che stiamo cercando di fare è replicare series1 usando altre variabili. Essendo un ragazzo di finanza e non uno statistico forse ho erroneamente chiamato la mia domanda.
Thomas Browne,

La ragione per includere un termine per un tasso di rendimento sicuro è che a volte avrà un coefficiente diverso da zero. Presumibilmente, strumenti sicuri (depositi bancari overnight) sono disponibili per tutti a basso costo, quindi chiunque lo ignori come componente del proprio paniere di investimenti potrebbe scegliere combinazioni non ottimali. Ora, se i coefficienti non si aggiungono all'unità, e allora? Investi quanto vuoi nelle proporzioni stimate dalla regressione.
whuber

giusto ..... così semplice. Grazie. Mi sento un po 'sciocco ora ahah.
Thomas Browne,

1
Per niente sciocco. Porre semplicemente questa domanda riflette un alto livello di pensiero. Stavo solo controllando la mia comprensione della tua domanda per assicurarmi di avere una risposta efficace. Saluti.
whuber

Risposte:


35

Se ho capito bene, il tuo modello è con e . Devi ridurre al minimo soggetti a questi vincoli. Questo tipo di problema è noto come programmazione quadratica .k π k = 1 π k0 i ( Y i - ( π 1 X i 1 + π 2 X i 2 + π 3 X i 3 ) ) 2

Y=π1X1+π2X2+π3X3+ε,
ΣKπK=1πk0
i(Yi(π1Xi1+π2Xi2+π3Xi3))2

Ecco alcune righe di codici R che danno una possibile soluzione ( sono le colonne di , i valori reali di sono 0,2, 0,3 e 0,5).π kX1,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

Non conosco alcun risultato sulla distribuzione asintotica degli stimatori, ecc. Se qualcuno ha dei puntatori, sarò curioso di prenderne alcuni (se lo desideri, posso aprire una nuova domanda su questo).


Domanda davvero veloce. Non dovrei minimizzare la varianza piuttosto che la somma? Non è ciò che fa una regressione è minimizzare la varianza del quadrato degli errori?
Thomas Browne,

6
Questo è intelligente, Elvis, ma non potresti realizzare la stessa cosa semplicemente riparando la regressione? Ad esempio, lascia È equivalente a . Le stime e gli errori standard di sono semplici da calcolare dalle stime e dalla matrice var-covar di e . Y - X 3 = α 1 ( X 1 - X 3 ) + α 2 ( X 2 - X 3 ) + ε π i α 1 α 2Y=α1X1+α2X2+(1α1α2)X3+εYX3=α1(X1X3)+α2(X2X3)+επiα1α2
whuber

6
@whuber Sì, ma con dati più rumorosi o con alcuni vicini a , facilmente il vincolo , che è la parte "difficile" del problema. 0 π k > 0πk0πk>0
Elvis,

2
Un coefficiente positivo ti dice di acquistare una valuta estera; un coefficiente negativo ti dice di venderlo. Se non possiedi già quella valuta, devi prenderla in prestito per venderla ("vendita allo scoperto"). Poiché il prestito senza restrizioni può mettere in difficoltà le persone, vi sono vincoli sulla quantità di prestito e sul modo in cui viene pagato ("requisiti di margine" e "costi di trasporto del capitale" e "mark to market"). Pertanto, il prestito è possibile ma è spesso evitato se non dai principali attori nei mercati o a meno che non conferisca grandi vantaggi.
whuber

2
Mille grazie a tutti per tutto l'aiuto. In realtà solo per fare un commento sui mercati FX in generale, sono più facili da abbreviare rispetto alle azioni o alle obbligazioni perché non è necessario prendere in prestito un titolo prima della vendita allo scoperto. Uno semplicemente lancia le valute denominatore e numeratore. Quindi, ad esempio, vendere EURUSD e vendere USDEUR sono operazioni esattamente equivalenti in termini di dipartimento del rischio, ma ovviamente sono posizioni esattamente opposte. Ecco perché FX è un parco giochi così grande per i trader quantistici perché non devono preoccuparsi molto degli attriti direzionali che sono molto più importanti nelle azioni
Thomas Browne,

8

Come accennato da whuber, se sei interessato solo ai vincoli di uguaglianza, puoi anche usare la funzione standard lm () riscrivendo il tuo modello:

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

Ma questo non garantisce che i tuoi vincoli di disuguaglianza siano soddisfatti! In questo caso, tuttavia, si ottiene esattamente lo stesso risultato dell'utilizzo dell'esempio di programmazione quadratica sopra (mettendo X3 a sinistra):

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))

Nel caso sopra riportato di Matifou, cosa impedisce che il terzo coefficiente sia negativo? Ad esempio, aveva i coefficienti ottimali per eβ1=0.75β2=0.5(1β1β2)=0.25

1
Grazie @AS per averlo segnalato. In effetti, questa soluzione funziona solo per i vincoli di uguaglianza, non per quelli di disuguaglianza. Ho modificato il testo di conseguenza.
Matifou,

1

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

b¯

b¯c¯Tc¯¯r1

b¯=[k0k1k2]=Tc¯¯c¯=[100010111][k0k1r]
ku
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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.