The Rise of the Robots (Advisors…)

The Asset Management industry is on the verge of a major change. Over the last couple of years Robots Advisors (RA) have emerged as new players. The term itself is hard to define as it encompasses a large variety of services. Some are designed to help traditional advisers to better allocate their clients money and some are real “black box”. The user enter a few criteria (age , income, children etc…) and the robot proposes a tailor-made allocation. Between those two extremes a full range of offers is available. I found the Wikipedia definition pretty good. “They are a class of financial adviser that provides  portfolio management online with minimal human intervention”. More precisely they use algorithm-based portfolio management to offer the full spectrum of services a traditional adviser would offer: dividend reinvesting, compliance reports, portfolio rebalancing, tax loss harvesting etc… (well this is what the quantitative investment community is doing for decades!). The industry is still in its infancy with most players still managing a small amount of money but I only realised how profound the change was when I was in NYC a few days ago. When RA get their names on TV adds or on the roof of NYC cab you know something big is happening…

IMG_0861

it is getting more and more attention from the media and above all it makes a lot of sense from an investor perspective. There are actually two main advantages in using RA:

  • Significantly lower fees over traditional advisers
  • Investment is made more transparent and simpler which is more appealing to people with limited financial knowledge

In this post R is just an excuse to present nicely what is a major trend in the asset management industry. The chart below shows the market shares of most popular RA as of the end of 2014. The code used to generate the chart below can be found at the end of this post and the data is here.

robots

Those figures are a bit dated given how fast this industry evolves but are still very informative. Not surprisingly the market is dominated by US providers like Wealthfront and Betterment but RA do emerge all over the world: Asia (8Now!), Switzerland (InvestGlass), France (Marie Quantier)….. It is starting to significantly affect the way traditional asset managers are doing business. A prominent example is the partnership between Fidelity and Betterment. Since December 2014 Betterment past the $2 billion AUM mark.

Despite all the above, I think the real change is ahead of us. Because they use less intermediaries and low commission products (like ETFs) they charge much lower fees than traditional advisers. RA will certainly gain significant market shares but they will also lowers fees charged by the industry as a whole. Ultimately it will affect the way traditional investment firms do business. Active portfolio management which is having a tough time for some years now will suffer even more. The high fees it charges will be even harder to justify unless it reinvents itself. Another potential impact is the rise of ETFs and low commission financial products in general. Obviously this has started a while ago but I do think the effect will be even more pronounced in the coming years. New generations of ETFs track more complex indices and custom made strategies. This trend will get stronger inevitably.

As usual any comments welcome

#######################################################
# The Rise of the Robots (Advisors...)
#
# thertrader@gmail.com - August 2015
#######################################################
library(ggplot2)
library(stringr)
library(XML)

#######################################################
# STEP 1: Data gathering
#######################################################
tables <- readHTMLTable("http://investorhome.com/robos.htm")
a <- as.data.frame(tables)
b <- a[,c(1:3)]
colnames(b) <- c("company","aum","type")
c <- b[which(b[,"type"] == "Roboadvisor"),]
d <- b[which(b[,"type"] == "RoboAdvisor"),]
e <- rbind(c,d)
f <- as.numeric(str_replace_all(e[,2], "[[:punct:]]",""))
g <- cbind(e[,c("company","type")],f)
colnames(g) <- c("company","type","aum")

#######################################################
# STEP 2: Chart
#######################################################
globalAum <- 19000000000
h <- cbind(g,g[,"aum"]/globalAum)
colnames(h) <- c("company","type","aum","marketShare")
i <- cbind("Others","Roboadvisor",globalAum-sum(h[,"aum"]),1-sum(h[,"aum"]/globalAum))
colnames(i) <- c("company","type","aum","marketShare")
j <- rbind(h,i)
k <- j[order(j[,"marketShare"],decreasing =TRUE),]
k[,"marketShare"] <- round(100*as.numeric(k[,"marketShare"]),1)

# Bar plot with ggplot2
ggplot(data=k, aes(x=company, y=marketShare, fill=company)) +
 geom_bar(stat="identity") +
 theme(axis.ticks = element_blank(), axis.text.y = element_blank(), text = element_text(size = 20)) +
 coord_flip() +
 labs(title = "Robots Advisors \n Market Shares as of end 2014") +
 ylab("Market Share (%)") +
 xlab(" ") +
 scale_fill_brewer(palette="Spectral")

8 Comments

  1. Great post and thanks for sharing the code – bookmarked and shared!

  2. panos says:

    hi,
    great article
    clould you please explain why you created c and d with the same code?
    c <- b[which(b[,"type"] == "Roboadvisor"),]
    d <- b[which(b[,"type"] == "RoboAdvisor"),]

    keep up the good work

  3. vonjd says:

    It doesn’t show the chart.

    I get the following messages:

    > f <- as.numeric(str_replace_all(e[,2], "[[:punct:]]",""))
    Warning message:
    NAs introduced by coercion

    and after the ggplot-command:

    Error in matrix(value, n, p) :
    'data' must be of a vector type, was 'NULL'
    In addition: Warning messages:
    1: Removed 11 rows containing missing values (position_stack).
    2: In min(x) : no non-missing arguments to min; returning Inf
    3: In max(x) : no non-missing arguments to max; returning -Inf
    4: position_stack requires constant width: output may be incorrect

    Thank you for having a look

  4. vonjd says:

    …the problem seems to be that I am working with a German country configuration, so that the $’s are not eliminated. The following helps:

    f <- str_replace_all(e[,2], "[[:punct:]]","")
    f.1 <- as.numeric(str_replace_all(f, "[$]",""))
    g <- cbind(e[,c("company","type")],f.1)

  5. Abdo says:

    Hi Bill,Thanks for reaching out on our blog. We hope you find this iaoormntifn useful. The fee an advisor charges is separate from the mutual fund fees. The mutual fund fees, operating expense ratios (O.E.R.) go directly to the mutual fund. Evaluating these fees is an important task for an investment manager.

Leave a Reply