Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
fPortfolio contains a number of function to make portfolio optimization easier. I can compare the results I get from the functions in fPortfolio to the results from my function from the previous post. I don’t expect them to be exactly the same, but they should be broadly similar.
First, install and load the package:
install.packages(‘fPortfolio’)
library(‘fPortfolio’)
Next, you need to build a returns matrix for the securities you are interested in. You can create return vectors for the different tickers (using methods from an earlier post) and then combine them together using cbind(). The function I wrote in the previous post also returns a matrix of security returns, so you can just use that code as well.
This is the function for the tangency or (highest Sharpe ratio) portfolio:
tangencyPortfolio(as.timeSeries(matrix),constraints=’maxW[1:9]=0.2′)
Here I set the same constraints as in the function I wrote. maxW[1:9]=0.2 says that for securities from 1 to 9 (which is all of them) set the maximum weight for each of them as 20%.
The output from this function call is:
Title:
MV Tangency Portfolio
Estimator: covEstimator
Solver: solveRquadprog
Optimize: minRisk
Constraints: maxW
Portfolio Weights:
NVDA.Adjusted YHOO.Adjusted GOOG.Adjusted CAT.Adjusted BNS.Adjusted
0.0000 0.0000 0.2000 0.0335 0.2000
POT.Adjusted STO.Adjusted MBT.Adjusted SNE.Adjusted
0.2000 0.1760 0.1905 0.0000
Covariance Risk Budgets:
NVDA.Adjusted YHOO.Adjusted GOOG.Adjusted CAT.Adjusted BNS.Adjusted
0.0000 0.0000 0.1301 0.0286 0.1409
POT.Adjusted STO.Adjusted MBT.Adjusted SNE.Adjusted
0.2407 0.1773 0.2823 0.0000
Target Return and Risks:
mean mu Cov Sigma CVaR VaR
0.0006 0.0006 0.0161 0.0161 0.0398 0.0224
This obviously runs much faster, and gives greater and more readable information than the function I wrote. Oh well. It is interesting to see that the weights given for a couple of the securities are different. Not having read the code written by the authors of this function, I am more inclined to trust the results of the brute force function I wrote, however the difference is most likely due to different covariance estimation methods/procedures.
It is commonly known that portfolio weights in a Markowitz mean-variance optimization framework are very sensitive to the estimated means and covariances, and even differences in rounding can lead to fairly different weights. Also, technically, we are supposed to be using expected returns as input and not historical returns. Using historical returns assumes that the returns of each period are independent, come from the same distribution and sample the true distribution of the security. All of these assumptions can be very easily shown to be false.
In the next post, I will experiment with some of the graphs and plots we can make using fPortfolio.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.