Re: [ojAlgo-user] MarkowitzModel.java
Mathematics, linear algebra and optimisation
Brought to you by:
apete
From: Anders P. <an...@op...> - 2015-01-31 14:12:12
|
The MarkowitzModel class was recently updated. The algorithm used when you set a "target variance" was improved, and the algorithm used with a "target return" completely rewritten. Both cases now function roughly the same way. There was a problem with the "target variance" algorithm in that it would not always reach the target although possible.This has been fixed. The "target return" algorithm is now slightly slower than before, but more robust. If a target is unreachable the algorithm will still look for a solution as good as possible. Previously the algorithm would fail if the target was unreachable. /Anders > On 8 dec 2014, at 08:32, Anders Peterson wrote: > > I don't have detailed knowledge of Apache Common Maths or Brent's method, but I understand roughly what you've done. My guess is that with the changes I checked in the other day you don't need this. ;-) How many iterations does the BrentSolver typically do? The updated version of ojAlgo's MarkowitzModel zooms in on the target variance in about 20 iterations. Is your Brent-solver better than that? > > > /Anders > > >> Hi Anders, >> >> I am now happy with my new implementation of the MarkowitzModel.java class. It is, however, messy in that I now use the Apache Common Maths library and I would prefer to use pure ojAlgo but quite simply, I did the following: >> >> 1. Declared: >> >> import org.apache.commons.math3.analysis.UnivariateFunction; >> import org.apache.commons.math3.analysis.solvers.BrentSolver; >> >> 2. Made my class implement the UnivariateFunction interface. >> >> 3. Instead of using the getWeights() method of the MarkowitzModel.java class having previously set the target variance using the setTargetVariance() method, I used the following code: >> >> BrentSolver brentSolver = new BrentSolver(); >> brentSolver.solve(100, this , minApache, maxApache, (maxApache-minApache)/2); >> where minApache = 0.0 and maxApache=10,000.00 >> >> 4. I implemented the method public double value(double x) for the BrentSolver class and used the set x to be the riskAversion and made the method return: >> the portfolio variance (derived from the calculatePortfolioVariance() method) minus the target variance. >> >> Please let me know if that is not clear. I am looking forward to testing your latest version against this implementation tomorrow. >> >> Regards, >> >> >> >> -----Original Message----- >> Sent: 07 December 2014 13:15 >> To: 'Anders Peterson' >> Cc: ojAlgo ojAlgo >> Subject: RE: MarkowitzModel.java >> >> Hi Anders, >> >> Sorry for not replying to your last email but I have been busy doing what you wrote and I have been coming in this weekend to test it. Thanks for the update and I will test this against my new implementation. I will write more once I am comfortable with my new implementation (hopefully today). >> >> Regards, >> >> >> -----Original Message----- >> Sent: 06 December 2014 16:22 >> Cc: ojAlgo ojAlgo >> Subject: Re: MarkowitzModel.java >> >> I had a look at that algorithm and found some obvious improvements. I've updated the source code repositories and uploaded snapshot v37.10 to SourceForge. >> >> You'll find it works better now, but I still recommend not to set a target variance or return. >> >> /Anders >> >> >>> On 2 dec 2014, at 23:06, Anders Peterson wrote: >>> >>> Hi, >>> >>> That little algorithm in the MarkowitzModel to handle the quadratic constraint caused by setting a target variance was a temporary solution, and as such it was not thoroughly tuned. The real solution is to develop an optimisation solver that can handle quadratic constraints. I aim to do this. >>> >>> I prefer not to make the parameters you mention publicly adjustable. (I want to get rid of them.) Maybe you can convince me to do it anyway, but let me offer some alternatives: >>> >>> 1) If you can supply better values for those parameters I'd be happy to change the code. >>> >>> 2) I strongly recommend you to try NOT setting a target variance or target return. Instead you simply adjust the risk aversion factor. You can code a master algorithm that solves a sequence of subproblems (different risk aversions) to end up with any feasible risk or return. That's what MarkowitzModel does when you specify a target variance. >>> >>> 3) Even if you decide to continue setting the target variance you can try also adjusting the risk aversion. It is a factor in the algorithm just like "tmpIterCount" and "_0_000005". >>> >>> >>> /Anders >>> >>> >>>> On 2 dec 2014, at 15:39, wrote: >>>> >>>> Hi anders, >>>> >>>> First of all, let me say that I really like ojAlgo so thank you for making it! I do, however, think that you should make tmpIterCount and _0_000005 variables fields (with getters and setters) in the MarkowitzModel.java class. We are finding that we get suboptimal solutions with the hard-coded limit of 20 iterations in a mean variance optimisation (solving for the highest return given a target variance). We are now testing it (against our own Python model) with a limit of 100. >>>> >>>> Please let me know what you think when you get a chance. >>>> >>>> Regards, |