Eine Zahl für das Marktrisiko
Die meisten Aktien steigen, wenn der Markt steigt, und fallen, wenn er fällt. Das Beta eines Assets misst, wie stark: Ein Beta von 1,5 heißt, dass einer Marktbewegung von 1 % im Schnitt 1,5 % beim Asset entsprechen. Es ist die Steigung der Asset-Renditen gegen die Marktrenditen, covariance(asset, market) / variance(market). Beta ist der Teil des Risikos, den man nicht wegdiversifizieren kann, weil jedes Asset im Markt ihn trägt.
import numpy as np
market = np.array([0.01, -0.02, 0.015, 0.005, -0.01, 0.02])
asset = 1.5 * market + np.array([0.002, -0.001, 0.003, 0.0, -0.002, 0.001]) # moves 1.5x the market, plus noise
market_dev = market - market.mean()
covariance = np.sum((asset - asset.mean()) * market_dev) / (len(market) - 1)
variance = np.sum(market_dev ** 2) / (len(market) - 1)
print(round(float(covariance / variance), 4)) # 1.5972: about 1.5, the noise moves it a little
print(round(float(np.polyfit(market, asset, 1)[0]), 4)) # the regression slope gives the same number# Beta does not care about a constant, and scales with the asset
import numpy as np
def beta(asset, market):
market_dev = market - market.mean()
return float(np.sum((asset - asset.mean()) * market_dev) / np.sum(market_dev ** 2))
rng = np.random.default_rng(4)
market = rng.normal(0, 0.01, size=100)
print(round(beta(2.5 * market, market), 4)) # 2.5 an asset that moves 2.5x the market
print(round(beta(market + 0.01, market), 4)) # 1.0 adding a constant changes nothing
print(round(beta(-market, market), 4)) # -1.0 a perfect hedgeDas Capital Asset Pricing Model
CAPM macht daraus einen Preis des Risikos. Anleger werden für das Tragen von Marktrisiko bezahlt und für nichts sonst; die erwartete Rendite eines Assets ist daher der risikolose Zins plus Beta mal die Marktrisikoprämie (Marktrendite minus risikoloser Zins): E[R] = rf + beta * (E[R_m] - rf). Ein Beta von 0 verdient den risikolosen Zins, ein Beta von 1 die Marktrendite, ein Beta von 2 den risikolosen Zins plus die doppelte Prämie.
def capm_expected_return(rf, beta_value, market_return):
return rf + beta_value * (market_return - rf)
rf, market_return = 0.01, 0.06
for b in (0.0, 0.5, 1.0, 1.5, 2.0):
print(b, round(capm_expected_return(rf, b, market_return), 4)) # 0.01, 0.035, 0.06, 0.085, 0.11Alpha: was übrig bleibt
Stimmt CAPM, verdient ein Asset genau die Rendite, die sein Beta rechtfertigt. Die Differenz zwischen Verdientem und CAPM-Erwartung ist das Jensen-Alpha: mean(asset) - (rf + beta * (mean(market) - rf)). Ein positives Alpha heißt, es war besser, als sein Marktrisiko erklärt; das verkaufen aktive Manager, und es ist am schwersten zu finden. Der Teil der Bewegung, den der Markt nicht erklärt, ist das Residualrisiko, gemessen an der Standardabweichung der Regressionsresiduen, das sich wegdiversifizieren lässt.
# Alpha and residual risk of an asset with a little skill in it
import numpy as np
rng = np.random.default_rng(2)
market = rng.normal(0.0004, 0.01, size=500)
asset = 0.0003 + 1.2 * market + rng.normal(0, 0.005, size=500) # true alpha 3 bps a day, beta 1.2, residual 0.5%
rf = 0.0001
market_dev = market - market.mean()
b = np.sum((asset - asset.mean()) * market_dev) / np.sum(market_dev ** 2)
alpha = asset.mean() - (rf + b * (market.mean() - rf))
a = asset.mean() - b * market.mean()
residual = asset - (a + b * market)
print(round(float(b), 3), round(float(alpha), 5), round(float(np.sqrt(np.sum(residual ** 2) / (len(asset) - 2))), 4))- Beta =
covariance(asset, market) / variance(market), die Steigung gegen den Markt; der nicht diversifizierbare Teil des Risikos. - CAPM:
rf + beta * (market - rf); Jensens Alpha ist die Durchschnittsrendite minus dies, das Können (oder Glück) jenseits des Marktrisikos. - Das Residualrisiko ist die Standardabweichung von
asset - (a + b * market)mitn - 2; es lässt sich diversifizieren; Beta selbst ist verrauscht.
Als Nächstes: Mehrfaktormodelle (Fama–French), Renditen mit mehr als dem Markt erklären.
Lab: Was bewertet wird
- Mit
betadie Marktsensitivität messen25 Pkt. - Mit
capm_expected_returndas Risiko bepreisen25 Pkt. - Mit
jensen_alphadas Können finden, falls vorhanden25 Pkt. - Mit
residual_voldas Restrisiko beziffern25 Pkt.