Introduction

These study notes are based on Chapter 12 the Exam 9 syllabus reading Investments by Bodie, Kane, and Marcus. This chapter explains how behavioural finance can explain aspects of market inefficiency, and corresponds to learning objective A10 on the syllabus.

easypackages::packages("dplyr", "ggplot2", "DT", "data.table")
options(scipen = 999)

Sources of Stock Pricing Error

Behavioural finance is an approach to financial theory that considers how real people make decisions, and considers the impact of psychology on market behaviour. Core ideas of behavioural finance include:

Advantages of the approach include:

Disadvantages of the approach include:

Information Processing Errors

Examples of errors related to processing of information include:

  • Forecasting errors: people may give too much weight to recent experience when making forecasts, resulting in forecasts that are too extreme. This could explain the P/E effect: excessive forecasts have driven up stock prices, resulting in a high P/E ratio, and subsequent poor performance as the error is recognized.

  • Overconfidence: people tend to overestimate the precision of their forecasts. This can explain the prevalence of active portfolio management strategies despite their history of underperformance. Trading activity is generally predictive of poor investment performance, so tracking trading volume is a way of measuring this.

  • Conservatism: people may be too slow to update their views in response to new evidence. This could result in an initial under-reaction to news about a firm, resulting in the new information being reflected only gradually. This can give rise to the appearance of momentum in stock market returns.

  • Representativeness / Sample Size: people may not consider the size of a data sample, and may infer a pattern too quickly based on a small sample. This could lead to overreaction and correction anomalies, e.g. driving up the price of a stock that has had a small number of recent positive earnings reports, following by a drop in price as the error is recognized.

Behavioural Biases

The existence of behavioural biases mean that irrationality could exist in markets even if perfect information were available. Examples include:

  • Framing: the phrasing of a choice may influence the person’s decision. For example, individuals may be risk-averse when decisions are framed in terms of gains, but risk-seeking when decisions are framed in terms of losses.

    • Prospect theory modifies the traditional function of utility as a concave function of wealth to focus on changes in wealth, and extending it in a convex manner to negative changes. Individuals are risk-averse when gaining wealth, and risk-seeking when losing it. This explains market anomalies such as traders taking greater risks in the afternoon after a morning of losses.
  • Mental accounting: investors may mentally segregate different aspects of their portfolio rather than viewing it as a single overall portfolio. Examples include:

    • Investors are viewed as having different layers of assets, in which each layer is tied to particular goals and has a different level of risk aversion, such as a retirement account, education account, investment account, etc.

    • A preference for high-dividend stocks over another stock with an equivalent rate of return; they may feel free to spend dividend income but would not be willing to sell shares to realize gains.

    • Investors are more likely to sell stocks with gains than those with losses, counter to a tax-minimization strategy.

    • The “house money effect” in which individuals are more tolerant of risk when investing capital gains; in essence, they view new investments as being made from a “capital gains account” with a lower discount rate. This could explain momentum in stock markets, as these investors will drive up prices.

    • The disposition effect is the tendency of investors to hold on to losing investments in order to avoid realizing losses. This results in a demand for the stock depends on the price history of the shares, leading to a momentum effect.

  • Regret avoidance: when decisions turn out badly, individuals blame themselves more if the decision was unconventional. Avoidance of regret may explain book-to-market anomalies: these firms are out of favour and tend to be avoided, and require greater returns to overcome this. A similar argument explains the small firm effect, since investments in these firms is unconventional.

Technical analysis

Various types of technical analysis are used to detect irrational market behaviour. Some examples are provided below.

Moving Averages

Moving averages are used to detect trends and momentum effects in the market. For a given time interval, the moving average as of a given day is the average of all data points in the time interval prior to that day.

  • If prices have been falling, then the moving average will be above the current price.

  • If prices have been rising, then the moving average will be below the current price.

  • When the current price breaks through the moving average from below, this is taken as a positive sign: the trend has changed from falling to rising. Conversely, breaking through from above is a negative sign.

The approach can be illustrated using the following data provided by the textbook authors. T

SP.500.data = read.csv("./Data/BKM_12a.csv")
head(SP.500.data)
##   week SP_500_change fidelity_change
## 1    1          7.20            8.68
## 2    2         -1.37           -7.67
## 3    3          0.52           -8.41
## 4    4         -1.57            1.57
## 5    5          0.91           -3.27
## 6    6          1.67            7.67

he percentage change in the S&P 500 index from its previous value is given; use 100 as a starting baseline.

initial.SP.500 = 100
SP.500.data = SP.500.data %>% mutate(SP_500 = cumsum(SP_500_change) + initial.SP.500)
head(SP.500.data)
##   week SP_500_change fidelity_change SP_500
## 1    1          7.20            8.68 107.20
## 2    2         -1.37           -7.67 105.83
## 3    3          0.52           -8.41 106.35
## 4    4         -1.57            1.57 104.78
## 5    5          0.91           -3.27 105.69
## 6    6          1.67            7.67 107.36

To calculate a 26-week moving average, first calculate cumulative sums. Then, subtract each cumulative sum from its value 26 weeks prior, and divide by 26.

SP.500.data = SP.500.data %>% mutate(SP_500_cumulative = cumsum(SP_500), SP_500_MA = (SP_500_cumulative - lag(SP_500_cumulative, 26)) / 26)
SP.500.data[26:32,]
##    week SP_500_change fidelity_change SP_500 SP_500_cumulative SP_500_MA
## 26   26         -1.90           -1.45  98.10           2732.64        NA
## 27   27         -1.98            5.80  96.12           2828.76  104.6754
## 28   28          4.16            2.14 100.28           2929.04  104.4619
## 29   29         -4.21           -1.62  96.07           3025.11  104.0665
## 30   30         -0.47            7.75  95.60           3120.71  103.7135
## 31   31          1.10            0.54  96.70           3217.41  103.3677
## 32   32         -1.66            1.28  95.04           3312.45  102.8938

Visualize the results:

ggplot(data = SP.500.data, aes(x = week, y = SP_500)) + geom_line(colour = "blue") + geom_line(aes(y = SP_500_MA), colour = "red")
## Warning: Removed 26 rows containing missing values (geom_path).

Identify whether there is a rising or falling trend based on the moving average test, and identify the points at which there is a change in the trend:

SP.500.data = SP.500.data %>% mutate(trend_type = ifelse(SP_500_MA > SP_500, "Falling", "Rising"), trend_change = ifelse(trend_type == "Rising" & lag(trend_type ) == "Falling", "Positive", ifelse(trend_type == "Falling" & lag(trend_type) == "Rising", "Negative", "Neutral")))
SP.500.data %>% filter(trend_change != "Neutral")
##    week SP_500_change fidelity_change SP_500 SP_500_cumulative SP_500_MA
## 1    51          3.72            3.87  95.35           5050.49  92.92115
## 2    55         -4.00           -2.44  89.25           5420.16  92.11731
## 3    78          1.03            2.27  85.38           7335.74  84.26885
## 4    81         -3.04           -2.66  83.05           7589.31  83.42885
## 5    82          1.94            2.58  84.99           7674.30  83.23000
## 6    90         -2.32           -2.09  80.76           8349.98  82.06077
## 7    93          3.85            4.43  84.04           8595.70  81.97538
## 8    98         -2.15           -1.34  83.31           9024.02  83.84462
## 9   131          2.28            2.79  66.27          11240.34  63.57808
## 10  134         -2.49           -1.81  61.83          11433.38  62.30615
## 11  135          0.71            1.45  62.54          11495.92  61.98000
## 12  136         -2.27           -2.18  60.27          11556.19  61.56385
## 13  138          3.27            2.67  64.04          11681.00  61.16500
## 14  141         -4.48           -3.68  58.87          11869.35  61.82923
## 15  149          7.50            5.78  63.13          12326.34  60.44038
## 16  150         -3.60           -3.42  59.53          12385.87  60.77192
## 17  151          1.78            1.40  61.31          12447.18  61.00500
## 18  152         -1.20           -0.44  60.11          12507.29  60.96615
## 19  153          2.91            3.11  63.02          12570.31  60.98154
## 20  208         -2.92           -1.58  85.15          16931.47  85.52654
## 21  212          2.48            2.48  86.38          17270.22  86.28923
## 22  217         -0.80           -0.18  86.80          17706.59  86.93846
## 23  226          0.53            0.57  85.89          18463.26  85.58808
## 24  229         -1.63           -1.72  85.59          18722.88  85.70346
## 25  230          1.93            2.10  87.52          18810.40  85.67846
## 26  232         -1.24           -0.37  85.45          18982.54  85.54962
## 27  234          3.14            3.29  87.47          19154.34  85.49500
## 28  255         -1.53           -2.58  91.23          21103.38  91.55769
## 29  257          0.71            0.68  92.07          21286.81  91.91231
## 30  258         -3.27           -4.09  88.80          21375.61  92.04115
##    trend_type trend_change
## 1      Rising     Positive
## 2     Falling     Negative
## 3      Rising     Positive
## 4     Falling     Negative
## 5      Rising     Positive
## 6     Falling     Negative
## 7      Rising     Positive
## 8     Falling     Negative
## 9      Rising     Positive
## 10    Falling     Negative
## 11     Rising     Positive
## 12    Falling     Negative
## 13     Rising     Positive
## 14    Falling     Negative
## 15     Rising     Positive
## 16    Falling     Negative
## 17     Rising     Positive
## 18    Falling     Negative
## 19     Rising     Positive
## 20    Falling     Negative
## 21     Rising     Positive
## 22    Falling     Negative
## 23     Rising     Positive
## 24    Falling     Negative
## 25     Rising     Positive
## 26    Falling     Negative
## 27     Rising     Positive
## 28    Falling     Negative
## 29     Rising     Positive
## 30    Falling     Negative

Relative Strength

Relative strength is the ratio of the price of a security to a price index for its industry, or a broad market index.

  • If the ratio is rising, it means the security is outperforming its industry (or the market). If this is expected to persist, it is a signal to buy the security.

  • If the ratio is declining, it means the security is underperforming

The data provided above also have price changes for Fidelity’s Select Banking Fund. Calculate and visualize relative strength as follows:

initial.fidelity = 100
SP.500.data = SP.500.data %>% mutate(fidelity = cumsum(fidelity_change) + initial.fidelity, fidelity_relative_strength = fidelity / SP_500)
ggplot(data = SP.500.data, aes(x = week, y = fidelity_relative_strength)) + geom_line(colour = "blue") 

Although there is a broad long-term increasing trend followed by a decrease, in the short term there is considerable volatility an a lack of consistency in overperformance versus underperformance.

Breadth

Breadth is the difference between the number of stocks that advance in price and the number of stocks that decline in price. It is viewed as a measure of the extent to which a rally / decline is widespread. Breadth may be assessed on a cumulative basis, or on a moving average basis.

The example from the textbook can be replicated as follows:

breadth.data = data.frame(day = 1:5, advances = c(1302, 1417, 1203, 1012, 1133), declines = c(1248, 1140, 1272, 1622, 1504))
breadth.data = breadth.data %>% mutate(breadth = advances - declines, cumulative_breadth = cumsum(breadth))
breadth.data
##   day advances declines breadth cumulative_breadth
## 1   1     1302     1248      54                 54
## 2   2     1417     1140     277                331
## 3   3     1203     1272     -69                262
## 4   4     1012     1622    -610               -348
## 5   5     1133     1504    -371               -719

Trin Statistic

The trin statistic is the ratio of average trading volume of declining stocks to average trading volume of advancing stocks. It is a measure of the level of investor participation in a market advanced / retreat. Ratios above 1 are viewed as negative signals; ratios below 1 are viewed as positive. A caveat when interpreting this statistic is that every sale of stock must have a buyer, so a large trin statistic could simply indicate interest in buying declining stocks.

The example from the textbook can be replicated as follows:

trin.data = data.frame(index = c("NYSE", "NASDAQ", "Amex"), num_advancing = c(1455, 1176, 200), num_declining = c(1553, 1274, 202), volume_advancing = c(852581038, 521407205, 18651981), volume_declining = c(1058312638, 579005241, 27715823))
trin.data = trin.data %>% mutate(trin_statistic = (volume_declining / num_declining) / (volume_advancing / num_advancing), signal = ifelse(trin_statistic > 1, "Negative", "Positive"))
trin.data
##    index num_advancing num_declining volume_advancing volume_declining
## 1   NYSE          1455          1553        852581038       1058312638
## 2 NASDAQ          1176          1274        521407205        579005241
## 3   Amex           200           202         18651981         27715823
##   trin_statistic   signal
## 1       1.162974 Negative
## 2       1.025046 Negative
## 3       1.471233 Negative

Confidence Index

The confidence index is the ratio of the average yield on 10 top-rated corporate bonds to 10 intermediate-grade corporate bonds. The ratio will always be below 1 because top-rated bonds have lower yields; values closer to 1 are viewed as a sign of optimism because investors are demanding lower premiums on lower-grade bonds.

Put / Call Ratio

The put/call ratio is the ratio of the number of outstanding put options to the number of outstanding call options. There are contradictory interpretations of this metric:

  • Put options tend to do well in falling markets because they provide a hedge against decreases in stock prices, and call options tend to do well in rising markets. Therefore, deviations of this ratio from historical averages could be viewed favourably (decrease) or unfavourably (increase).

  • Alternatively, an increase in the Put / Call ratio could be viewed as a sign that stock prices are depressed and it is a good time to buy.

Limits to Arbitrage

There are several practical barriers to arbitrage that suggest that arbitrageurs may not be able to perfectly enforce equilibrium prices:

Case Studies

Some examples illustrate situations in which the Law of One Price has been violated:

  • Royal Dutch Petroleum and Shell Transport merged into one firm, but continued to trade separately with profits split on a 60/40 basis. Theoretically, this means that the price of Royal Dutch should always be exactly 1.5 times the price of Shell, but the relative price of the two stocks has historically deviated from this ratio for extended periods of time. Executing arbitrage on this opportunity generally has not been successful due to the presence of fundamental risk.

  • Equity Carve-Outs: 3Com spun off its Palm division in an initial IPO of 5% of its stake, with the remaining 95% to be distributed to 3Com shareholders in 6 months time. Each 3Com shareholder would receive 1.5 shares of Palm, so theoretically a 3Com share should cost at least as much as 1.5 Palm shares. (The gap between the 3Com price and 1.5 times the Palm price is the stub value, and it should not be negative.) However, at the IPO, Palm shares sold for more than 3Com shares. The barrier to arbitrage here was the inability to sell Palm short, because all available shares of Palm were already borrowed and sold short.

  • Closed-end Mutual Funds often sell at substantial discounts or premiums to their net asset value. This premium / discount is given by the formula \[ \frac{\mathrm{Price} - \mathrm{NAV}}{\mathrm{NAV}} = \frac{\alpha - \epsilon}{\delta + \epsilon - \alpha} \] where \(\epsilon\) is the expense ratio and \(\delta\) is the dividend yield. This will be positive if the benefits provided by the mutual fund manager, \(\alpha\), outweigh the expenses, which explains why investors would be willing to purchase these funds at a premium.