--- title: "Template for 'FFJR'" author: Your name format: html bibliography: book.bib --- The bibliography file is available from the [templates repository](https://github.com/iangow/far_templates/blob/main/README.md). Book-derived setup is included for execution; the supplied replication figures are displayed below. ```{r} #| include: false library(DBI) library(dplyr, warn.conflicts = FALSE) library(dbplyr) # window_order(), window_frame() library(tidyr) # nest(), unnest() library(purrr) # map(), map2() library(ggplot2) library(farr) library(lubridate) library(stringr) ``` ## Stock splits ### Discussion question Consider the following alternative theories. - **Theory A**: Firms like to keep their stock price within certain bounds. When the stock price rises above a certain threshold, a firm may initiate a split, announcing it several weeks in advance of its effective date. Firms do not use splits to signal private information about firm prospects. - **Theory B**: Firms use splits to signal private information about firm prospects. A firm will announce a split several weeks in advance of its effective date. - **Theory C**: Capital market participants don't fully adjust for the effect of splits, tending to anchor on the pre-split price to some degree. Firms do not use splits to signal private information about firm prospects. Produce a set of indicative plots (e.g., drawn by hand) for the predicted behaviour of cumulative abnormal returns for assuming that the split is announced in month $-2$. What impact would variation in the announcement dates relative to the split effective date have on the plots? ## Dividend policy ### Discussion questions 1. Does the research design of FFJR include the use of a control group? If so, how? What alternative methods could have been used to introduce a control group? 2. @Fama:1969wc [p. 9] state "the most important empirical results of this study are summarized in Tables 2 and 3 and Figures 2 and 3." What does Table 3 of FFJR tell us? (*Hint*: Read p. 11.) Do you find the presentation of Table 3 to be effective? 3. Consider Table 2 of FFJR. Is it more or less important than Table 3? What is the relationship between Table 2 and Figures 2 and 3? 4. What statistical tests are used to test the hypotheses of the paper? ## Replication of FFJR ```{r} #| include: false db <- dbConnect(RPostgres::Postgres(), bigint = "integer") msf <- tbl(db, Id(schema = "crsp", table = "msf")) msi <- tbl(db, Id(schema = "crsp", table = "msi")) stocknames <- tbl(db, Id(schema = "crsp", table = "stocknames")) dsedist <- tbl(db, Id(schema = "crsp", table = "dsedist")) ``` ```{r} #| include: false splits <- dsedist |> filter(between(exdt, "1927-01-01", "1959-12-31"), distcd %in% c(5523L, 5533L), facshr >= 0.25) |> group_by(permno, exdt) |> summarize(facshr = sum(facshr, na.rm = TRUE), .groups = "drop") |> mutate(split = TRUE) ``` ```{r} #| include: false nyse_stocks <- stocknames |> filter(exchcd == 1, str_sub(as.character(shrcd), 1L, 1L) == "1") |> select(permno, namedt, nameenddt) ``` ```{r} #| include: false nyse_splits_raw <- splits |> inner_join(nyse_stocks, join_by(permno, between(exdt, namedt, nameenddt))) ``` ```{r} #| include: false #| label: month_indexes #| cache: true #| cache.vars: month_indexes month_indexes <- msi |> mutate(month = as.Date(floor_date(date, 'month'))) |> window_order(month) |> mutate(month_index = row_number()) |> select(date, month, month_index) |> collect() ``` ```{r} #| include: false #| label: nyse_splits #| cache: true #| cache.vars: nyse_splits nyse_splits <- nyse_splits_raw |> mutate(month = as.Date(floor_date(exdt, 'month'))) |> collect() |> inner_join(month_indexes, by = "month") |> rename(ex_month_index = month_index) |> select(-namedt, -nameenddt, -date) ``` ```{r} #| include: false #| label: nyse_msf #| cache: true #| cache.vars: nyse_msf nyse_msf <- msf |> filter(!is.na(ret)) |> inner_join(nyse_stocks, join_by(permno, between(date, namedt, nameenddt))) |> collect() |> inner_join(month_indexes, by = "date") |> select(permno, month_index, date, ret) ``` ```{r} #| include: false split_return_data <- nyse_splits |> left_join(nyse_msf, by = "permno", relationship = "many-to-many") |> mutate(month_rel_ex = month_index - ex_month_index) |> select(permno, exdt, month_rel_ex, date, ret) ``` ```{r} #| include: false split_return_data |> count(permno, exdt, month_rel_ex) |> count(n_rows = n) ``` ```{r} #| include: false split_sample <- split_return_data |> filter(between(month_rel_ex, -12, 12)) |> group_by(permno, exdt) |> summarize(n_obs = n(), .groups = "drop") |> filter(n_obs == 25L) |> select(permno, exdt) split_returns <- split_return_data |> semi_join(split_sample, by = c("permno", "exdt")) ``` ```{r} #| include: false split_sample |> distinct(permno) |> count() |> pull() split_sample |> count() |> pull() ``` ```{r} #| include: false index_returns <- msi |> select(date, vwretd, ewretd) |> collect() ``` ```{r} #| include: false omit_returns <- split_returns |> mutate(exclude = between(month_rel_ex, -15, 0)) |> group_by(permno, date) |> summarize(exclude = any(exclude), .groups = "drop") ``` ```{r} #| include: false split_returns_reg <- split_returns |> inner_join(omit_returns, by = c("permno", "date")) |> select(permno, date, ret, exclude) |> distinct() ``` ```{r} #| include: false abnormal_returns <- split_returns_reg |> left_join(index_returns, by = "date") |> mutate(lpr = log(1 + ret), lm = log(1 + vwretd)) |> select(permno, date, lpr, lm, exclude) |> nest(data = !permno) |> mutate(fit = map(data, \(x) lm(lpr ~ lm, data = x, subset = !exclude, na.action = "na.exclude"))) |> mutate(predicted = map2(fit, data, \(x, y) predict(x, newdata = y))) |> unnest(cols = c(predicted, data)) |> mutate(resid = lpr - predicted) |> select(permno, date, resid) ``` ```{r} #| include: false nyse_splits_join <- nyse_splits |> semi_join(split_sample, by = c("permno", "exdt")) |> mutate(start = ex_month_index - 30, end = ex_month_index + 30) ``` ```{r} #| include: false table2_data <- abnormal_returns |> inner_join(month_indexes, by = "date") |> inner_join(nyse_splits_join, join_by(permno, between(month_index, start, end))) |> mutate(month_gap = month_index - ex_month_index) |> select(permno, exdt, month_gap, resid) ``` ```{r} #| include: false table2_data |> count(permno, exdt, month_gap) |> count(n_rows = n) ``` ```{r} #| echo: false #| label: fig-baseline-all #| fig-height: 3 #| fig-cap: "Cumulative average residuals: all splits, value-weighted index" table2_data |> group_by(month_gap) |> summarize(all_u = mean(resid), .groups = "drop") |> arrange(month_gap) |> mutate(all_U = cumsum(all_u)) |> ggplot(aes(x = month_gap, y = all_U)) + geom_point() ``` ```{r} #| include: false div_months <- dsedist |> filter(str_sub(as.character(distcd), 1L, 1L) == "1") |> mutate(month = as.Date(floor_date(exdt, 'month'))) |> group_by(permno, month) |> summarize(divamt = sum(divamt, na.rm = TRUE), .groups = "drop") ``` ```{r} #| include: false nyse_divs_raw <- msf |> inner_join(nyse_stocks, by = "permno") |> filter(between(date, namedt, nameenddt)) |> mutate(month = as.Date(floor_date(date, 'month'))) |> select(permno, date, month, cfacshr) |> left_join(div_months, by = c("permno", "month")) |> mutate(divamt = coalesce(divamt / cfacshr, 0)) |> select(permno, month, divamt) ``` ```{r} #| include: false #| label: nyse_divs #| cache: true #| cache.vars: nyse_divs nyse_divs <- nyse_divs_raw |> group_by(permno) |> window_order(month) |> window_frame(from = -11, to = 0) |> mutate(div_trailing = sum(divamt, na.rm = TRUE), mths_trailing = n()) |> window_frame(from = 1, to = 12) |> mutate(div_forward = sum(divamt, na.rm = TRUE), mths_forward = n()) |> filter(mths_trailing == 12, mths_forward == 12) |> ungroup() |> select(permno, month, div_trailing, div_forward) |> collect() ``` ```{r} #| include: false split_firm_dividends <- nyse_splits |> left_join(nyse_divs, by = c("permno", "month")) |> mutate(div_ratio = if_else(div_trailing > 0, div_forward / div_trailing, NA)) |> filter(!is.na(div_ratio)) |> select(permno, month, exdt, div_ratio) ``` ```{r} #| include: false div_mkt <- nyse_divs |> group_by(month) |> summarize(div_trailing = mean(div_trailing, na.rm = TRUE), div_forward = mean(div_forward, na.rm = TRUE), .groups = "drop") |> mutate(mkt_div_ratio = if_else(div_trailing > 0, div_forward / div_trailing, NA)) ``` ```{r} #| include: false dividends_file <- split_firm_dividends |> inner_join(div_mkt, by = "month") |> select(permno, exdt, div_ratio, mkt_div_ratio) |> mutate(up_div = div_ratio >= mkt_div_ratio) ``` ```{r} #| include: false table2_w_divs <- table2_data |> left_join(dividends_file, by = c("permno", "exdt")) ``` ```{r} #| echo: false #| label: fig-baseline-up #| fig-height: 3 #| fig-cap: "Cumulative average residuals: dividend increases, value-weighted index" table2_w_divs |> filter(up_div) |> group_by(month_gap) |> summarize(u = mean(resid), .groups = "drop") |> arrange(month_gap) |> mutate(U = cumsum(u)) |> ggplot(aes(x = month_gap, y = U)) + geom_point() ``` ```{r} #| echo: false #| label: fig-baseline-down #| fig-height: 3 #| fig-cap: "Cumulative average residuals: dividend decreases, value-weighted index" table2_w_divs |> filter(!up_div) |> group_by(month_gap) |> summarize(u = mean(resid), .groups = "drop") |> arrange(month_gap) |> mutate(U = cumsum(u)) |> ggplot(aes(x = month_gap, y = U)) + geom_point() ``` ### Discussion questions and exercises 1. "In the past a large fraction of stock splits have been followed closely by dividend increases---and increases greater than those experienced at the same time by other securities in the market." What evidence to support this claim (if any) is provided by FFJR? Do we see evidence consistent with this in the data underlying our replication above? 2. Consider the three alternative theories below. Suggest tests that could distinguish which of these theories best explains observed phenomena. Which theory best aligns the theory proposed by FFJR? How would this theory need to be modified to comport better with the theory proposed by FFJR? - **Theory $A'$**: Firms like to keep their stock price within certain bounds. When the stock price rises above a certain threshold, a firm may initiate a split, announcing it several weeks in advance of its effective date. Firms do not use splits to signal private information about firm prospects. *Pre-split stock prices may be driven by information that suggests an imminent increase in dividends.* - **Theory $B'$**: Firms use splits to signal private information about firm prospects. A firm will announce a split several weeks in advance of its effective date. *Firms may also use dividend changes to signal private information about firm prospects.* - **Theory $B^{''}$**: *Firms use splits to signal private information about future dividend increases, which in turn signal private information about firm prospects.* A firm will announce a split several weeks in advance of its effective date. 3. On p. 17 of @Fama:1969wc, it is argued that "our data suggest that once the information effects of associated dividends are properly considered, a split *per se* has no net effect on common stock returns." Is it clear what meaning the words "per se" have in this sentence? Does FFJR provide persuasive evidence in support of this claim? Describe how you might test this claim using the richer data available today. What data would you use beyond that used in FFJR? 4. How do the figures produced above compare with their equivalents in FFJR? What might account for any differences? 5. In the analysis above we used `vwretd` as the market index. Modify the code above to instead use `ewretd`. Do you observe any changes in the resulting figures? Which do you believe is the better market index for these plots? Why? ```{r} #| include: false dbDisconnect(db) ```