Как мне подогнать ограниченную регрессию в R, чтобы коэффициенты всего = 1?

36

Я вижу похожую ограниченную регрессию здесь:

Ограниченная линейная регрессия через указанную точку

но мое требование немного отличается. Мне нужно, чтобы коэффициенты сложились в единицу. В частности, я регрессирую доходность 1 ряда валют против 3 других валютных рядов, чтобы инвесторы могли заменить свою подверженность этой серии комбинацией подверженности другим 3, но их денежные затраты не должны меняться, и желательно (но это не обязательно) коэффициенты должны быть положительными.

Я пытался искать ограниченную регрессию в R и Google, но без особой удачи.

Томас Браун
источник
Вы уверены, что это ограниченная регрессия? Когда я читаю вопрос, вы ищете связь в форме (одна серия Forex) = (плюс, я полагаю, четвертый член, представляющий преобладающую безопасную норму прибыли). Это не зависит от инвестиционного решения. Если клиент хочет инвестировать капитал в используя , и качестве прокси, он просто инвестирует в , в и вβ 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, Это не добавляет особых осложнений к регрессии, не так ли?
whuber
Это происходит потому, что если вы смоделируете это, вы обнаружите, что B1 + B2 + B3> 1 во многих случаях (или <1 в других). Это потому, что валюта, которую вы пытаетесь реплицировать с дескрипторами, обычно будет иметь большую или меньшую волатильность, чем другие, и поэтому регрессия даст вам меньшие или большие веса в ответ. Это требует от инвестора либо не полностью инвестировать, либо использовать левередж, чего я не хочу. Что касается безопасной нормы прибыли нет. Все, что мы пытаемся сделать, это повторить series1, используя другие переменные. Будучи финансовым парнем, а не статистиком, возможно, я неправильно назвал свой вопрос.
Томас Браун
Причина включения термина для безопасной нормы прибыли состоит в том, что иногда он будет иметь ненулевой коэффициент. Предположительно, безопасные инструменты (банковские депозиты овернайт) доступны каждому по низкой цене, поэтому любой, кто игнорирует это как компонент своей инвестиционной корзины, может выбирать неоптимальные комбинации. Теперь, если коэффициенты не добавляют к единице, ну и что? Просто вкладывайте столько, сколько хотите, в пропорции, рассчитанные по регрессии.
whuber
правильно ..... просто так. Спасибо. Теперь я чувствую себя немного глупо, ха-ха.
Томас Браун
1
Совсем не глупо. Просто задавать этот вопрос отражает высокий уровень мышления. Я просто проверял свое понимание вашего вопроса, чтобы убедиться, что вы получили эффективный ответ. Приветствия.
whuber

Ответы:

35

Если я правильно понимаю, ваша модель - с и . Вам необходимо минимизировать учетом этих ограничений. Этот вид проблемы известен как квадратичное программирование .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

Здесь несколько строк из R кодов, дающих возможное решение ( - столбцы , истинные значения - 0,2, 0,3 и 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

Я не знаю каких-либо результатов об асимптотическом распределении оценок и т. Д. Если у кого-то есть указатели, мне будет любопытно получить некоторые из них (если вы хотите, я могу открыть новый вопрос по этому вопросу).

Элвис
источник
На самом деле быстрый вопрос. Разве я не должен минимизировать дисперсию, а не сумму? Разве не регрессия сводит к минимуму дисперсию квадрата ошибок?
Томас Браун
6
Это умно, Элвис, но разве ты не мог бы сделать то же самое, просто репараметризовав регрессию? Например, пусть Это эквивалентно . Оценки и стандартные ошибки легко вычислить по оценкам и матрице var-covar для и . Y=α1X1+α2X2+(1α1α2)X3+εYX3=α1(X1X3)+α2(X2X3)+επiα1α2
whuber
6
@whuber Да, но с более шумными данными или с некоторыми из близкими к , вы легко нарушите ограничение , которое является «трудной» частью проблемы. πk0πk>0
Элвис
2
Положительный коэффициент говорит вам о покупке иностранной валюты; Отрицательный коэффициент говорит вам продать его. Если вы еще не владеете этой валютой, вам нужно одолжить ее, чтобы продать («короткая продажа»). Поскольку неограниченное заимствование может вызвать проблемы у людей, существуют ограничения на сумму заимствований и то, как они оплачиваются («маржинальные требования» и «затраты на перенос капитала» и процедуры «выхода на рынок»). Таким образом, заимствование возможно, но его часто избегают, за исключением крупных игроков на рынках или если оно не дает больших преимуществ.
whuber
2
Большое спасибо всем за помощь. На самом деле, просто для того, чтобы прокомментировать валютные рынки в целом, их легче шортить, чем акции или облигации, потому что не нужно занимать акции перед короткой продажей. Один просто переворачивает знаменатель и числитель валют. Так, например, продажа EURUSD и продажа USDEUR являются абсолютно эквивалентными сделками с точки зрения отдела риска, но они, конечно, являются совершенно противоположными позициями. Вот почему FX - отличная площадка для количественных трейдеров, потому что им не нужно сильно беспокоиться о направленных трениях, которые гораздо важнее в акциях
Томас Браун,
8

Как упомянул whuber, если вас интересуют только ограничения равенства, вы также можете просто использовать стандартную функцию lm (), переписав вашу модель:

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

Но это не гарантирует, что ваши ограничения неравенства будут выполнены! Однако в этом случае это так, и вы получите точно такой же результат, как и в примере с квадратичным программированием, представленном выше (поместив X3 слева):

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
источник
В вышеприведенном случае Матифу, что должно предотвратить отрицательный третий коэффициент? Например, оптимальные коэффициенты для и мы получим это что подразумевает, что наш третий коэффициент отрицателен и, следовательно, не выполняется на основе нашего желаемая регрессия. β1=0.75β2=0.5(1β1β2)=0.25
AS
1
Спасибо @AS за указание на это. Действительно, это решение работает только для ограничений равенства, а не для неравенства. Я отредактировал текст соответственно.
Матифу
1

Как я понимаю вашу модель, вы пытаетесь найти такой, что

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

Я обнаружил, что самый простой способ решения подобных проблем - использовать ассоциативные свойства матриц для обработки как функции других переменных.b¯

Например, является функцией через блок преобразования . В вашем случае ниже равно . Здесь мы можем разделить наши nowns и nknowns. b¯c¯Tc¯¯r1

b¯=[k0k1k2]=Tc¯¯c¯=[100010111][k0k1r]
ku
c¯=[k0k1r]=Su¯¯cu¯+Sk¯¯ck¯=[100100][k0k1]+[001]r
Хотя я мог комбинировать различные преобразования / разделительные блоки, которые становятся громоздкими с более сложными моделями. Эти блоки позволяют разделять известные и неизвестные. ˉ ˉ v ¯ с U = ˉ ш
x¯¯Tc¯¯(Su¯¯cu¯+Sk¯¯ck¯)=y¯v¯¯=x¯¯Tc¯¯Su¯¯w¯=y¯x¯¯Tc¯¯Sk¯¯ck¯
Наконец, проблема в знакомой форме.
v¯¯cu¯=w¯
Аги Линч
источник
1

Старый вопрос, но так как я столкнулся с той же проблемой, я подумал опубликовать свой 2p ...

Используйте квадратичное программирование, предложенное @Elvis, но используя sqlincon из пакета pracma . Я думаю, что преимущество перед quadrpog::solve.QPболее простым пользовательским интерфейсом для определения ограничений. (На самом деле, lsqlinconэто обертка вокруг solve.QP).

Пример:

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

Те же результаты, что и у Элвиса:

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

РЕДАКТИРОВАТЬ Чтобы попытаться ответить на комментарий гун, вот некоторые объяснения. sqlincon эмулирует от Matlab lsqlin , который имеет хорошую справочную страницу. Вот соответствующие биты с некоторыми (незначительными) моими правками:

XМножительная матрица, указанная в виде матрицы двойников. C представляет множитель решения x в выражении C * x - Y. C представляет собой M-by-N, где M - количество уравнений, а N - количество элементов x.

YПостоянный вектор, указанный как вектор двойников. Y представляет собой аддитивный постоянный член в выражении C * x - Y. Y представляет собой M-by-1, где M - число уравнений.

Aeq: Матрица ограничения линейного равенства, указанная как матрица значений типа double. Aeq представляет линейные коэффициенты в ограничениях Aeq * x = beq. Aeq имеет размер Meq-by-N, где Meq - количество ограничений, а N - количество элементов x.

beqВектор ограничения линейного равенства, заданный как вектор двойников. beq представляет постоянный вектор в ограничениях Aeq * x = beq. beq имеет длину Meq, где Aeq - это Meq-by-N.

lbНижние границы, указанные как вектор двойников. lb представляет элементарные нижние оценки в lb ≤ x ≤ ub.

ubВерхние границы, указанные как вектор двойников. ub представляет верхние границы поэлементно в lb ≤ x ≤ ub.

dariober
источник