8

यहां एक दिलचस्प पहेली है।क्वाडप्रोग अनुकूलन

नीचे R snippet है जो वाई-अक्ष पर बिंदु (0, आरएफ) से खींची गई रेखा के संबंध में एक वर्गबद्ध कार्य के स्पर्श बिंदु को पहचानता है।

पोर्टफोलियो सिद्धांत से परिचित लोगों के लिए, यह बिंदु बदले में है और जोखिम स्थान और समाधान वजन का सेट है जो टेंगेंसी पोर्टफोलियो (अधिकतम तीव्र अनुपात) को परिभाषित करता है। टुकड़ा नकारात्मक वजन (यानी शॉर्ट्स) के लिए अनुमति देता है और वहाँ एक समानता वजन बाधा जो वजन की राशि की आवश्यकता है = 1.

require(quadprog) 

# create artifical data 
nO  <- 100  # number of observations 
nA  <- 10  # number of assets 
mData <- array(rnorm(nO * nA, mean = 0.001, sd = 0.01), dim = c(nO, nA)) 
rf  <- 0.0001  # riskfree rate (2.5% pa) 
mu  <- apply(mData, 2, mean) # means 
mu2 <- mu - rf     # excess means 

# qp 
aMat <- as.matrix(mu2) 
bVec <- 1 # set expectation of portfolio excess return to 1 
zeros <- array(0, dim = c(nA,1)) 
solQP <- solve.QP(cov(mData), zeros, aMat, bVec, meq = 1) 

# rescale variables to obtain weights 
w <- as.matrix(solQP$solution/sum(solQP$solution)) 

# compute sharpe ratio 
SR <- t(w) %*% mu2/sqrt(t(w) %*% cov(mData) %*% w) 

मेरा प्रश्न - कैसे के इष्टतम सेट के लिए हल करने के लिए अनुकूल करने के लिए कोड वजन एक समानता के बराबर वजन के योग को एक मनमाना संख्या (एक स्व-वित्त पोषण पोर्टफोलियो के कोने मामले सहित वजन = 0) के योग के बराबर है?

वैकल्पिक रूप से, आप 0 के भिन्नता के साथ कॉन्वर्सिस मैट्रिक्स में तत्व 'नकदी' जोड़ने पर विचार कर सकते हैं, और नकदी = 1 पर वजन की आवश्यकता वाले समानता बाधा को जोड़ सकते हैं। हालांकि यह मैट्रिक्स सकारात्मक अर्ध-निश्चित नहीं होगा । मुझे भी संदेह है कि गैर-नकद वजन कम से कम शून्य हो सकता है।

+1

आपके 'resolQP' कॉल के भीतर, मुझे एक बाधा नहीं दिख रही है कि वजन एक को जोड़ता है। इसके बजाए, 'एमैट, बीवीईसी, मेक = 1' की आवश्यकता है कि आपके पोर्टफोलियो का अतिरिक्त मतलब एक हो, जिसे आप 'sum (एमैट * सोलक्यूपी $ समाधान)' के साथ चेक कर सकते हैं। अपने 'resol.QP' कॉल के अंदर, क्या आप 'एमैट' के बजाय किसी के वेक्टर का उपयोग नहीं कर रहे हैं? – flodel

+0

@flodel - आप सही हैं। Typo तय, अच्छी पकड़ –

उत्तर

7

हमें पहले बताएं कि यह वास्तव में अधिकतम शार्प अनुपात पोर्टफोलियो क्यों उत्पन्न करता है।

हम w' mu/sqrt(w' V w) को अधिकतम करने के लिए चाहते हैं। लेकिन उस मात्रा में कोई बदलाव नहीं है अगर हम एक नंबर द्वारा w गुणा (यह "डिग्री 0 में से सजातीय" है): इसलिए हम w' mu = 1 लागू कर सकते हैं और 1/sqrt(w' V w) अधिकतम की समस्या बराबर w' V w को न्यूनतम करने के लिए है। अधिकतम शार्प अनुपात पोर्टफोलियो अद्वितीय नहीं है: वे एक रेखा बनाते हैं। यदि हम चाहते हैं कि वजन 1 (या कोई अन्य गैर-शून्य संख्या) तक पहुंच जाए, हमें बस उन्हें पुन: सहेजना होगा।

हम वजन योग करने के लिए अप करने के लिए 0, हम इस समस्या है कि बाधा जोड़ सकते हैं चाहते हैं - यह केवल काम करता है क्योंकि बाधा भी डिग्री 0. आप अभी भी वजन rescale करने की आवश्यकता होगी के सजातीय है, उदाहरण के लिए, 100% लंबा और 100% छोटा होना।

solQP <- solve.QP(cov(mData), zeros, 
    cbind(aMat,1), 
    c(bVec,0), 
    meq = 2 
) 

# Let us compare with another solver 
V <- cov(mData) 
library(Rsolnp) 
r <- solnp(
    rep(1/length(mu), length(mu)), 
    function(w) - t(w) %*% mu2/sqrt(t(w) %*% V %*% w), 
    eqfun = function(w) sum(w), 
    eqB = 0, 
    LB = rep(-1, length(mu)) 
) 
solQP$solution/r$pars # constant 
1

आपके द्वारा शामिल किए गए लिंक को देख रहे हैं। जाहिर है, aMat की भूमिका, bVec, meq = 1solve.QP कॉल के अंदर शार्प अनुपात सूत्र में संख्या (आपकी वापसी) के मान को ठीक करना है, इसलिए ऑप्टिमाइज़ेशन denominator को कम करने पर केंद्रित है। एक मायने में, यह संख्यात्मक को ठीक करने के लिए पूरी तरह से कानूनी है, यह आपके पोर्टफोलियो के कुल आकार को ठीक करने जैसा है। बाद में आपके पोर्टफोलियो को ऊपर या नीचे बढ़ाया जा सकता है, यह समान शार्प अनुपात रखेगा। आपको यह समझने में सहायता के लिए, आप बीवीईसी (शून्य के अलावा, दिए गए) के किसी भी मूल्य के लिए अपना कोड ऊपर चला सकते हैं और आपको वजन w और शार्प अनुपात SR के लिए एक ही परिणाम मिल जाएगा।

तो मुझे लगता है कि आप "पोर्टफोलियो वजन" की धारणा को गलत व्याख्या कर सकते हैं। वे अनुपात हैं जो आपके पोर्टफोलियो का निर्माण करते हैं, और उन्हें एक को जोड़ना चाहिए। एक बार जब आपको इष्टतम भार मिल जाए, जो आपने पहले ही किया है, तो आप अपने पोर्टफोलियो को जो भी स्तर चाहते हैं, उसे अपने पोर्टफोलियो को स्केल करने के लिए स्वतंत्र हैं, बस अपने पोर्टफोलियो के लिए इच्छित वर्तमान मूल्य से w गुणा करें।

0

यह लंबे पोर्टफोलियो के लिए एक अच्छी तकनीक नहीं है।यहां तक ​​कि कम स्टॉक के मुकाबले पोर्टफोलियो भी वजन के योग से सामान्य होने के बाद गलत संकेत के भार आवंटित कर सकते हैं।

ये स्थितियां नकारात्मक अतिरिक्त रिटर्न के साथ उत्पन्न होती हैं। w'mu = 1 को मजबूर करना इन मामलों में मूल (नकारात्मक जोखिम) के बाईं ओर समाधान डालता है।

library(quadprog) 
nA = 2 # two assets 
mu2 = c(-.1,.1) # one negative excess return 
Dmat = matrix(c(1,0,0,10),2,2) 

aMat <- as.matrix(mu2) 
bVec <- 1 # set expectation of portfolio excess return to 1 
zeros <- array(0, dim = c(nA,1)) 
solQP <- solve.QP(Dmat, zeros, aMat, bVec, meq = 1) 

rawW = solQP$solution 
cat('\nraw weights ') 
cat(rawW) 

netW = rawW/sum(rawW) 
cat('\nnormalized weights ') 
cat(netW) 

portfReturn = sum(netW*mu2) 
cat('\nportfolio excess return ') 
cat(portfReturn) 
संबंधित मुद्दे