Re: [ojAlgo-user] Markowitz Model Problem
Mathematics, linear algebra and optimisation
Brought to you by:
apete
From: Ruan W. <is0...@ma...> - 2009-01-16 07:53:10
|
I think i get your point. So I should not use negative excess returns in my model. Thank you very much! On Fri, 16 Jan 2009 07:25:41 +0100, Anders Peterson wrote > On 16 jan 2009, at 02.28, Ruan Weichao wrote: > > > Hi, > > > > Yes, that's the expected excess returns of my program. > > > > Is it right? > > > > Can the "expected excess returns" be negative? > > I have no way of knowing what model/problem you want to solve... > > In a general case excess returns (what you get for taking a risk) > should not be negative. If they are, you do not need to optimise > anything. Just invest everything in the risk free asset. > > I'm not sure exactly why you get those negative (constraint breaking) > portfolio weights. I'm going to look into this, but later. Don't > hold your breath. For you, I think the solution is to work on your model. > > /Anders > > > On Thu, 15 Jan 2009 14:09:43 +0100, Anders Peterson wrote > >> Your expected excess returns matrix looks like this: > >> > >> class org.ojalgo.matrix.BigMatrix > >> {{-0.010638291263564232}, > >> {-0.013500370827906071}, > >> {-0.011390037735101773}, > >> {-0.010385042339767682}, > >> {-0.0003812208389845893}, > >> {-0.002315505853720011}, > >> {0}} > >> > >> Is that correct? > >> > >> Earlier you wrote "And i found that if i change the nagetive > >> ExceptedReturn to positive, the result will be fine." > >> > >> /Anders > >> > >> On 15 jan 2009, at 11.10, Ruan Weichao wrote: > >> > >>> Hi,i am using v25 and here's my code: > >>> > >>> / > >>> ******************************************************************** > >>> ** > >>> **********/ > >>> > >>> import java.math.BigDecimal; > >>> import java.util.List; > >>> > >>> import org.ojalgo.finance.portfolio.MarketEquilibrium; > >>> import org.ojalgo.finance.portfolio.MarkowitzModel; > >>> import org.ojalgo.matrix.*; > >>> import org.ojalgo.matrix.store.BigDenseStore; > >>> import org.ojalgo.matrix.store.MatrixStore; > >>> > >>> > >>> public class TestMarkowitz { > >>> > >>> public double getCovarance(double[] value1, double[] value2){ > >>> > >>> int n = value1.length; > >>> double averOne = 0; > >>> double averTwo = 0; > >>> for(int i=0;i<n;i++) > >>> { > >>> averOne+=value1[i]; > >>> averTwo+=value2[i]; > >>> } > >>> averOne /= n; > >>> averTwo /= n; > >>> > >>> double sum = 0; > >>> for(int i=0;i<n;i++) > >>> sum+=(value1[i]-averOne)*(value2[i]-averTwo); > >>> > >>> return sum / (n-1); > >>> } > >>> > >>> public BasicMatrix getACovariances(double[][] returns){ > >>> > >>> int row = returns.length; > >>> int col = returns[0].length; > >>> MatrixStore<BigDecimal> a = BigDenseStore.FACTORY..makeZero(row, > >>> col); > >>> BasicMatrix covariances = new BigMatrix(a); > >>> > >>> for(int i=1;i<=row;i++){ > >>> for(int j=i;j<=col;j++){ > >>> double tmp = this.getCovarance(returns[i-1], returns[j-1]); > >>> covariances = covariances.set(i-1, j-1,tmp); > >>> covariances = covariances.set(j-1, i-1,tmp); > >>> } > >>> } > >>> return covariances; > >>> } > >>> > >>> public BasicMatrix getAnExpectedExcessReturns(double[][] returns){ > >>> > >>> int row = returns.length; > >>> int col = returns[0].length; > >>> > >>> MatrixStore<BigDecimal> a = BigDenseStore.FACTORY..makeZero > >>> (row, 1); > >>> BasicMatrix expectedExcessReturns = new BigMatrix(a); > >>> > >>> double riskFreeReturn = 0; > >>> for(int i=1;i<=col;i++) > >>> riskFreeReturn+=returns[row-1][i-1]; > >>> riskFreeReturn/=row; > >>> > >>> for(int i=1;i<=row;i++){ > >>> > >>> double tmp = 0; > >>> for(int j=1;j<=col;j++) > >>> tmp+=returns[i-1][j-1]; > >>> tmp/=col; > >>> > >>> expectedExcessReturns = expectedExcessReturns.set(i-1, 0, tmp- > >>> riskFreeReturn); > >>> } > >>> > >>> return expectedExcessReturns; > >>> } > >>> > >>> public static void main(String[] args) > >>> { > >>> int assetNum=7; > >>> double[][] assets_return={ > >>> {-1.5905837442343828E-4, -0.03062360801781757, > >>> -0.029857534032853142, -0.011811692726036832, > >>> -0.017972310602803136, 0.017338003502626997, 0.0}, > >>> {-0.02757158006362653, -0.02562704471101405, > >>> -0.011751538891997735, -0.024915062287655786, -0.01684088269454123, > >>> 0.013585351447135364, 0.0}, > >>> {-0.00699300699300693, -0.033802816901408676, > >>> -0.04675196850393671, -0.021166752710376546, -0.007911392405063583, > >>> 0.03827751196172254, 0.0}, > >>> {-0.007626310772164015, 0.0038424591738713027, > >>> 0.02488038277511978, 0.025210084033613675, -0.02003642987249557, > >>> -0.09758364312267642, 0.0}, > >>> {-0.03965053763440893, 0.021693491952414375, > >>> 0.01643835616438392, -0.007412398921833087, 0.01765105227427014, > >>> -0.010006671114076025, 0.0}, > >>> {-0.017821782178217872, 0.005040322580645311, > >>> 0.006018054162487363, 9.008107296569024E-4, 0.002999999999999824, > >>> -0.01196410767696908, 0.0}, > >>> {2.630552127527583E-4, 2.5867028174649627E-4, > >>> 2.3866431891514327E-4, 1.9564035993080523E-4, 2.351016690966669E-4, > >>> 1.9070675120065465E-4, 0.0} > >>> }; > >>> > >>> TestMarkowitz tm = new TestMarkowitz(); > >>> BasicMatrix covariances = tm.getACovariances(assets_return); > >>> BasicMatrix expectedExcessReturns = tm.getAnExpectedExcessReturns > >>> (assets_return); > >>> BigDecimal riskAversion = new BigDecimal(1.0); > >>> > >>> MarketEquilibrium marketEquilibrium = new MarketEquilibrium > >>> (covariances,riskAversion); > >>> MarkowitzModel markowitzModel = new MarkowitzModel > >>> (marketEquilibrium,expectedExcessReturns); > >>> > >>> for(int i=0;i<assetNum;i++){ > >>> markowitzModel.setLowerLimit(i, new BigDecimal(0.0)); > >>> markowitzModel.setUpperLimit(i, new BigDecimal(1.0)); > >>> } > >>> List<BigDecimal> re = markowitzModel.getWeights(); > >>> > >>> System.out.println("=======result===================="); > >>> for(int i=0;i<re.size();i++) > >>> System.out.println(re.get(i)); > >>> > >>> return; > >>> } > >>> > >>> } > >>> > >>> / > >>> ******************************************************************** > >>> ** > >>> **********/ > >>> > >>> and the result turn out as: > >>> > >>> -0.25 > >>> -0.25 > >>> -0.25 > >>> -0.25 > >>> 0.75 > >>> 0.75 > >>> 0.75 > >>> > >>> / > >>> ******************************************************************** > >>> ** > >>> ******/ > >>> > >>> If you find out any problem, just let me know , thanks a lot! > >>> > >>> On Thu, 15 Jan 2009 09:20:52 +0100, Anders Peterson wrote > >>>> You have to send code (snippets) that I can execute. > >>>> > >>>> Are you using v25 or the latest from cvs? > >>>> > >>>> How do you instantiate the ActiveSetSolver? > >>>> > >>>> What's the correct solution? > >>>> > >>>> You say that if you change the sign of "C" you get an ok result. > >>>> What does this mean? Did you make a mistake with the sign, or do > >>>> you suspect there is a bug in ojAlgo? > >>>> > >>>> I need better info regarding what you do, and what the problem is! > >>>> > >>>> /Anders > >>>> > >>>> On 15 jan 2009, at 06.14, Ruan Weichao wrote: > >>>> > >>>>> > >>>>> Thank you for your response. > >>>>> > >>>>> Here's my model's detail: > >>>>> > >>>>> [AE]={1.0, 1.0, 1.0, 1.0, 1.0, 1.0, > >>> 1.0} > >>>>> > >>>>> > >>>>> [be]={1.0} > >>>>> > >>>>> > >>>>> [Q]={3.048907897157133E-4, 1.6671472561019247E-4, > >>>>> 4.4500080981934345E-4, -5.389129745055723E-4, > >>>>> -2.6090705011393183E-4, -1.2633284900760366E-4, > >>>>> -6.485428846447651E-7}, > >>>>> {1.6671472561019247E-4, 2.341985572849691E-4, > >>>>> 2.9113916450678265E-4, -4.5760873539850514E-4, > >>>>> 1.3078636134987255E-5, -2.354289901013046E-5, > >>> -7.578030042426654E-7}, > >>>>> {4.4500080981934345E-4, 2.9113916450678265E-4, > >>> 7.46023915996829E-4, > >>>>> -0.0010247176498305568, -2.6745504327902895E-4, > >>>>> -1.6563544154823496E-4, -8.293698990696063E-7}, > >>>>> {-5.389129745055723E-4, -4.5760873539850514E-4, > >>>>> -0.0010247176498305568, 0.001754169535149865, > >>>>> 2.0293065310212377E-4, 2.1401092557826588E-4, > >>> 1.0252846778608953E-7}, > >>>>> {-2.6090705011393183E-4, 1.3078636134987255E-5, > >>>>> -2.6745504327902895E-4, 2.0293065310212377E-4, > >>>>> 4.632320892679136E-4, 1.7969731066037214E-4, > >>> 2.4953495129362833E-8}, > >>>>> {-1.2633284900760366E-4, -2.354289901013046E-5, > >>>>> -1.6563544154823496E-4, 2.1401092557826588E-4, > >>>>> 1.7969731066037214E-4, 8..346410612364995E-5, > >>> -7.02099350897589E-8}, > >>>>> {-6.485428846447651E-7, -7.578030042426654E-7, > >>>>> -8.293698990696063E-7, 1.0252846778608953E-7, > >>>>> 2.4953495129362833E-8, -7.02099350897589E-8, > >>> 8.367244992498656E-9}} > >>>>> > >>>>> [c]={{0.010638291263564232}, > >>>>> {0.013500370827906071}, > >>>>> {0.011390037735101773}, > >>>>> {0.010385042339767682}, > >>>>> {3.812208389845893E-4}, > >>>>> {0.002315505853720011}, > >>>>> {0.0}} > >>>>> > >>>>> > >>>>> [AI]={{1.0, 0.0, 0.0, 0.0, 0.0, > >>> 0.0, 0.0}, > >>>>> {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, > >>>>> {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, > >>>>> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, > >>>>> {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, > >>>>> {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, > >>>>> {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}, > >>>>> {-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, > >>>>> {0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, > >>>>> {0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0}, > >>>>> {0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0}, > >>>>> {0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0}, > >>>>> {0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0}, > >>>>> {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0}} > >>>>> > >>>>> [bi]={{1.0}, > >>>>> {1.0}, > >>>>> {1.0}, > >>>>> {1.0}, > >>>>> {1.0}, > >>>>> {1.0}, > >>>>> {1.0}, > >>>>> {0.0}, > >>>>> {0.0}, > >>>>> {0.0}, > >>>>> {0.0}, > >>>>> {0.0}, > >>>>> {0.0}, > >>>>> {0.0}} > >>>>> > >>>>> And here's the result: > >>>>> > >>>>> -0.25 > >>>>> -0.25 > >>>>> -0.25 > >>>>> -0.25 > >>>>> 0.75 > >>>>> 0.75 > >>>>> 0.75 > >>>>> > >>>>> And i found that if i change the nagetive ExceptedReturn to > >>>>> positive, the result will be fine. > >>>>> > >>>>> > >>>>> On Wed, 14 Jan 2009 09:27:53 +0100, Anders Peterson wrote > >>>>>> How small are the negative values? > >>>>>> > >>>>>> Give me a unit test (something that I can easily integrate > >>> with the > >>>>>> existing junit tests) that shows what you do, and where/how you > >>>>>> think it goes wrong. > >>>>>> > >>>>>> /Anders > >>>>>> > >>>>>> On 14 jan 2009, at 03.58, Ruan Weichao wrote: > >>>>>> > >>>>>>> > >>>>>>> Hi, > >>>>>>> > >>>>>>> I use the Markowitz model to calculate the optimize some > >>> assets' > >>>>>>> weights, > >>>>>>> > >>>>>>> and set all the assets' lowerlimit with Zero and set all the > >>>>>>> upperlimits with > >>>>>>> > >>>>>>> One, but it turns out with some negative value which are > >>> little > >>>>>>> than Zero, it > >>>>>>> > >>>>>>> seems that the lowerlimit does not work. > >>>>>>> > >>>>>>> So I want to ask what should I do it to confirm the > >>> lowerlimit? > >>>>>>> > >>>>>>> -- > >>>>>>> Best regards > >>>>>>> > >>>>>>> weichao > >>>>>>> > >>>>>>> > >>>>> > >>> -------------------------------------------------------------------- > >>> -- > >>>>>>> -------- > >>>>>>> This SF.net email is sponsored by: > >>>>>>> SourcForge Community > >>>>>>> SourceForge wants to tell your story. > >>>>>>> http://p.sf.net/sfu/sf-spreadtheword > >>>>>>> _______________________________________________ > >>>>>>> ojAlgo-user mailing list > >>>>>>> ojA...@li... > >>>>>>> https://lists.sourceforge.net/lists/listinfo/ojalgo-user > >>>>>>> > >>>>>>> > >>>>>> > >>>>>> > >>>>> > >>> -------------------------------------------------------------------- > >>> -- > >>>>> ------ > >>>>> -- > >>>>>> This SF.net email is sponsored by: > >>>>>> SourcForge Community > >>>>>> SourceForge wants to tell your story. > >>>>>> http://p.sf.net/sfu/sf-spreadtheword > >>>>>> _______________________________________________ > >>>>>> ojAlgo-user mailing list > >>>>>> ojA...@li... > >>>>>> https://lists.sourceforge.net/lists/listinfo/ojalgo-user > >>>>> > >>>>> > >>>>> -- > >>>>> Best regards > >>>>> > >>>>> > >>> -------------------------------------------------------------------- > >>> -- > >>>>> -------- > >>>>> This SF.net email is sponsored by: > >>>>> SourcForge Community > >>>>> SourceForge wants to tell your story. > >>>>> http://p.sf.net/sfu/sf- > >>>>> spreadtheword_______________________________________________ > >>>>> ojAlgo-user mailing list > >>>>> ojA...@li... > >>>>> https://lists.sourceforge.net/lists/listinfo/ojalgo-user > >>>> > >>>> > >>> -------------------------------------------------------------------- > >>> -- > >>> ------ > >>> -- > >>>> This SF.net email is sponsored by: > >>>> SourcForge Community > >>>> SourceForge wants to tell your story. > >>>> http://p.sf.net/sfu/sf-spreadtheword > >>>> _______________________________________________ > >>>> ojAlgo-user mailing list > >>>> ojA...@li... > >>>> https://lists.sourceforge.net/lists/listinfo/ojalgo-user > >>> > >>> > >>> -- > >>> Best regards > >>> > >>> -------------------------------------------------------------------- > >>> -- > >>> -------- > >>> This SF.net email is sponsored by: > >>> SourcForge Community > >>> SourceForge wants to tell your story. > >>> http://p.sf.net/sfu/sf- > >>> spreadtheword_______________________________________________ > >>> ojAlgo-user mailing list > >>> ojA...@li... > >>> https://lists.sourceforge.net/lists/listinfo/ojalgo-user > >> > >> --------------------------------------------------------------------- > >> ------- > > -- > >> This SF.net email is sponsored by: > >> SourcForge Community > >> SourceForge wants to tell your story. > >> http://p.sf.net/sfu/sf-spreadtheword > >> _______________________________________________ > >> ojAlgo-user mailing list > >> ojA...@li... > >> https://lists.sourceforge.net/lists/listinfo/ojalgo-user > > > > > > -- > > Best regards > > > > > > ---------------------------------------------------------------------- > > -------- > > This SF.net email is sponsored by: > > SourcForge Community > > SourceForge wants to tell your story. > > http://p.sf.net/sfu/sf-spreadtheword > > _______________________________________________ > > ojAlgo-user mailing list > > ojA...@li... > > https://lists.sourceforge.net/lists/listinfo/ojalgo-user > > ---------------------------------------------------------------------------- -- > This SF.net email is sponsored by: > SourcForge Community > SourceForge wants to tell your story. > http://p.sf.net/sfu/sf-spreadtheword > _______________________________________________ > ojAlgo-user mailing list > ojA...@li... > https://lists.sourceforge.net/lists/listinfo/ojalgo-user -- Best regards |