user3690243
user3690243

Reputation: 113

Portfolio Optimisation under participation constraints with fPortfolio

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

Upvotes: 0

Views: 193

Answers (1)

user3690243
user3690243

Reputation: 113

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

Upvotes: 0

Related Questions