I was putting together a notebook for portfolio optimization (classical Markowitz) and found that the results were slightly different than I was getting with Excel's Solver. I'd prefer to use Mathematica for this since it is much easier, especially for large examples. I have attached a notebook that shows what I am talking about.
Initially, I was using NMinimize, but I later tried FindMinimum and found it to be much faster. However, FindMinimum was giving slightly different answers than NMinimize for the optimal weights. I explored this further and found (I think) that FindMinimum is more accurate, which surprised me. Here is a table that shows the calculated weights for the 4 stocks:
The differences here are quite small, but for another dataset one of them is different by about 2% (e.g. 15% vs 17% weight).
For the example in the attached notebook, you can see that the portfolio weights sum to 1 with FindMinimum, but not with NMinimize. Further, the portfolio return is exactly equal to the target return (1% monthly) with FindMinimum, but not with NMinimize. These results hold for a different (and larger) dataset.
I think that the attached notebook is well-documented and should be easy to follow. I guess my question is why are these two functions giving different results? Am I right to trust FindMinimum over NMinimize, or have I made some kind of mistake?