Portfolio rebalancing frequency

Hi,


Are there any constraints regarding the portfolio rebalancing frequency? Can it be monthly?

Hi Joan,

For this competition, the sponsor is looking for a strategy with a low rebalancing frequency. Consequently, we apply a fixed penalty to every rebalancing you make. The more you rebalance, the more penalised you get, regardless of the size of your rebalancings.


On top of the fixed one-off penalty per rebalancing, you incur rebalancing costs. These are proportional to the size of your rebalancings.


If you rebalance frequently (high number of rebalancing) and large amounts (large differences in allocations) then you’re performance will very quickly erode. You can test the effect of rebalancings thanks to the stressTest() function. Let’s take an example with a daily equal weight portfolio (meaning we maintain 1/3 allocation everyday in each underlying BB of the alphathon):


Create your equal weight portfolio and store it in “port”:

> portfolio(list(“TYa”,“USHYa”,“BNKa”)) %>%

  • payout(equalWeight) %>%
    
  •     evaluate() -> port
    


Run the stressTest function on “port”:

> stressTest(port, submit = FALSE)
Name = ‘equalWeightherve200410’
User = ‘herve’
Date = ‘2020-04-10 23:53:25’

Checking logic of indicator function

Running payout in a 50 day loop

Date Range = 2016-08-30 :: 2016-10-19

Comparing original weights with test weights generated with subsetted data
|==================================================| 100% elapsed = 26s

No look ahead bias detected

Performing simple backtest…

Calculating metrics with transaction costs
Annualised Returns(%) Sharpe
Portfolio 3.74181 0.43726
Portfolio with trading costs 0.36079 0.04203
Portfolio with trading costs and rebalancing penalty -6.52177 -0.75952


The last part of the output displays your results with the effect from rebalancing costs and the penalty. Trading costs alone erode your performance by ~3.4% a year, and the fact that you rebalance every day further decreases returns by ~6.8%, costing you a hefty 10% or so in total.


In order to optimise the number of necessary rebalancings, you can use a fonction called minRebalFreq(), which basically optimises you allocation frequency. There is no need to rebalance positions if the change in allocation is minimal for instance. For more information around rebalancing costs, penalty, and ways to optimise them, please check out:

https://wiki.alphien.com/ALwiki/Rebalancing_and_transaction_costs


Following from our naive equal weight example, we apply the minRebalFreq() function on top of our payout like this:

> portfolio(list(“TYa”,“USHYa”,“BNKa”)) %>%

  • payout(equalWeight) %>%
    
  • payout(minRebalFreq) %>%
    
  •     evaluate -> optPort
    


We can run the stressTest() function again (please note that this will take longer, a few minutes, up to

10 min, depending on your payout complexity):

> stressTest(optPort, submit = FALSE)
Name = ‘equalWeightminRebalFreqherve200411’
User = ‘herve’
Date = ‘2020-04-11 00:08:47’

Checking logic of indicator function

Running payout in a 50 day loop

Date Range = 2015-04-10 :: 2015-05-30

Comparing original weights with test weights generated with subsetted data
|==================================================| 100% elapsed = 04m 37s

No look ahead bias detected

Performing simple backtest…

Calculating metrics with transaction costs
Annualised Returns(%) Sharpe
Portfolio 3.68291 0.43298
Portfolio with trading costs 2.99659 0.35076
Portfolio with trading costs and rebalancing penalty 2.89753 0.33903


You can see that the minRebalFreq() function has optimised the number of rebalancing and the total cost incurred has dramatically dropped. It costs you around 80 basis point a year all in.


Targeting a monthly rebalancing to start with is a reasonable approach. You can then apply the function minRebalFreq() to see if it improves your performance.


Hope this helps, don’t hesitate to follow up on the thread if you need more info.

Best,


Hervé