Explicar um retorno com outro
Uma ação raramente se move sozinha: quando o mercado sobe, ela costuma subir também. A regressão linear quantifica esse vínculo ajustando uma reta y = alpha + beta * x pelos pares de retornos (x: o mercado, y: a ação). Os mínimos quadrados ordinários (MQO) escolhem a reta que deixa a soma dos quadrados das distâncias verticais, os resíduos, a menor possível. O resultado tem forma fechada: a inclinação beta é a covariância de x e y dividida pela variância de x, e o intercepto alpha faz a reta passar pelo ponto das médias.
import numpy as np
market = np.array([0.010, -0.005, 0.004, 0.012, -0.008, 0.003, -0.002, 0.007, 0.001, -0.004])
asset = np.array([0.013, -0.004, 0.007, 0.016, -0.011, 0.004, -0.001, 0.011, 0.002, -0.007])
dx = market - market.mean() # deviations of x from its mean
beta = (dx * (asset - asset.mean())).sum() / (dx ** 2).sum()
alpha = asset.mean() - beta * market.mean()
print(round(beta, 4), round(alpha, 5)) # 1.3271 0.00061 the asset moves 1.33 times as much as the marketResíduos e R ao quadrado
Um resíduo é o que a reta não explica em uma observação: y - (alpha + beta * x). Os resíduos do MQO sempre somam zero e são não correlacionados com x, uma verificação útil do seu código. O R ao quadrado diz que parte da variação de y a reta explica: 1 - sum(resíduos²) / sum((y - mean_y)²). Vai de 0 (a reta não é melhor que a média) a 1 (todos os pontos estão na reta) e, numa regressão simples, é igual ao quadrado da correlação entre x e y.
residuals = asset - (alpha + beta * market)
print(abs(residuals.sum()) < 1e-12, abs((residuals * market).sum()) < 1e-12) # True True the OLS fingerprints
ss_res = (residuals ** 2).sum()
ss_tot = ((asset - asset.mean()) ** 2).sum()
print(round(1 - ss_res / ss_tot, 4)) # 0.9785
print(round(np.corrcoef(market, asset)[0, 1] ** 2, 4)) # 0.9785 the squared correlationCAPM: beta e alfa
Em finanças a regressão tem nome. O beta é a sensibilidade ao mercado: um beta de 1,3 significa que a ação tende a se mover 30% mais que o mercado, para cima ou para baixo. O alfa é o retorno médio que sobra depois de descontar essa exposição ao mercado, e é o que um gestor reivindica como habilidade. Para deixar de fora a taxa livre de risco, a regressão do CAPM usa retornos excedentes: o retorno menos a taxa livre de risco, tanto do ativo quanto do mercado. Uma estratégia com alfa perto de zero é só exposição ao mercado disfarçada.
risk_free = 0.0001 # risk-free return of one day
x = market - risk_free # excess returns of the market
y = asset - risk_free # excess returns of the asset
beta = ((x - x.mean()) * (y - y.mean())).sum() / ((x - x.mean()) ** 2).sum()
alpha = y.mean() - beta * x.mean()
print(round(beta, 4), round(alpha, 6)) # 1.3271 0.000644 a daily alpha of 0.064%, on 10 days of data# Points exactly on y = 1 + 2x: the fit recovers the line
x = np.array([1.0, 2.0, 3.0, 4.0])
y = 1 + 2 * x
dx = x - x.mean()
slope = (dx * (y - y.mean())).sum() / (dx ** 2).sum()
print(y.mean() - slope * x.mean(), slope) # 1.0 2.0- O MQO minimiza os resíduos ao quadrado:
beta = cov(x, y) / var(x)(somas de produtos centrados) ealpha = mean_y - beta * mean_x. - Os resíduos
y - (alpha + beta * x)somam zero; o R ao quadrado1 - ss_res / ss_toté a parcela da variância explicada. - CAPM: regrida os retornos excedentes do ativo sobre os do mercado; o beta é a exposição ao mercado, o alfa o que sobra.
A seguir: a volatilidade, para medir e prever o quanto os retornos flutuam.
Lab: o que é avaliado
- Ajustar a reta pelos pontos com
ols_fit25 pts - Medir o que a reta não capta com
residuals25 pts - Avaliar o ajuste com
r_squared25 pts - Separar um ativo em exposição ao mercado e habilidade com
capm_alpha_beta25 pts