Bagaimana cara saya memasukkan regresi terbatas pada R sehingga koefisien total = 1?


36

Saya melihat regresi terbatas yang serupa di sini:

Regresi linear terbatas melalui titik tertentu

tetapi persyaratan saya sedikit berbeda. Saya perlu koefisien untuk menambahkan hingga 1. Secara khusus saya mundur pengembalian 1 seri valuta asing terhadap 3 seri valuta asing lainnya, sehingga investor dapat mengganti eksposur mereka ke seri itu dengan kombinasi eksposur ke 3 lainnya, tetapi mereka pengeluaran tunai tidak boleh berubah, dan lebih disukai (tetapi ini tidak wajib), koefisien harus positif.

Saya telah mencoba mencari regresi terbatas di R dan Google tetapi dengan sedikit keberuntungan.


Apakah Anda yakin ini masalah regresi yang terbatas? Ketika saya membaca pertanyaan, Anda mencari hubungan bentuk (satu seri Forex) = (ditambah, saya kira, istilah keempat mewakili tingkat pengembalian yang aman yang berlaku). Itu terlepas dari keputusan investasi. Jika seorang pelanggan ingin menginvestasikan modal di menggunakan , , dan sebagai proxy, maka mereka hanya akan berinvestasi di , di , dan diβ 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. Itu tidak menambah komplikasi khusus pada regresi, bukan?
whuber

Itu karena jika Anda memodelkan ini, Anda akan menemukan bahwa B1 + B2 + B3> 1 dalam banyak kasus (atau <1 pada yang lain). Itu karena mata uang yang hendak direplikasi dengan deskriptor biasanya akan memiliki volatilitas yang lebih besar atau lebih kecil daripada yang lain, dan dengan demikian regresi akan memberikan bobot yang lebih kecil atau lebih besar sebagai respons. Ini mengharuskan investor untuk tidak sepenuhnya berinvestasi, atau memanfaatkan, yang tidak saya inginkan. Adapun tingkat pengembalian yang aman no. Yang kami coba lakukan adalah mereplikasi series1 menggunakan variabel lain. Menjadi seorang pria keuangan dan bukan seorang ahli statistik mungkin saya salah menyebut pertanyaan saya.
Thomas Browne

Alasan untuk memasukkan istilah untuk tingkat pengembalian yang aman adalah bahwa kadang-kadang akan memiliki koefisien nol. Agaknya, instrumen yang aman (deposito bank semalam) tersedia untuk semua orang dengan biaya rendah, jadi siapa pun yang mengabaikan ini sebagai komponen dari keranjang investasi mereka dapat memilih kombinasi yang tidak optimal. Sekarang, jika koefisien tidak menambah persatuan, lalu apa? Investasikan sebanyak yang Anda inginkan dalam proporsi yang diperkirakan oleh regresi.
Whuber

benar ..... sesederhana itu. Terima kasih. Saya merasa agak konyol sekarang haha.
Thomas Browne

1
Sama sekali tidak konyol. Hanya dengan mengajukan pertanyaan ini mencerminkan tingkat pemikiran yang tinggi. Saya baru saja memeriksa pemahaman saya sendiri tentang pertanyaan Anda untuk memastikan Anda mendapat jawaban yang efektif. Tepuk tangan.
whuber

Jawaban:


35

Jika saya mengerti benar, model Anda adalah dengan Σ k π k = 1 dan π k0 . Anda harus meminimalkan i ( Y i - ( π 1 X i 1 + π 2 X i 2 + π 3 X i

Y=π1X1+π2X2+π3X3+ε,
kπk=1πk0 tunduk pada kendala ini. Masalah semacam ini dikenal sebagaipemrograman kuadratik.
saya(Ysaya-(π1Xsaya1+π2Xsaya2+π3Xsaya3))2

Di sini beberapa baris kode R yang memberikan solusi yang memungkinkan ( adalah kolom-kolom , nilai sebenarnya dari π k adalah 0,2, 0,3 dan 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

Saya tidak tahu hasil apa pun pada distribusi asimtotik dari estimator, dll. Jika seseorang memiliki petunjuk, saya ingin tahu untuk mendapatkan beberapa (jika Anda berharap saya dapat membuka pertanyaan baru tentang ini).


Pertanyaan sebenarnya cepat. Bukankah saya seharusnya meminimalkan varians daripada jumlah? Bukankah itu yang dilakukan oleh suatu regresi adalah meminimalkan varians dari kuadrat kesalahan?
Thomas Browne

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

6
πk0πk>0

2
Koefisien positif memberi tahu Anda untuk membeli mata uang asing; koefisien negatif memberitahu Anda untuk menjualnya. Jika Anda belum memiliki mata uang itu, Anda harus meminjamnya untuk menjualnya ("jual pendek"). Karena pinjaman tanpa batasan dapat membuat orang mendapat masalah, ada kendala pada jumlah pinjaman dan bagaimana pembayarannya ("persyaratan margin" dan "biaya pengangkutan modal" dan prosedur "mark-to-market"). Oleh karena itu, meminjam dimungkinkan tetapi sering dihindari kecuali oleh pemain utama di pasar atau kecuali jika memberi keuntungan besar.
whuber

2
Terima kasih banyak atas semua bantuannya. Sebenarnya hanya untuk membuat komentar tentang pasar FX secara umum, mereka lebih mudah untuk disingkat daripada ekuitas atau obligasi karena kita tidak perlu meminjam saham sebelum penjualan pendek. Satu hanya membalik mata uang penyebut dan pembilang. Jadi misalnya menjual EURUSD dan menjual USDEUR adalah perdagangan yang sama persis dalam hal departemen risiko, tetapi mereka tentu saja posisi yang berlawanan. Itulah mengapa FX adalah tempat bermain yang hebat bagi para pedagang kuant karena mereka tidak perlu terlalu khawatir tentang gesekan terarah yang jauh lebih penting dalam ekuitas
Thomas Browne

8

Seperti yang disebutkan oleh whuber, jika Anda hanya tertarik pada batasan kesetaraan, Anda juga bisa menggunakan fungsi standar lm () dengan menulis ulang model Anda:

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

Tetapi ini tidak menjamin bahwa kendala ketimpangan Anda terpenuhi! Namun, dalam hal ini, jadi Anda mendapatkan hasil yang persis sama dengan menggunakan contoh pemrograman kuadratik di atas (meletakkan X3 di sebelah kiri):

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
Terima kasih @AS untuk menunjukkan ini. Memang, solusi ini hanya berfungsi untuk kendala kesetaraan, bukan yang ketidaksetaraan. Saya mengedit teks yang sesuai.
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
x¯¯Tc¯¯(Su¯¯cu¯+Sk¯¯ck¯)=y¯v¯¯=x¯¯Tc¯¯Su¯¯w¯=y¯x¯¯Tc¯¯Sk¯¯ck¯
v¯¯cu¯=w¯

1

Pertanyaan lama tapi karena saya menghadapi masalah yang sama saya pikir untuk memposting 2p ...

Gunakan pemrograman kuadrat seperti yang disarankan oleh @Elvis tetapi menggunakan sqlincon dari paket pracma . Saya pikir kelebihannya quadrpog::solve.QPadalah antarmuka pengguna yang lebih sederhana untuk menentukan kendala. (Bahkan, lsqlinconadalah pembungkus di sekitar solve.QP).

Contoh:

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

Hasil yang sama dengan Elvis:

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 Untuk mencoba menanggapi komentar gung, inilah beberapa penjelasan. sqlincon mengemulasi matlab ini lsqlin yang memiliki halaman bantuan yang bagus. Inilah bit yang relevan dengan beberapa suntingan (minor) saya:

XMatriks pengali, ditentukan sebagai matriks ganda. C mewakili pengali dari solusi x dalam ekspresi C * x - Y. C adalah M-by-N, di mana M adalah jumlah persamaan, dan N adalah jumlah elemen x.

YVektor konstan, ditetapkan sebagai vektor ganda. Y mewakili istilah konstanta aditif dalam ekspresi C * x - Y. Y adalah M-by-1, di mana M adalah jumlah persamaan.

Aeq: Matriks kendala kesetaraan linier, ditetapkan sebagai matriks ganda. Aeq mewakili koefisien linier dalam batasan Aeq * x = beq. Aeq memiliki ukuran Meq-by-N, di mana Meq adalah jumlah kendala dan N adalah jumlah elemen x

beqVektor kendala kesetaraan linier, ditetapkan sebagai vektor ganda. beq mewakili vektor konstan dalam batasan Aeq * x = beq. beq memiliki panjang Meq, di mana Aeq adalah Meq-by-N.

lbBatas bawah, ditentukan sebagai vektor ganda. lb mewakili batas bawah elementwise dalam lb ≤ x ≤ ub.

ubBatas atas, ditentukan sebagai vektor ganda. ub mewakili batas atas secara elemental dalam lb ≤ x ≤ ub.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.