Dear Pankaj,
thank you very much for the suggestion, unfortunately that did not fix it, it results in the same error message(s). I just posted the question to QuantExchange, maybe someone on there has a suggestion.
Kind regards!
Gesendet: Dienstag, 15. November 2022 um 12:14 Uhr
Von: "Pankaj K Agarwal" <[email protected]>
An: "[email protected]" <[email protected]>, "Jarno Bergmeier" <[email protected]>
Betreff: Re: [R-SIG-Finance] PortfolioAnalytics: Out-of-sample optimization with transaction cost constraint
Von: "Pankaj K Agarwal" <[email protected]>
An: "[email protected]" <[email protected]>, "Jarno Bergmeier" <[email protected]>
Betreff: Re: [R-SIG-Finance] PortfolioAnalytics: Out-of-sample optimization with transaction cost constraint
Dear Jarno
Perhaps you could try adding Trace = TRUE argument in your optimize.portfolio.rebalancing call.
Regards,
Pankaj K Agarwal
+91-98397-11444
On Tuesday, 15 November, 2022 at 04:37:21 pm IST, Jarno Bergmeier <[email protected]> wrote:
Hello everyone,
I am currently trying to run an out-of-sample-optimization with the PortfolioAnalytics package, where the quadratic utility function of the investor also penalizes transaction costs (40bps) through the numeric solver. The vignette states that this can be implemented via a constraint that is supported for quadratic utility maximization using the ROI solver. However, this does not work for me. I have the following exemplary code:
library(xts)
library(PortfolioAnalytics)
library(ROI)
library(quadprog)
options(scipen = 999)
library(PortfolioAnalytics)
library(ROI)
library(quadprog)
options(scipen = 999)
data("edhec")
returns = edhec[, 1:3]
colnames(returns) = c("CA", "CTAG", "DS")
returns = edhec[, 1:3]
colnames(returns) = c("CA", "CTAG", "DS")
port <- portfolio.spec(assets = colnames(returns))
port <- add.constraint(port, "long_only")
port <- add.constraint(port, "weight_sum", min_weight = 1, max_weight = 1)
port <- add.constraint(port, "transaction_cost", ptc = 0.004)
port <- add.objective(port, type = "risk", name = "var", risk_aversion = 10)
port <- add.objective(port, type = "return", name = "mean")
port <- add.constraint(port, "long_only")
port <- add.constraint(port, "weight_sum", min_weight = 1, max_weight = 1)
port <- add.constraint(port, "transaction_cost", ptc = 0.004)
port <- add.objective(port, type = "risk", name = "var", risk_aversion = 10)
port <- add.objective(port, type = "return", name = "mean")
opt_TC = optimize.portfolio.rebalancing(R = returns, portfolio = port, optimize_method = "ROI", rebalance_on = "months", training_period = 100, rolling_window = NULL)
rr_TC = Return.portfolio(returns, weights = extractWeights(opt_TC))
charts.PerformanceSummary(rr_TC)
chart.Weights(opt_TC)
charts.PerformanceSummary(rr_TC)
chart.Weights(opt_TC)
When I run this code without the transaction cost constraint it works fully as intended. However, if I run it with the TC constraint, I suddenly receive the following error messages:
> charts.PerformanceSummary(rr_TC)
Error in `[.xts`(x, start.row, 1) : subscript out of bounds
> chart.Weights(opt_TC)
Error in plot.window(xlim, ylim, log = log, ...) :
need finite 'ylim' values
Error in `[.xts`(x, start.row, 1) : subscript out of bounds
> chart.Weights(opt_TC)
Error in plot.window(xlim, ylim, log = log, ...) :
need finite 'ylim' values
It does work with the "DEoptim" solver (although the solutions somehow look strange to me), but I would want to run it using the ROI solver, which should be possible as I understand it. Has someone had a similar problem and was able to fix it?
Kind regards,
Jarno
Jarno
[email protected] 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.
_______________________________________________ [email protected] 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.
