Stocks


Kevin Crotty
BUSI 448: Investments

Where are we?

Last time:

  • Returns of portfolios
  • Portfolio expected return
  • Portfolio standard deviation

Today:

  • Equity markets

Fundamental Asset Classes

  • Equity markets

  • Fixed income markets

Today, we’ll focus on some empirical facts about the stock market.

Some empirical facts for today

  • Over long horizons, average returns in the US stock market have exceeded those of bonds.
  • Stock returns are risky; that is, volatile.
  • Stock return distributions are fat-tailed and negatively skewed.
  • Past aggregate returns do not predict future aggregate returns.
  • Volatility is time-varying and persistent.

Stock Market Indices

  • S&P Indices
    • 500, Midcap 400, Smallcap 600
    • value-weighted index
  • Dow Jones
    • price-weighted index
  • Russell
    • 1000 + 2000 \(\rightarrow\) 3000
  • MSCI int’l indices
  • FTSE, DAX, Hang Seng, etc.

Annual Returns

Time-series

Distribution

Compounded return

value of $1 investment with dividends reinvested

Compounded returns on log scale: motivation

  • Let’s look at accumulations from two hypothetical stocks.
    • stock 1: 10% per year
    • stock 1: 2% per year until 2000 and 10% afterwards
  • It will appear that stock 2 did nothing before 2000 and earned a lot less than stock 1 even after 2000.

Plot of the Example

Log (base 10) of accumulation

Map \(y\) tick labels to dollars

Compounded market returns on log scale

value of $1 investment with dividends reinvested

Empirical record

dashboard: returns history

Does last year’s return predict this year’s?

  • How would we test this?
  • Autocorrelation is the correlation of a time series with its own lagged values.
  • Autocorrelation at lag 1 tells us whether the current value predicts the next one. \[ r_t = a + \rho \cdot r_{t-1} + \varepsilon_t \]
  • What should be true of \(\rho\)?

Does last year’s return predict this year’s?

Monthly Returns

Time-series

Distribution

Empirical vs. normal distribution

Does last month’s return predict this month’s?

Autocorrelations

  • For monthly data, autocorrelation might be high at lag 12 (seasonality).

Daily Returns

Daily market returns

Empirical vs. normal distribution

Normal distribution has same mean and std dev as actual.
x-axis range is minimum to maximum return.

Does today’s return predict tomorrow’s?

No, the autocorrelation is almost zero.

Autocorrelations of daily market returns

Volatility

Measuring volatility

  1. Monthly series of SD(daily returns)

  2. Daily series of absolute value of returns

Time-series of monthly volatility

Does last month’s SD(ret) predict this month’s?

Autocorrelations of monthly volatility

Time-series of daily absolute return

Does yesterday’s abs(ret) predict today’s?

Autocorrelations of daily absolute return

Long-Run Risks

Betting on the stock market

  • Based on history, the bet is definitely in our favor.

  • Play for a long time \(\Rightarrow\) almost certainly come out ahead.

  • But how far ahead is quite uncertain.

    • In worst 20-year period in U.S. stock market since 1926, $1 \(\rightarrow\) $1.73, a geometric average return of 2.8% per year (1929-1948).
    • In best 20-year period since 1926, $1 \(\rightarrow\) $24.65, a geometric average return of 17.4% per year (1980-1999).
  • dashboard: best/worst

Saving with risky returns

  • Let’s revisit our savings problem with uncertain returns
  • Mean and std dev of U.S. market return 1970-2021 was 12.5% and 17.4%.
  • Simulate 20-year compounded returns.
  • On average, what would $1 turn into?
  • What is the median amount $1 turns into?

Monte Carlo Analysis: simulate returns

from scipy.stats import norm
MEAN, SD = 0.125, 0.174
N_SAVING = 20
PMT, PV  = 0.0, 1.0

def endbal(mean, sd, n_saving, pmt):
    acct = pd.DataFrame(dtype=float,columns=['begbal','return','capgain','deposit','endbal'],index=np.arange(1,N_SAVING+1))
    acct.deposit = PMT
    acct['return'] = norm.rvs(loc=MEAN,scale=SD, size=N_SAVING)
    for t in acct.index:
        if t==1:
            acct.loc[t,'begbal'] = PV
        else:
            acct.loc[t,'begbal'] = acct.loc[t-1,'endbal']
        acct.loc[t,'capgain'] = acct.loc[t,'begbal']*acct.loc[t,'return']
        acct.loc[t,'endbal'] = acct.loc[t,'begbal'] + acct.loc[t,'capgain'] + acct.loc[t,'deposit']
    return acct.loc[N_SAVING,'endbal']

Monte Carlo Analysis: simulate returns

NSIMS    = 1000
df = pd.DataFrame(dtype=float,columns=['endbal'], index=np.arange(NSIMS))
for s in df.index:
    df.loc[s,'endbal']=endbal(MEAN,SD,N_SAVING,PMT)
df.describe()

# More pythonic code
data = [endbal(MEAN,SD,N_SAVING,PMT) for s in np.arange(NSIMS)]
df = pd.DataFrame(data, columns=['endbal'])

Distribution

Retirement Planning Simulation

Uncertainty about long-run returns \(\Rightarrow\) uncertainty about retirement plans.

For next time: Treasury Markets