I am currently working on a portfolio optimisation strategy that would involves optimising a portfolio so that it maximises the returns for a user defined level of risk. E.g. keeping the volatility of the portfolio at 10% annualised whilst maximising the return for this level. For that purpose I was hoping to use the function maxreturnPortfolio in fPortfolio that should return the portfolio with the maximal return for a fixed target risk. Clearly though showing in this great package the function has been/is in development by the authors of the package and currently does not work as intended. This is confirmed by various posts and answer to those by the authors. I wonder if anyone knows of another more up to date package or way of doing this in R ? Any help would be really appreciated.
Portfolio Optimisation as a function of targeted Risk rather than return.
8 messages · Ilya Kipnis, Alexios Ghalanos, Pierre Org
Check out the PortfolioAnalytics package.
On Wed, Jan 21, 2015 at 6:13 AM, Pierre Org <pierre at lequeux.org> wrote:
I am currently working on a portfolio optimisation strategy that would
involves optimising a portfolio so that it maximises the returns for a
user
defined level of risk. E.g. keeping the volatility of the portfolio at
10%
annualised whilst maximising the return for this level. For that purpose I
was hoping to use the function maxreturnPortfolio in fPortfolio that
should
return the portfolio with the maximal return for a fixed target risk.
Clearly though showing in this great package the function has been/is in
development by the authors of the package and currently does not work as
intended. This is confirmed by various posts and answer to those by the
authors. I wonder if anyone knows of another more up to date package or
way of doing this in R ?
Any help would be really appreciated.
[[alternative HTML version deleted]]
_______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.
Thank you Ilya, much appreciated From: Ilya Kipnis [mailto:ilya.kipnis at gmail.com] Sent: 21 January 2015 15:50 To: Pierre Org Cc: r-sig-finance at r-project.org Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return. Check out the PortfolioAnalytics package.
On Wed, Jan 21, 2015 at 6:13 AM, Pierre Org <pierre at lequeux.org> wrote:
I am currently working on a portfolio optimisation strategy that would involves optimising a portfolio so that it maximises the returns for a user defined level of risk. E.g. keeping the volatility of the portfolio at 10% annualised whilst maximising the return for this level. For that purpose I was hoping to use the function maxreturnPortfolio in fPortfolio that should return the portfolio with the maximal return for a fixed target risk. Clearly though showing in this great package the function has been/is in development by the authors of the package and currently does not work as intended. This is confirmed by various posts and answer to those by the authors. I wonder if anyone knows of another more up to date package or way of doing this in R ? Any help would be really appreciated. _______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.
1 day later
Hi Ilya
Many thanks for pointing me toward the PARMA package. I have tried to use it but I seem to fail, I am not sure I am doing things right. When I optimise for a given level of risk (7% annualised) and then check what the portfolio volatility with the in-sample weights the level risk does not seem to equate to the intended target risk.
Gilts World Ex UK Stocks UK Stocks
2014-02-28 1.548142e-03 0.0279529433 4.838851e-02
2014-03-31 7.806639e-05 0.0105305699 -2.702980e-02
2014-04-30 7.377730e-03 -0.0052597245 3.158530e-02
2014-05-31 9.628424e-03 0.0282594842 1.481751e-02
2014-06-30 -5.580206e-03 0.0001037494 -1.283548e-02
2014-07-31 1.057991e-02 -0.0034606566 -3.263463e-05
2014-08-31 3.487462e-02 0.0404001701 2.027569e-02
2014-09-30 -6.982201e-03 -0.0005089251 -2.937074e-02
2014-10-31 1.384694e-02 0.0226491298 -1.050032e-02
2014-11-30 3.209176e-02 0.0427556870 2.914371e-02
I use the above data as an input (m) to the optimiser then force my monthly standard deviation to 0.07/sqrt(12)
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
The annualised standard deviation of my series are :
apply(m,2,sd)*sqrt(12)
Gilts World Ex UK Stocks UK Stocks
0.04938711 0.06359545 0.09144821
so a 7% target risk portfolio that maximise return should exist as a solution. Anyhow the resulting weights from the above dataseries are calculated as:
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 0.0005859
Reward : 0.0110454
Optimal_Weights
World Ex UK Stocks 0.9581
Gilts 0.0419
Now when I use the solution weights I do not get the same monthly targeted risk. I realise that the risk
w <- parmasolve(spec, solver="SOCP")@solution$weights
sd(rowSums(t(apply(m,1,function(x) x*t(w)))))*sqrt(12)
[1] 0.0624795
My portfolio do not have a standard deviation of 0.7 as I was expecting?? It is probably obvious to many of the PARMA users?but I can t understand where I get it wrong as the portfolio is obviously feasible. What I want is the portfolio that maximise return amongst all the possible portfolios with a 7% annualised vol. Any idea ? From: Ilya Kipnis [mailto:ilya.kipnis at gmail.com] Sent: 21 January 2015 15:50 To: Pierre Org Cc: r-sig-finance at r-project.org Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return. Check out the PortfolioAnalytics package.
On Wed, Jan 21, 2015 at 6:13 AM, Pierre Org <pierre at lequeux.org> wrote:
I am currently working on a portfolio optimisation strategy that would involves optimising a portfolio so that it maximises the returns for a user defined level of risk. E.g. keeping the volatility of the portfolio at 10% annualised whilst maximising the return for this level. For that purpose I was hoping to use the function maxreturnPortfolio in fPortfolio that should return the portfolio with the maximal return for a fixed target risk. Clearly though showing in this great package the function has been/is in development by the authors of the package and currently does not work as intended. This is confirmed by various posts and answer to those by the authors. I wonder if anyone knows of another more up to date package or way of doing this in R ? Any help would be really appreciated. _______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.
1. The risk is variance, NOT standard deviation.
2. From the manual:
"riskB: For the case that riskType is ?maxreward?, then riskB is the
upper bound for the risk constraint."
_Note_ the "upper bound".
3. Because of the quality of the SOCP solver currently used, you should
probably scale your data by 100.
Therefore:
m = m*100
riskB = (7^2)/12
spec <- parmaspec(S = as.matrix(cov(m)),
riskB=riskB,risk="EV",riskType="maxreward", LB = rep(0,3), UB =
rep(1,3), budget=1, forecast=as.numeric(colMeans(m)))
port <- parmasolve(spec, solver="SOCP")
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 3.3703562
Reward : 1.634234
Optimal_Weights
World.Ex.UK.Stocks 1
> sqrt(parmarisk(port))*sqrt(12)/100
[1] 0.06359581
> parmareward(port)/100
[1] 0.01634234
But note:
>port at solution$status
"Error (0)"
i.e. "probably" unreliable solution. A new SOCP solver will be available
sometime this year (courtesy of Bernhard Pfaff)...until then, use with
caution.
Regards,
Alexios
On 23/01/2015 13:59, Pierre Org wrote:
Hi Ilya
Many thanks for pointing me toward the PARMA package. I have tried to use it but I seem to fail, I am not sure I am doing things right. When I optimise for a given level of risk (7% annualised) and then check what the portfolio volatility with the in-sample weights the level risk does not seem to equate to the intended target risk.
Gilts World Ex UK Stocks UK Stocks
2014-02-28 1.548142e-03 0.0279529433 4.838851e-02
2014-03-31 7.806639e-05 0.0105305699 -2.702980e-02
2014-04-30 7.377730e-03 -0.0052597245 3.158530e-02
2014-05-31 9.628424e-03 0.0282594842 1.481751e-02
2014-06-30 -5.580206e-03 0.0001037494 -1.283548e-02
2014-07-31 1.057991e-02 -0.0034606566 -3.263463e-05
2014-08-31 3.487462e-02 0.0404001701 2.027569e-02
2014-09-30 -6.982201e-03 -0.0005089251 -2.937074e-02
2014-10-31 1.384694e-02 0.0226491298 -1.050032e-02
2014-11-30 3.209176e-02 0.0427556870 2.914371e-02
I use the above data as an input (m) to the optimiser then force my monthly standard deviation to 0.07/sqrt(12)
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
The annualised standard deviation of my series are :
apply(m,2,sd)*sqrt(12)
Gilts World Ex UK Stocks UK Stocks
0.04938711 0.06359545 0.09144821
so a 7% target risk portfolio that maximise return should exist as a solution. Anyhow the resulting weights from the above dataseries are calculated as:
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 0.0005859
Reward : 0.0110454
Optimal_Weights
World Ex UK Stocks 0.9581
Gilts 0.0419
Now when I use the solution weights I do not get the same monthly targeted risk. I realise that the risk
w <- parmasolve(spec, solver="SOCP")@solution$weights
sd(rowSums(t(apply(m,1,function(x) x*t(w)))))*sqrt(12)
[1] 0.0624795
My portfolio do not have a standard deviation of 0.7 as I was expecting??
It is probably obvious to many of the PARMA users?but I can t understand where I get it wrong as the portfolio is obviously feasible. What I want is the portfolio that maximise return amongst all the possible portfolios with a 7% annualised vol.
Any idea ?
From: Ilya Kipnis [mailto:ilya.kipnis at gmail.com]
Sent: 21 January 2015 15:50
To: Pierre Org
Cc: r-sig-finance at r-project.org
Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return.
Check out the PortfolioAnalytics package.
On Wed, Jan 21, 2015 at 6:13 AM, Pierre Org <pierre at lequeux.org> wrote:
I am currently working on a portfolio optimisation strategy that would
involves optimising a portfolio so that it maximises the returns for a user
defined level of risk. E.g. keeping the volatility of the portfolio at 10%
annualised whilst maximising the return for this level. For that purpose I
was hoping to use the function maxreturnPortfolio in fPortfolio that should
return the portfolio with the maximal return for a fixed target risk.
Clearly though showing in this great package the function has been/is in
development by the authors of the package and currently does not work as
intended. This is confirmed by various posts and answer to those by the
authors. I wonder if anyone knows of another more up to date package or
way of doing this in R ?
Any help would be really appreciated.
[[alternative HTML version deleted]]
_______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go. [[alternative HTML version deleted]] _______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.
Hi Alexios
Many thanks for the below this is really useful to me (and hopefully others). Yes I understood since my previous post that the risk was expressed as variance rather than standard deviation. In respect of upper bound, I assume that you mean that the portfolio risk is constrained to a maximum of 7% rather than exactly 7% during the optimisation (i.e the risk will end up being close to 7% rather than exactly equal)? Is there a way of having a strict equality by forcing the lower bound as well ?
I am really thankful for the time you spend on this.
Kind regards
Pierre
-----Original Message-----
From: alexios [mailto:alexios at 4dscape.com]
Sent: 23 January 2015 14:48
To: Pierre Org; 'Ilya Kipnis'
Cc: r-sig-finance at r-project.org
Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return.
1. The risk is variance, NOT standard deviation.
2. From the manual:
"riskB: For the case that riskType is ?maxreward?, then riskB is the
upper bound for the risk constraint."
_Note_ the "upper bound".
3. Because of the quality of the SOCP solver currently used, you should probably scale your data by 100.
Therefore:
m = m*100
riskB = (7^2)/12
spec <- parmaspec(S = as.matrix(cov(m)),
riskB=riskB,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=as.numeric(colMeans(m))) port <- parmasolve(spec, solver="SOCP")
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 3.3703562
Reward : 1.634234
Optimal_Weights
World.Ex.UK.Stocks 1
> sqrt(parmarisk(port))*sqrt(12)/100
[1] 0.06359581
> parmareward(port)/100
[1] 0.01634234
But note:
>port at solution$status
"Error (0)"
i.e. "probably" unreliable solution. A new SOCP solver will be available sometime this year (courtesy of Bernhard Pfaff)...until then, use with caution.
Regards,
Alexios
On 23/01/2015 13:59, Pierre Org wrote:
Hi Ilya
Many thanks for pointing me toward the PARMA package. I have tried to use it but I seem to fail, I am not sure I am doing things right. When I optimise for a given level of risk (7% annualised) and then check what the portfolio volatility with the in-sample weights the level risk does not seem to equate to the intended target risk.
Gilts World Ex UK Stocks UK Stocks
2014-02-28 1.548142e-03 0.0279529433 4.838851e-02
2014-03-31 7.806639e-05 0.0105305699 -2.702980e-02
2014-04-30 7.377730e-03 -0.0052597245 3.158530e-02
2014-05-31 9.628424e-03 0.0282594842 1.481751e-02
2014-06-30 -5.580206e-03 0.0001037494 -1.283548e-02
2014-07-31 1.057991e-02 -0.0034606566 -3.263463e-05
2014-08-31 3.487462e-02 0.0404001701 2.027569e-02
2014-09-30 -6.982201e-03 -0.0005089251 -2.937074e-02
2014-10-31 1.384694e-02 0.0226491298 -1.050032e-02
2014-11-30 3.209176e-02 0.0427556870 2.914371e-02
I use the above data as an input (m) to the optimiser then force my
monthly standard deviation to 0.07/sqrt(12)
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
The annualised standard deviation of my series are :
apply(m,2,sd)*sqrt(12)
Gilts World Ex UK Stocks UK Stocks
0.04938711 0.06359545 0.09144821
so a 7% target risk portfolio that maximise return should exist as a solution. Anyhow the resulting weights from the above dataseries are calculated as:
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 0.0005859
Reward : 0.0110454
Optimal_Weights
World Ex UK Stocks 0.9581
Gilts 0.0419
Now when I use the solution weights I do not get the same monthly
targeted risk. I realise that the risk
w <- parmasolve(spec, solver="SOCP")@solution$weights
sd(rowSums(t(apply(m,1,function(x) x*t(w)))))*sqrt(12)
[1] 0.0624795
My portfolio do not have a standard deviation of 0.7 as I was
expecting??
It is probably obvious to many of the PARMA users?but I can t understand where I get it wrong as the portfolio is obviously feasible. What I want is the portfolio that maximise return amongst all the possible portfolios with a 7% annualised vol.
Any idea ?
From: Ilya Kipnis [mailto:ilya.kipnis at gmail.com]
Sent: 21 January 2015 15:50
To: Pierre Org
Cc: r-sig-finance at r-project.org
Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return.
Check out the PortfolioAnalytics package.
On Wed, Jan 21, 2015 at 6:13 AM, Pierre Org <pierre at lequeux.org> wrote:
I am currently working on a portfolio optimisation strategy that would
involves optimising a portfolio so that it maximises the returns for a user
defined level of risk. E.g. keeping the volatility of the portfolio at 10%
annualised whilst maximising the return for this level. For that
purpose I was hoping to use the function maxreturnPortfolio in
fPortfolio that should return the portfolio with the maximal return for a fixed target risk.
Clearly though showing in this great package the function has been/is
in development by the authors of the package and currently does not
work as intended. This is confirmed by various posts and answer to those by the
authors. I wonder if anyone knows of another more up to date package or
way of doing this in R ?
Any help would be really appreciated.
[[alternative HTML version deleted]]
_______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go. [[alternative HTML version deleted]] _______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.
Hi Pierre, The inequality constraint 'cannot' be turned into an equality one with the solver currently in use...I tried this in the past using auxiliary variables, but it was really hit and miss..best to wait for the new solver to be plugged in. Alternatively, if you have a commercial license to one of the solver(s) now interfacing with R, you should be able to represent and solve this type of problem much more confidently. Regards, Alexios
On 23/01/2015 15:21, Pierre Org wrote:
Hi Alexios
Many thanks for the below this is really useful to me (and hopefully others). Yes I understood since my previous post that the risk was expressed as variance rather than standard deviation. In respect of upper bound, I assume that you mean that the portfolio risk is constrained to a maximum of 7% rather than exactly 7% during the optimisation (i.e the risk will end up being close to 7% rather than exactly equal)? Is there a way of having a strict equality by forcing the lower bound as well ?
I am really thankful for the time you spend on this.
Kind regards
Pierre
-----Original Message-----
From: alexios [mailto:alexios at 4dscape.com]
Sent: 23 January 2015 14:48
To: Pierre Org; 'Ilya Kipnis'
Cc: r-sig-finance at r-project.org
Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return.
1. The risk is variance, NOT standard deviation.
2. From the manual:
"riskB: For the case that riskType is ?maxreward?, then riskB is the
upper bound for the risk constraint."
_Note_ the "upper bound".
3. Because of the quality of the SOCP solver currently used, you should probably scale your data by 100.
Therefore:
m = m*100
riskB = (7^2)/12
spec <- parmaspec(S = as.matrix(cov(m)),
riskB=riskB,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=as.numeric(colMeans(m))) port <- parmasolve(spec, solver="SOCP")
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 3.3703562
Reward : 1.634234
Optimal_Weights
World.Ex.UK.Stocks 1
> sqrt(parmarisk(port))*sqrt(12)/100
[1] 0.06359581
> parmareward(port)/100
[1] 0.01634234 But note:
>port at solution$status
"Error (0)" i.e. "probably" unreliable solution. A new SOCP solver will be available sometime this year (courtesy of Bernhard Pfaff)...until then, use with caution. Regards, Alexios On 23/01/2015 13:59, Pierre Org wrote:
Hi Ilya
Many thanks for pointing me toward the PARMA package. I have tried to use it but I seem to fail, I am not sure I am doing things right. When I optimise for a given level of risk (7% annualised) and then check what the portfolio volatility with the in-sample weights the level risk does not seem to equate to the intended target risk.
Gilts World Ex UK Stocks UK Stocks
2014-02-28 1.548142e-03 0.0279529433 4.838851e-02
2014-03-31 7.806639e-05 0.0105305699 -2.702980e-02
2014-04-30 7.377730e-03 -0.0052597245 3.158530e-02
2014-05-31 9.628424e-03 0.0282594842 1.481751e-02
2014-06-30 -5.580206e-03 0.0001037494 -1.283548e-02
2014-07-31 1.057991e-02 -0.0034606566 -3.263463e-05
2014-08-31 3.487462e-02 0.0404001701 2.027569e-02
2014-09-30 -6.982201e-03 -0.0005089251 -2.937074e-02
2014-10-31 1.384694e-02 0.0226491298 -1.050032e-02
2014-11-30 3.209176e-02 0.0427556870 2.914371e-02
I use the above data as an input (m) to the optimiser then force my
monthly standard deviation to 0.07/sqrt(12)
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
The annualised standard deviation of my series are :
apply(m,2,sd)*sqrt(12)
Gilts World Ex UK Stocks UK Stocks
0.04938711 0.06359545 0.09144821
so a 7% target risk portfolio that maximise return should exist as a solution. Anyhow the resulting weights from the above dataseries are calculated as:
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 0.0005859
Reward : 0.0110454
Optimal_Weights
World Ex UK Stocks 0.9581
Gilts 0.0419
Now when I use the solution weights I do not get the same monthly
targeted risk. I realise that the risk
w <- parmasolve(spec, solver="SOCP")@solution$weights
sd(rowSums(t(apply(m,1,function(x) x*t(w)))))*sqrt(12)
[1] 0.0624795
My portfolio do not have a standard deviation of 0.7 as I was
expecting??
It is probably obvious to many of the PARMA users?but I can t understand where I get it wrong as the portfolio is obviously feasible. What I want is the portfolio that maximise return amongst all the possible portfolios with a 7% annualised vol.
Any idea ?
From: Ilya Kipnis [mailto:ilya.kipnis at gmail.com]
Sent: 21 January 2015 15:50
To: Pierre Org
Cc: r-sig-finance at r-project.org
Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return.
Check out the PortfolioAnalytics package.
On Wed, Jan 21, 2015 at 6:13 AM, Pierre Org <pierre at lequeux.org> wrote:
I am currently working on a portfolio optimisation strategy that would
involves optimising a portfolio so that it maximises the returns for a user
defined level of risk. E.g. keeping the volatility of the portfolio at 10%
annualised whilst maximising the return for this level. For that
purpose I was hoping to use the function maxreturnPortfolio in
fPortfolio that should return the portfolio with the maximal return for a fixed target risk.
Clearly though showing in this great package the function has been/is
in development by the authors of the package and currently does not
work as intended. This is confirmed by various posts and answer to those by the
authors. I wonder if anyone knows of another more up to date package or
way of doing this in R ?
Any help would be really appreciated.
[[alternative HTML version deleted]]
_______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go. [[alternative HTML version deleted]] _______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.
Hi Alexios, Thank you for clarifying this...I guees I will have to be patient and wait for the new solver.... Many thanks again for your help. Have a good week end Pierre -----Original Message----- From: alexios [mailto:alexios at 4dscape.com] Sent: 23 January 2015 16:10 To: Pierre Org; 'Ilya Kipnis' Cc: r-sig-finance at r-project.org Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return. Hi Pierre, The inequality constraint 'cannot' be turned into an equality one with the solver currently in use...I tried this in the past using auxiliary variables, but it was really hit and miss..best to wait for the new solver to be plugged in. Alternatively, if you have a commercial license to one of the solver(s) now interfacing with R, you should be able to represent and solve this type of problem much more confidently. Regards, Alexios
On 23/01/2015 15:21, Pierre Org wrote:
Hi Alexios
Many thanks for the below this is really useful to me (and hopefully others). Yes I understood since my previous post that the risk was expressed as variance rather than standard deviation. In respect of upper bound, I assume that you mean that the portfolio risk is constrained to a maximum of 7% rather than exactly 7% during the optimisation (i.e the risk will end up being close to 7% rather than exactly equal)? Is there a way of having a strict equality by forcing the lower bound as well ?
I am really thankful for the time you spend on this.
Kind regards
Pierre
-----Original Message-----
From: alexios [mailto:alexios at 4dscape.com]
Sent: 23 January 2015 14:48
To: Pierre Org; 'Ilya Kipnis'
Cc: r-sig-finance at r-project.org
Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return.
1. The risk is variance, NOT standard deviation.
2. From the manual:
"riskB: For the case that riskType is ?maxreward?, then riskB is the
upper bound for the risk constraint."
_Note_ the "upper bound".
3. Because of the quality of the SOCP solver currently used, you should probably scale your data by 100.
Therefore:
m = m*100
riskB = (7^2)/12
spec <- parmaspec(S = as.matrix(cov(m)),
riskB=riskB,risk="EV",riskType="maxreward", LB = rep(0,3), UB =
rep(1,3), budget=1, forecast=as.numeric(colMeans(m))) port <-
parmasolve(spec, solver="SOCP")
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 3.3703562
Reward : 1.634234
Optimal_Weights
World.Ex.UK.Stocks 1
> sqrt(parmarisk(port))*sqrt(12)/100
[1] 0.06359581
> parmareward(port)/100
[1] 0.01634234 But note:
>port at solution$status
"Error (0)" i.e. "probably" unreliable solution. A new SOCP solver will be available sometime this year (courtesy of Bernhard Pfaff)...until then, use with caution. Regards, Alexios On 23/01/2015 13:59, Pierre Org wrote:
Hi Ilya
Many thanks for pointing me toward the PARMA package. I have tried to use it but I seem to fail, I am not sure I am doing things right. When I optimise for a given level of risk (7% annualised) and then check what the portfolio volatility with the in-sample weights the level risk does not seem to equate to the intended target risk.
Gilts World Ex UK Stocks UK Stocks
2014-02-28 1.548142e-03 0.0279529433 4.838851e-02
2014-03-31 7.806639e-05 0.0105305699 -2.702980e-02
2014-04-30 7.377730e-03 -0.0052597245 3.158530e-02
2014-05-31 9.628424e-03 0.0282594842 1.481751e-02
2014-06-30 -5.580206e-03 0.0001037494 -1.283548e-02
2014-07-31 1.057991e-02 -0.0034606566 -3.263463e-05
2014-08-31 3.487462e-02 0.0404001701 2.027569e-02
2014-09-30 -6.982201e-03 -0.0005089251 -2.937074e-02
2014-10-31 1.384694e-02 0.0226491298 -1.050032e-02
2014-11-30 3.209176e-02 0.0427556870 2.914371e-02
I use the above data as an input (m) to the optimiser then force my
monthly standard deviation to 0.07/sqrt(12)
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
The annualised standard deviation of my series are :
apply(m,2,sd)*sqrt(12)
Gilts World Ex UK Stocks UK Stocks
0.04938711 0.06359545 0.09144821
so a 7% target risk portfolio that maximise return should exist as a solution. Anyhow the resulting weights from the above dataseries are calculated as:
spec <- parmaspec(S = cov(m) ,riskB= 0.07/sqrt(12) ,risk="EV",riskType="maxreward", LB = rep(0,3), UB = rep(1,3), budget=1, forecast=colMeans(m))
parmasolve(spec, solver="SOCP")}
+---------------------------------+
| PARMA Portfolio |
+---------------------------------+
No.Assets : 3
Problem : SOCP
Risk Measure : EV
Objective : maxreward
Risk : 0.0005859
Reward : 0.0110454
Optimal_Weights
World Ex UK Stocks 0.9581
Gilts 0.0419
Now when I use the solution weights I do not get the same monthly
targeted risk. I realise that the risk
w <- parmasolve(spec, solver="SOCP")@solution$weights
sd(rowSums(t(apply(m,1,function(x) x*t(w)))))*sqrt(12)
[1] 0.0624795
My portfolio do not have a standard deviation of 0.7 as I was
expecting??
It is probably obvious to many of the PARMA users?but I can t understand where I get it wrong as the portfolio is obviously feasible. What I want is the portfolio that maximise return amongst all the possible portfolios with a 7% annualised vol.
Any idea ?
From: Ilya Kipnis [mailto:ilya.kipnis at gmail.com]
Sent: 21 January 2015 15:50
To: Pierre Org
Cc: r-sig-finance at r-project.org
Subject: Re: [R-SIG-Finance] Portfolio Optimisation as a function of targeted Risk rather than return.
Check out the PortfolioAnalytics package.
On Wed, Jan 21, 2015 at 6:13 AM, Pierre Org <pierre at lequeux.org> wrote:
I am currently working on a portfolio optimisation strategy that
would involves optimising a portfolio so that it maximises the returns for a user
defined level of risk. E.g. keeping the volatility of the portfolio at 10%
annualised whilst maximising the return for this level. For that
purpose I was hoping to use the function maxreturnPortfolio in
fPortfolio that should return the portfolio with the maximal return for a fixed target risk.
Clearly though showing in this great package the function has
been/is in development by the authors of the package and currently
does not work as intended. This is confirmed by various posts and answer to those by the
authors. I wonder if anyone knows of another more up to date package or
way of doing this in R ?
Any help would be really appreciated.
[[alternative HTML version deleted]]
_______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go. [[alternative HTML version deleted]] _______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.