0

Following one of my previous questions on portfolio optimisation I have now tried to solve for the weights which minimise the variance of my portfolio under a set of constraints on a rolling basis. This seems to works most of the time but on some occasions no weights are being returned. I isolated some of those cases and tried to solve them on excel. Using the exact same data I do get a solution in excel. So I am a bit confused by all this. Anyhow I have posted a small sample of data where my script returns a zero weights vector in R but for which I get a solution in excel.

 GBP-U USD-U EUR-U JPY-U CHF-U USD-H EUR-H JPY-H CHF-H 2016-05-13 0.0013866228 -0.0004015032 0.0023176509 0.004868271 0.0230163636 -0.0046939993 0.0065432710 0.0146679154 0.022040377 2016-05-20 0.0027094242 -0.0063831791 -0.0126106089 -0.006146676 -0.0158351590 0.0031237903 0.0045931268 0.0173505502 0.008964457 2016-05-27 0.0181190929 0.0140661262 0.0099806390 -0.005023782 0.0206840583 0.0223892121 0.0282165690 0.0048453909 0.033676661 2016-06-03 -0.0102711128 0.0081653966 0.0133194563 0.031814348 0.0092257881 0.0009701383 -0.0161380212 -0.0101505102 -0.016812484 2016-06-10 -0.0144639135 0.0160062120 -0.0152727781 0.008429249 0.0015983898 -0.0021260494 -0.0229890046 -0.0054785155 -0.027628141 2016-06-17 -0.0152295990 -0.0183599416 -0.0266861641 -0.039472434 -0.0286395252 -0.0112888146 -0.0217678087 -0.0589147494 -0.026415992 2016-06-24 0.0200253356 0.0317549413 0.0346147227 0.029164922 0.0401491058 -0.0166789670 0.0006268938 -0.0379679346 0.004386684 2016-07-01 0.0696777854 0.0620232077 0.0754752233 0.065465564 0.0704656764 0.0314514909 0.0433540129 0.0379248977 0.041482495 2016-07-08 0.0016753950 0.0369097752 0.0076117981 0.007834512 0.0070165833 0.0130392554 -0.0084350439 -0.0354380321 -0.006380199 2016-07-15 0.0118593292 -0.0037643046 0.0058939005 0.028278185 -0.0020681743 0.0144418213 0.0257127861 0.0888542585 0.015778875 2016-07-22 0.0092918745 0.0130552307 0.0086318585 0.001398931 0.0062780458 0.0067460116 0.0077586182 0.0070486894 0.004685162 2016-07-29 -0.0004646661 -0.0094042916 0.0124831676 0.025141288 0.0018086154 -0.0002180359 0.0040494413 -0.0046691781 -0.006745367 2016-08-05 0.0101311910 0.0160368778 0.0045395343 -0.014712256 0.0081973627 0.0040861320 0.0006639525 -0.0289135714 0.007984259 2016-08-12 0.0177313054 0.0125451367 0.0377475690 0.050109303 0.0322171465 0.0007342288 0.0192744848 0.0332886266 0.014216897 2016-08-19 -0.0086591802 -0.0121869847 -0.0131592756 -0.018946998 -0.0182591489 -0.0003056645 -0.0156054036 -0.0176744155 -0.020491089 2016-08-26 -0.0032629188 -0.0112907806 -0.0099742141 -0.028672792 -0.0178773544 -0.0066076557 0.0061594585 -0.0078421386 0.005324054 2016-09-02 0.0082322936 -0.0063800658 -0.0012434593 0.010783580 0.0006709931 0.0054516933 0.0145201246 0.0429479722 0.015518353 2016-09-09 -0.0172703615 -0.0222186855 -0.0031692051 0.014054238 0.0031503483 -0.0243009678 -0.0119551411 0.0001827415 -0.004089906 2016-09-16 -0.0105444978 0.0257113060 -0.0072348498 -0.002332981 -0.0002596633 0.0054847746 -0.0203191336 -0.0263452760 -0.015320125 2016-09-23 0.0294827487 0.0150126367 0.0358026791 0.041563858 0.0298489405 0.0121889694 0.0268098637 0.0263689159 0.017033142 2016-09-30 -0.0010620124 0.0010033756 -0.0058345738 -0.025319672 -0.0159143301 0.0014163678 -0.0060494835 -0.0215285310 -0.014212323 2016-10-07 0.0213392520 0.0351900327 0.0426486765 0.047394294 0.0333505051 -0.0072195144 0.0034453853 0.0210516899 -0.002539864 2016-10-14 -0.0050982217 0.0095672058 0.0009866843 0.004577971 0.0035956430 -0.0102205657 0.0020303997 -0.0035136735 -0.002926098 2016-10-21 0.0002873986 0.0004041448 -0.0029951394 0.012861688 -0.0135120432 0.0038727554 0.0087025204 0.0127856995 -0.006358163 2016-10-28 -0.0039917961 -0.0029823347 0.0078312950 0.013806532 -0.0053670019 -0.0070482290 -0.0052953175 0.0188646173 -0.014826428 

My script is as per the below:

require(fPortfolio) spec <- portfolioSpec() mydata <- as.timeSeries(mydata) cons <- c("eqsumW=1","eqsumW['GBP-U']=0.6" ,"eqsumW[c('USD-U','USD-H')]=0.20","eqsumW[c('EUR-U','EUR-H')]=0.10","eqsumW[c('JPY-U','JPY-H')]=0.05","eqsumW[c('CHF-U','CHF-H')]=0.05","LongOnly") minvariancePortfolio(list(mu=apply(mydata,2,function(x) mean(x)),sigma=cov(mydata)), spec = spec, constraints = cons) 

Running this on the above data gets me the following:

Title: MV Minimum Variance Portfolio Estimator: covEstimator Solver: solveRquadprog Optimize: minRisk Constraints: LongOnly Portfolio Weights: GBP-U USD-U EUR-U JPY-U CHF-U USD-H EUR-H JPY-H CHF-H 0 0 0 0 0 0 0 0 0 Covariance Risk Budgets: GBP-U USD-U EUR-U JPY-U CHF-U USD-H EUR-H JPY-H CHF-H Target Return and Risk: [1] 0 Description: Mon Oct 31 11:26:35 2016 by user: 43951663 

When running the optimisation for the same constraints and data with the excel solver I get the following solution:

 Constraints GBP 0.6000 USD 0.2000 EUR 0.1000 JPY 0.0500 CHF 0.0500 Portfolio 1.0000 Weights GBP-U USD-U EUR-U JPY-U CHF-U USD-H EUR-H JPY-H CHF-H 0.6000 0.0000 0.0000 0.0423 0.0000 0.2000 0.1000 0.0077 0.0500 Portfolio Stdev 0.01562 Portfolio Mean 0.00424 

Any idea on where I get it wrong ? I assume it maybe linked to some of the initial settings of the the solver in spec <- portfolioSpec(), but I am running out of ideas...

1 Answer 1

0

Ok I think I have partly solved this. It seems that the constraint of 60% for the domestic assets is the issue. When I take it off I have the exact same results than when I run the optimisation in excel. I assume that there is some rounding up/down in the oprtimiser that triggers this...if someone as a better answer please let the forum know as this may be of interest to others. Below are my screenshots with and without the 60% constraint.

cons <- c("eqsumW[c('USDU','USDH')]=0.20","eqsumW[c('EURU','EURH')]=0.10","eqsumW[c('JPYU','JPYH')]=0.05","eqsumW[c('CHFU','CHFH')]=0.05") > minvariancePortfolio(list(mu=apply(mydata,2,function(x) mean(x)),sigma=cov(mydata)), spec = portfolioSpec() , constraints = cons) Title: MV Minimum Variance Portfolio Estimator: covEstimator Solver: solveRquadprog Optimize: minRisk Constraints: Portfolio Weights: GBPU USDU EURU JPYU CHFU USDH EURH JPYH CHFH 0.6000 0.0000 0.0000 0.0423 0.0000 0.2000 0.1000 0.0077 0.0500 Covariance Risk Budgets: GBPU USDU EURU JPYU CHFU USDH EURH JPYH CHFH 0.6927 0.0000 0.0000 0.0454 0.0000 0.1098 0.0970 0.0082 0.0470 Target Return and Risk: [1] 0.0042 Description: Tue Nov 01 16:34:52 2016 by user: 43951663 > > cons <- c("eqsumW['GBPU']=0.6" ,"eqsumW[c('USDU','USDH')]=0.20","eqsumW[c('EURU','EURH')]=0.10","eqsumW[c('JPYU','JPYH')]=0.05","eqsumW[c('CHFU','CHFH')]=0.05") > minvariancePortfolio(list(mu=apply(mydata,2,function(x) mean(x)),sigma=cov(mydata)), spec = portfolioSpec() , constraints = cons) Title: MV Minimum Variance Portfolio Estimator: covEstimator Solver: solveRquadprog Optimize: minRisk Constraints: Portfolio Weights: GBPU USDU EURU JPYU CHFU USDH EURH JPYH CHFH 0 0 0 0 0 0 0 0 0 Covariance Risk Budgets: GBPU USDU EURU JPYU CHFU USDH EURH JPYH CHFH Target Return and Risk: [1] 0 Description: Tue Nov 01 16:35:57 2016 by user: 43951663 > > 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.