See part I for instructions on required packages and datasets: /campus/ibkr-quant-news/tech-dividends-part-i/. The below is the full call:
nasdaq %>%
clean_names() %>%
mutate(market_cap =
if_else(str_detect(market_cap, "M|B", negate = TRUE),
str_remove_all(market_cap, "\\$") %>% as.numeric() %>% `/`(1000),
if_else(str_detect(market_cap, "B"),
str_remove_all(market_cap, "\\$|B") %>% as.numeric() %>% `*`(1000),
str_remove_all(market_cap, "\\$|M") %>% as.numeric()))) %>%
arrange(desc(market_cap))
# A tibble: 3,547 x 7
symbol company last_sale_price market_cap ipo_year sector industry
<chr> <chr> <dbl> <dbl> <dbl> <chr> <chr>
1 MSFT Microsof… 133. 1018490 1986 Techno… Computer S…
2 AAPL Apple In… 203. 915770 1980 Techno… Computer M…
3 AMZN Amazon.c… 1750. 865460 1997 Consum… Catalog/Sp…
4 GOOGL Alphabet… 1154. 799890 NA Techno… Computer S…
5 GOOG Alphabet… 1151. 798300 2004 Techno… Computer S…
6 FB Facebook… 178. 507110 2012 Techno… Computer S…
7 CSCO Cisco Sy… 46.6 199520 1990 Techno… Computer C…
8 INTC Intel Co… 45.0 199170 NA Techno… Semiconduc…
9 CMCSA Comcast … 42.4 192840 NA Consum… Television…
10 PEP Pepsico,… 130. 182140 NA Consum… Beverages …
# … with 3,537 more rows
That finally looks how we were expecting, the top five by market cap are MSFT
, AMZN
, GOOG
, FB
and CSCO
. Let’s save that as an object called nasdaq_wrangled
.
nasdaq_wrangled <-
nasdaq %>%
clean_names() %>%
mutate(market_cap =
if_else(str_detect(market_cap, "M|B", negate = TRUE),
str_remove_all(market_cap, "\\$") %>% as.numeric() %>% `/`(1000),
if_else(str_detect(market_cap, "B"),
str_remove_all(market_cap, "\\$|B") %>% as.numeric() %>% `*`(1000),
str_remove_all(market_cap, "\\$|M") %>% as.numeric()))) %>%
arrange(desc(market_cap))
Now let’s dig in to the dividends paid by these NASDAQ-listed companies that have IPO’d in the last ten years. It’s a bit anticlimactic because most haven’t paid any dividends but here we go. First, let’s pull just the tickers for companies that IPO’d after 2007, by setting filter(ipo_year > 2007)
.
nasdaq_tickers <-
nasdaq_wrangled %>%
filter(ipo_year > 2007) %>%
pull(symbol)
nasdaq_tickers %>%
head()
[1] "FB" "AVGO" "JD" "TSLA" "PDD" "TEAM"
We will import the dividend data using tq_get(source = 'dividends')
, which is a wrapper for quantmod::getDividends()
and sources dividend data from Yahoo! Finance.
We are passing 1120 symbols to this function but only those that pay a dividend will come back to us. It takes a while to run this because we still have to check on all 1120.
nasdaq_dividends <-
nasdaq_tickers %>%
tq_get(get = 'dividends') %>%
select(-value)
After a huge data import task like that, I like to use slice(1)
to grab the first observation from each group, which in this case will be each symbol
. We can count the number symbols for which we have a dividend and it’s 130.
nasdaq_dividends %>%
group_by(symbol) %>%
slice(1) %>%
glimpse()
Observations: 128
Variables: 3
Groups: symbol [128]
$ symbol <chr> "AGNC", "AMAL", "ATAI", "AVGO", "AY", "BKEP", "BLMN", …
$ date <date> 2009-03-31, 2018-11-15, 2011-06-28, 2010-12-13, 2014-…
$ dividends <dbl> 0.850, 0.060, 0.430, 0.070, 0.037, 0.110, 0.060, 0.003…
We could also get a sense for how these first dividend payments cluster into years by using count(year)
. Note we need to ungroup()
first.
nasdaq_dividends %>%
group_by(symbol) %>%
slice(1) %>%
mutate(year = year(date)) %>%
ungroup() %>%
count(year)
# A tibble: 11 x 2
year n
<dbl> <int>
1 2009 3
2 2010 8
3 2011 6
4 2012 8
5 2013 14
6 2014 12
7 2015 14
8 2016 12
9 2017 11
10 2018 28
11 2019 12
And a chart will help to communicate these yearly frequencies.
nasdaq_dividends %>%
group_by(symbol) %>%
slice(1) %>%
mutate(year = year(date)) %>%
ungroup() %>%
count(year) %>%
ggplot(aes(year, n)) +
geom_col(fill = "cornflowerblue", width = .5) +
scale_x_continuous(breaks = 2008:2019) +
scale_y_continuous(breaks = scales::pretty_breaks(n = 15)) +
labs(y = "number of first dividends by year", x = "")
Stay tuned for the next installment in which Jonathan will create a quick chart of the last dividend paid by each of these 130 companies, using slice(n())
and will plot a dot with geom_point()
.
Any stock, options or futures symbols displayed are for illustrative purposes only and are not intended to portray recommendations.
Disclosure: Interactive Brokers
Information posted on IBKR Campus that is provided by third-parties does NOT constitute a recommendation that you should contract for the services of that third party. Third-party participants who contribute to IBKR Campus are independent of Interactive Brokers and Interactive Brokers does not make any representations or warranties concerning the services offered, their past or future performance, or the accuracy of the information provided by the third party. Past performance is no guarantee of future results.
This material is from Reproducible Finance and is being posted with its permission. The views expressed in this material are solely those of the author and/or Reproducible Finance and Interactive Brokers is not endorsing or recommending any investment or trading discussed in the material. This material is not and should not be construed as an offer to buy or sell any security. It should not be construed as research or investment advice or a recommendation to buy, sell or hold any security or commodity. This material does not and is not intended to take into account the particular financial conditions, investment objectives or requirements of individual customers. Before acting on this material, you should consider whether it is suitable for your particular circumstances and, as necessary, seek professional advice.
Join The Conversation
If you have a general question, it may already be covered in our FAQs. If you have an account-specific question or concern, please reach out to Client Services.