Analyzing the Cost Benefits of Robo-Advisors


Author :: Kevin Vecmanis


Robo-advisors are on a clear path to dominating the future of asset management. I was curious about how beneficial some of the cost benefits of robo advisors can be on the growth of a portfolio. In this series we perform some hypothesis testing to analyze the benefits offered by robo-advisors rather than directing your own portfolio. How significant are they?

Table of Contents

Preface

Before we begin the analysis, I want to note that in this post we only analyze the impact of cost benefits that are tangible - things like fractional shares, zero trading costs, etc…

It should be noted that robo advisors are typically a turn-key wealth management solution that saves you time as well (Which is valuable!). Those time savings aren’t factored into this analysis.

Introduction:

In this post I’m going to perform a study on the value that can be added by robo-advisors that have the ability to purchase fractional shares and can minimize (or eliminate) trading costs. I’m going to explore under what circumstances this ability might be beneficial, and attempt to measure the benefits by testing a few hypotheses.

This analysis is going to use the PortfolioOptimizer class and the RebalancingSimulator class from a project I have posted on Github. You can freely download and use these tools here: VanAurum Robo Advisor.

In this study, I specify a maximum/minimum initial portfolio position of 35% / 5%. From this, the PortfolioOptimizer class will build us a Markowitz optimal portfolio such that no individual asset has an allocation greater than 35% or less than 5%.

For a complete walk-through of algorithmic portfolio optimization, read my tutorial on it here: Algorithm Portfolio Optimization

Our first four experiments will be done using five US-listed passive ETFs that replicate the portfolio I have with my current robo-advisor.

  • EWC - Canadian Equity ETF
  • SPY - S&P500 ETF
  • SHY - 1-3 Month US Treasury ETF
  • VGLT - Long Term US Government Bond ETF
  • VEU - World Equity index ex. US

In the last experiment, I replace the bond ETFs with higher volatility assets. Our higher volatility portfolio will be comprised of:

  • GLD - Gold ETF
  • SPY - S&P500 ETF
  • VDE - Vanguard Energy ETF
  • IBB - Biotechnology ETF
  • VEU - World Equity inex ex. US

    The analysis is done accordingly:

  • In each experiment I run a thousand simulations using a Monte Carlo technique on two subject portfolios.
  • Statistical tests are then done on the value of interest to determine if any statistical significance exists.
  • Neither portfolio has additional contributions or distributions during the simulation timeframe.
  • Each simulation is done over a 10-year timeframe.
  • The distributions for the Monte Carlo simulation are generated from the mean return and variance of each asset class in the portfolio.

    The experiments will be:

  • Experiment 1: Measure the impact of fractional share purchases and trading costs on two portfolios with the same starting value and rebalancing threshold.
  • Experiment 2: Measure the impact of starting portfolio value on the two portfolios from Experiment 1.
  • Experiment 3: Measure the impact of raising the rebalancing threshold to 20% from 10% on the two portfolios from Experiment 1.
  • Experiment 4: Measure the impact of lowering the rebalancing threshold to 2% from 10% on the two portfolios from Experiment 1.
  • Experiment 5: Repeat experiments 1 through 4 on a portfolio with much higher volatility to see if any of the tested benefits are more prounounced in the presence of higher volatility.

For simplicity, any costs associated with my time required to rebalance my own portfolio are neglected - although that is definitely a major benefit of having your portfolio professionally managed!

Initializing the Portfolio

assets = ['EWC','SPY','SHY','VGLT','VEU']
p = PortfolioOptimizer(assets, portfolio_size = 5, max_pos = 0.35, min_pos = 0.05, print_init=False)
Number of unique asset combinations:  1
Analyzing 1 of 1 asset combinations...
Omitted assets:  []
---
Time to fetch data: 10.17 seconds
---
-----------------------------------------------
----- Portfolio Optimized for Sharpe Ratio ----
-----------------------------------------------

('EWC', 0.05)
('SPY', 0.2977)
('SHY', 0.2523)
('VGLT', 0.35)
('VEU', 0.05)

Optimal Portfolio Return:  6.3048
Optimal Portfolio Volatility:  5.4639
Optimal Portfolio Sharpe Ratio:  1.1539


Experiment 1: Effect of fractional share purchases and trade costs

Next we’re going to declare our rebalancer object using the RebalancingSimulator class. We’re going to run simulations on two different portfolios:

  • sim_1: Allows fractions units, assumes zero trade costs. This will simulate the portfolio with my robo-advisor.
  • sim_2: Must buy whole units, and trade costs are 6.99. This is my current trade cost with my brokerage and will model the costs I would incur by rebalancing on my own.

For now, both simulations have weight thresholds of 10%. This means if the weight of one asset exceeds its target weighting by 10% in either direction, a rebalancing event will be triggered in the algorithm. In the second part of this study we’re going to iterate through a range of rebalancing thresholds to see what produces the best portfolio performance for both my robo-advisor, and under my own management.

sim_1a = RebalancingSimulator(p, frac_units=True, portfolio_value = 25000, trade_cost = 0)
Target weights:  [('EWC', 0.05), ('SPY', 0.2977), ('SHY', 0.2523), ('VGLT', 0.35), ('VEU', 0.05)]
Cash balance after portfolio initialization:  0.0
sim_2a = RebalancingSimulator(p, frac_units=False, portfolio_value = 25000, trade_cost=  6.99)
Target weights:  [('EWC', 0.05), ('SPY', 0.2977), ('SHY', 0.2523), ('VGLT', 0.35), ('VEU', 0.05)]
Cash balance after portfolio initialization:  242.145


We can see, right off the bat that the robo-advisor is able to deploy all cash immediately. With the constraints on my account I have idle cash that the algorithm couldn’t employ.

sim_1a.run_monte_carlo(iterations = 1000)
sim_2a.run_monte_carlo(iterations = 1000)
sim_1a._calculate_sim_metrics()


Results from Simulation 1
Portfolio 1 Simulation Analytics (Robo-Advisor)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  46844.9613
Standard Deviation of Terminal Portfolio Values:  9091.3957
Mean number of total trades executed:  72.099
Standard Deviation of total trades executed:  8.3927
Mean total trade cost:  0
Standard Deviation of total trade costs:  0.0
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.1
Lower rebalance threshold:  0.9
sim_2a._calculate_sim_metrics()
Results from Simulation 2
Portfolio 2 Simulation Analytics (Self-directed)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  46350.3245
Standard Deviation of Terminal Portfolio Values:  9153.916
Mean number of total trades executed:  77.809
Standard Deviation of total trades executed:  9.6909
Mean total trade cost:  543.8849
Standard Deviation of total trade costs:  67.7397
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.1
Lower rebalance threshold:  0.9


We can do a t-test on the portfolio means of these two simulations to see if they’re significantly different. The variables term_portvals_ stores the list of our mean portfolio values from the simulation so that it can be accessed.

At the 5% significance level we can set a hypothesis test up accordingly:

import scipy
from scipy.stats import ttest_ind

x1=sim_1a.term_port_vals_
x2=sim_2a.term_port_vals_
val, p_val=scipy.stats.ttest_ind(x1, x2, equal_var=True)

if p_val > 0.05:
	print('Portfolio mean values are likely drawn from the same distributions (fail to reject H0)')
else:
	print('Portfolio mean values are likely drawn from different distributions (reject H0)')
    
print('P-Value: ', p_val)
print('T-Statistic: ', val)
Portfolio mean values are likely drawn from the same distributions (fail to reject H0)
P-Value:  0.22550088925119552
T-Statistic:  1.2124045781741553
Analysis

Our conclusion here is that using these portfolio management parameters, the performance difference between trading costs at 6.99 and 0, and fractional units versus no fractional units is not statistically significant.

But this seems to be counterintuitive. One would expect the addition of trading costs would add material frictional costs to the portfolio over time. We can see here that in both portfolios we’re only executing about 70 trades over ten years to keep the portfolio rebalanced. It’s likely that the benefits are diminished as these costs become a smaller portion (as a percentage) of the portfolio.

I’m going to formulate the hypothesis that the starting value of the portfolio might be more strongly related to the performance of the portfolio versus the robo-advisor portfolio. Right now our starting portfolio value is $25,000. Let’s make trading costs a higher percentage of portfolio value by lowering our starting portfolio value down to $1,000.

Experiment 2: Effect of starting portfolio value

We’re going to label these new simulations sim_1b and sim_2b.

sim_1b = RebalancingSimulator(p, frac_units=True, portfolio_value=1000, trade_cost=0)
sim_2b = RebalancingSimulator(p, frac_units=False, portfolio_value=1000, trade_cost=6.99)
Target weights:  [('EWC', 0.05), ('SPY', 0.2977), ('SHY', 0.2523), ('VGLT', 0.35), ('VEU', 0.05)]
Cash balance after portfolio initialization:  0.0

Target weights:  [('EWC', 0.05), ('SPY', 0.2977), ('SHY', 0.2523), ('VGLT', 0.35), ('VEU', 0.05)]
Cash balance after portfolio initialization:  236.38

Run the simulations and test the hypothesis…

Portfolio 1 Simulation Analytics (Robo-Advisor)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  1881.8787
Standard Deviation of Terminal Portfolio Values:  370.8978
Mean number of total trades executed:  72.209
Standard Deviation of total trades executed:  8.5434
Mean total trade cost:  0
Standard Deviation of total trade costs:  0.0
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.1
Lower rebalance threshold:  0.9

Portfolio 2 Simulation Analytics (Self-directed)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  1568.7707
Standard Deviation of Terminal Portfolio Values:  507.3303
Mean number of total trades executed:  45.179
Standard Deviation of total trades executed:  10.1912
Mean total trade cost:  315.8012
Standard Deviation of total trade costs:  71.2366
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.1
Lower rebalance threshold:  0.9

Portfolio mean values are likely drawn from different distributions (reject H0)
P-Value:  8.3385909658330845e-53
T-Statistic:  15.75518303468699


Analysis

Here we get a different result and we’re able to reject the null hypothesis that the portfolio performance is the same. In this instance, a smaller portfolio value invested with the robo-advisor outperformed the self-managed portfolio by a statistically significant margin. This suggests that those with smaller amounts to invest can benefit from the economies of scale generated internally within the robo-advisor.

Let’s go a different direction. Let’s take a look at how adjusting the rebalancing thresholds might affect portfolio values under our self-managed portfolio and the robo-advisor portfolio. Right now they’re set to 10%. Let’s try two experiments: one with the threshold raised to 20%, and the other moved down to 2%.

Experiment 3: Effect of raising the rebalancing threshold to 20%

We can access these threshold values directly through the RebalancingSimulator objects.

sim_1a.thresh_high_ = 1.2 
sim_1a.thresh_low_ = 0.8

sim_2a.thresh_high_ = 1.2
sim_2a.thresh_low_ = 0.8

sim_1a.run_monte_carlo(iterations = 1000)
sim_2a.run_monte_carlo(iterations = 1000)

sim_1a._calculate_sim_metrics()
sim_2a._calculate_sim_metrics()

x1 = sim_1a.term_port_vals_
x2 = sim_2a.term_port_vals_

val, p_val=scipy.stats.ttest_ind(x1, x2, equal_var=True)

if p_val > 0.05:
	print('Portfolio mean values are likely drawn from the same distributions (fail to reject H0)')
else:
	print('Portfolio mean values are likely drawn from different distributions (reject H0)')
    
print('P-Value: ', p_val)
print('T-Statistic: ', val)
Portfolio 1 Simulation Analytics (Robo-Advisor)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  46766.4722
Standard Deviation of Terminal Portfolio Values:  9472.2825
Mean number of total trades executed:  19.652
Standard Deviation of total trades executed:  4.302
Mean total trade cost:  0
Standard Deviation of total trade costs:  0.0
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.2
Lower rebalance threshold:  0.8

Portfolio 2 Simulation Analytics (Self-directed)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  46948.0078
Standard Deviation of Terminal Portfolio Values:  9701.5863
Mean number of total trades executed:  20.819
Standard Deviation of total trades executed:  4.494
Mean total trade cost:  145.5248
Standard Deviation of total trade costs:  31.4134
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.2
Lower rebalance threshold:  0.8

Portfolio mean values are likely drawn from the same distributions (fail to reject H0)
P-Value:  0.672059519451224
T-Statistic:  -0.42338559895589567


Analysis

With the rebalancing threshold raised to 20%, the performance between the two portfolios becomes statistically insignificant and we fail to reject the null hypothesis that their performance is the same.



Experiment 4: Effect of lowering the rebalancing threshold to 2%

sim_1a.thresh_high_ = 1.02
sim_1a.thresh_low_ = 0.98

sim_2a.thresh_high_ = 1.02
sim_2a.thresh_low_ = 0.98

sim_1a.run_monte_carlo(iterations=1000)
sim_2a.run_monte_carlo(iterations=1000)

sim_1a._calculate_sim_metrics()
sim_2a._calculate_sim_metrics()

x1=sim_1a.term_port_vals_
x2=sim_2a.term_port_vals_

val, p_val = scipy.stats.ttest_ind(x1, x2, equal_var=True)

if p_val > 0.05:
	print('Portfolio mean values are likely drawn from the same distributions (fail to reject H0)')
else:
	print('Portfolio mean values are likely drawn from different distributions (reject H0)')
    
print('P-Value: ', p_val)
print('T-Statistic: ', val)
Portfolio 1 Simulation Analytics (Robo-Advisor)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  46760.6484
Standard Deviation of Terminal Portfolio Values:  9541.1136
Mean number of total trades executed:  1131.086
Standard Deviation of total trades executed:  31.7611
Mean total trade cost:  0
Standard Deviation of total trade costs:  0.0
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.02
Lower rebalance threshold:  0.98

Portfolio 2 Simulation Analytics (Self-directed)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  34732.0628
Standard Deviation of Terminal Portfolio Values:  8433.5213
Mean number of total trades executed:  1565.526
Standard Deviation of total trades executed:  154.4609
Mean total trade cost:  10943.0267
Standard Deviation of total trade costs:  1079.6817
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.02
Lower rebalance threshold:  0.98

Portfolio mean values are likely drawn from different distributions (reject H0)
P-Value:  2.1121667708179487e-162
T-Statistic:  29.870778308892245


Analysis

As you might expect, the total number of trades and the total trade cost ramped up significantly for the self-directed portfolio when the rebalancing threshold is set to 2% from 10%. The difference in performance of this portfolio from the robo-advisor portfolio is also statistically significant.

The last test I want to do is to test the relationship between the rebalancing threshold and portfolio performance.

Experiment 5: Exploring the effects of a higher volatility (risk) portfolio.

The intention of this experiment is to see if there is a benefit / disbenefit related to investors with different risk appetites. Put another way, are the benefits of robo-advisors enhanced for someone with a riskier portfolio? We would expect it to be because a portfolio with higher volatilty is likely to trigger a higher volume of rebalancing events. Let’s find out!

For this we need to create out new, higher volatility portfolio with riskier assets…

assets = ['GLD','SPY','VDE','IBB','VEU']
p = PortfolioOptimizer(assets, portfolio_size=5, max_pos=0.35, min_pos=0.05, print_init=False)
Number of unique asset combinations:  1
Analyzing 1 of 1 asset combinations...
Omitted assets:  []
---
Time to fetch data: 10.61 seconds
---
-----------------------------------------------
----- Portfolio Optimized for Sharpe Ratio ----
-----------------------------------------------

('GLD', 0.35)
('SPY', 0.2)
('VDE', 0.05)
('IBB', 0.35)
('VEU', 0.05)

Optimal Portfolio Return:  8.4566
Optimal Portfolio Volatility:  15.3323
Optimal Portfolio Sharpe Ratio:  0.5516


We can see here that our new portfolio volatility is 15.3323% compared to 5.4% for the previous portfolio. Let’s run the simulations now.

We’ll call these simulations sim_1c and sim_2c.

sim_1c = RebalancingSimulator(p, frac_units=True, portfolio_value=25000, trade_cost=0)
sim_2c = RebalancingSimulator(p, frac_units=False, portfolio_value=25000, trade_cost=6.99)
Target weights:  [('GLD', 0.35), ('SPY', 0.2), ('VDE', 0.05), ('IBB', 0.35), ('VEU', 0.05)]
Cash balance after portfolio initialization:  0.0

Target weights:  [('GLD', 0.35), ('SPY', 0.2), ('VDE', 0.05), ('IBB', 0.35), ('VEU', 0.05)]
Cash balance after portfolio initialization:  360.85



With rebalancing threshold at the default of 10%
sim_1c.run_monte_carlo(iterations=1000)
sim_2c.run_monte_carlo(iterations=1000)

sim_1c._calculate_sim_metrics()
sim_2c._calculate_sim_metrics()

x1 = sim_1c.term_port_vals_
x2 = sim_2c.term_port_vals_

val, p_val = scipy.stats.ttest_ind(x1, x2, equal_var=True)

if p_val > 0.05:
	print('Portfolio mean values are likely drawn from the same distributions (fail to reject H0)')
else:
	print('Portfolio mean values are likely drawn from different distributions (reject H0)')
    
print('P-Value: ', p_val)
print('T-Statistic: ', val)
Portfolio 1 Simulation Analytics (Robo-Advisor)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  57617.1247
Standard Deviation of Terminal Portfolio Values:  21889.1015
Mean number of total trades executed:  173.743
Standard Deviation of total trades executed:  12.2805
Mean total trade cost:  0
Standard Deviation of total trade costs:  0.0
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.1
Lower rebalance threshold:  0.9

Portfolio 2 Simulation Analytics (Self-Directed)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  55629.7216
Standard Deviation of Terminal Portfolio Values:  20726.4701
Mean number of total trades executed:  204.589
Standard Deviation of total trades executed:  47.4922
Mean total trade cost:  1430.0771
Standard Deviation of total trade costs:  331.9708
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.1
Lower rebalance threshold:  0.9

Portfolio mean values are likely drawn from different distributions (reject H0)
P-Value:  0.03721123229084955
T-Statistic:  2.084832117434201


Analysis

Here we can see that by increasing the portfolio volatility and using our base threshold of 10%, the performance difference in the portfolios becomes statistically significant. We can reject the null hypothesis at the 5% significance level and say that the robo-advisor portfolio outperforms the self-directed portfolio for this higher volatility basket.



With rebalancing threshold set to 20%
sim_1c.thresh_high_ = 1.2
sim_1c.thresh_low_ = 0.8

sim_2c.thresh_high_ = 1.2
sim_2c.thresh_low_ = 0.8

sim_1c.run_monte_carlo(iterations=1000)
sim_2c.run_monte_carlo(iterations=1000)

sim_1c._calculate_sim_metrics()
sim_2c._calculate_sim_metrics()

x1=sim_1c.term_port_vals_
x2=sim_2c.term_port_vals_

val, p_val = scipy.stats.ttest_ind(x1, x2, equal_var=True)

if p_val > 0.05:
	print('Portfolio mean values are likely drawn from the same distributions (fail to reject H0)')
else:
	print('Portfolio mean values are likely drawn from different distributions (reject H0)')
    
print('P-Value: ', p_val)
print('T-Statistic: ', val)
Portfolio 1 Simulation Analytics (Robo-Advisor)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  57869.9676
Standard Deviation of Terminal Portfolio Values:  21845.4317
Mean number of total trades executed:  46.508
Standard Deviation of total trades executed:  6.7233
Mean total trade cost:  0
Standard Deviation of total trade costs:  0.0
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.2
Lower rebalance threshold:  0.8

Portfolio 2 Simulation Analytics (Self-Directed)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  57066.6093
Standard Deviation of Terminal Portfolio Values:  20674.4447
Mean number of total trades executed:  48.527
Standard Deviation of total trades executed:  9.2099
Mean total trade cost:  339.2037
Standard Deviation of total trade costs:  64.3771
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.2
Lower rebalance threshold:  0.8

Portfolio mean values are likely drawn from the same distributions (fail to reject H0)
P-Value:  0.3984172981192645
T-Statistic:  0.8446322895205416


Analysis

With an increase in the rebalancing threshold to 20%, the performance difference between the portfolios becomes insignificant and we can’t reject the null hypothesis that the performance of both portfolios is the same.



With rebalancing threshold set to 2%
sim_1c.thresh_high_ = 1.02
sim_1c.thresh_low_ = 0.98

sim_2c.thresh_high_ = 1.02
sim_2c.thresh_low_ = 0.98

sim_1c.run_monte_carlo(iterations=1000)
sim_2c.run_monte_carlo(iterations=1000)

sim_1c._calculate_sim_metrics()
sim_2c._calculate_sim_metrics()

x1 = sim_1c.term_port_vals_
x2 = sim_2c.term_port_vals_

val, p_val = scipy.stats.ttest_ind(x1, x2, equal_var=True)

if p_val > 0.05:
	print('Portfolio mean values are likely drawn from the same distributions (fail to reject H0)')
else:
	print('Portfolio mean values are likely drawn from different distributions (reject H0)')
    
print('P-Value: ', p_val)
print('T-Statistic: ', val)
Portfolio 1 Simulation Analytics (Robo-Advisor)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  59171.4719
Standard Deviation of Terminal Portfolio Values:  21425.8674
Mean number of total trades executed:  2335.179
Standard Deviation of total trades executed:  40.9926
Mean total trade cost:  0
Standard Deviation of total trade costs:  0.0
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.02
Lower rebalance threshold:  0.98

Portfolio 2 Simulation Analytics (Self-Directed)
--------------------------------
Simulations run:  1000
Mean Terminal Portfolio Value:  34108.504
Standard Deviation of Terminal Portfolio Values:  17164.7132
Mean number of total trades executed:  2754.656
Standard Deviation of total trades executed:  190.3519
Mean total trade cost:  19255.0454
Standard Deviation of total trade costs:  1330.5597
Duration of each simulation (in years):  10.0
Upper rebalance threshold:  1.02
Lower rebalance threshold:  0.98

Portfolio mean values are likely drawn from different distributions (reject H0)
P-Value:  1.809933060798677e-153
T-Statistic:  28.86919221692366


Analysis

Here we can see that for a high volatility portfolio with a very tight rebalancing threshold the robo-advisor dramatically outperforms the self-directed portfolio!

Summary & Conclusions

  • Most robo-advisors offer the added value of having little (or zero) trading costs, and the ability to purchase fractional shares (“the benefits”).
  • Under the conditions established in this experiment, we can infer the following conclusions:
    • All else being equal, the benefits of robo-advisors are most beneficial to those with smaller portfolios.
    • For starting portfolios of 25,000, the benefits of fractional shares and zero trading costs were not statistically significant on portfolio performance.
    • In all instances, when portfolio volatility exceeds the portfolio rebalancing threshold robo-advisors can deliver statistically significant performance compared to a self-directed portfolio that incurs trading costs and can only purchase whole units.
    • When expected portfolio volatility is less than the rebalancing threshold, the benefits of robo-advisors in terms of trading costs and fractional share purchases are not statistically significant for large starting portfolios.
  • From this, we can infer that those with small portfolios and a high risk tolerance can benefit the most from the benefits offered by roboadvisors.
  • Those with large portfolios and a low risk tolerance would likely benefit less from the explicit benefits of robo-advisors studied here.
  • That being said, the robo-advisor model excels at delivering market returns as cheaply and efficiently as possible.
  • In that regard, it’s likely that anybody can benefit by switching to a robo-advisor provided they are seeking market returns and the fees of the robo-advisor are less than their current fee structure.

I hope you enjoyed this post!

Kevin Vecmanis