Análisis financiero general en Python (Parte 3)

Después de todos los cálculos presentados en esta y esta publicación, podemos profundizar en el análisis estadístico y considerar el método de mínimos cuadrados. Para este propósito, se utiliza la biblioteca statsmodels, que permite a los usuarios examinar datos, evaluar modelos estadísticos y realizar pruebas estadísticas. Este artículo y este artículo fueron tomados como base . La descripción de la función utilizada en inglés está disponible en el siguiente enlace .

Primero, una pequeña teoría:

Sobre regresión lineal


La regresión lineal se utiliza como modelo predictivo cuando se supone una relación lineal entre la variable dependiente (la variable que estamos tratando de predecir) y la variable independiente (la variable y / o las variables utilizadas para la predicción).

En el caso más simple, cuando se considera, se usa una variable en base a la cual estamos tratando de predecir otra. La fórmula en este caso es la siguiente:

Y = C + M * X

  • Y = variable dependiente (resultado / pronóstico / estimación)
  • C = constante (intersección en Y)
  • M = Pendiente de la línea de regresión (pendiente o gradiente de la línea estimada; es la cantidad en la que Y aumenta en promedio si aumentamos X en una unidad)
  • X = variable independiente (predictor utilizado en el pronóstico Y)

De hecho, también puede haber una relación entre la variable dependiente y varias variables independientes. Para estos tipos de modelos (suponiendo linealidad), podemos usar la regresión lineal múltiple de la siguiente forma:

Y = C + M1X1 + M2X2 + ...

Ratio beta


Ya se ha escrito mucho sobre este coeficiente, por ejemplo, en esta página.

Brevemente, si no entra en detalles, puede caracterizarlo de la siguiente manera:

Acciones con un coeficiente beta:

  • cero indica que no hay correlación entre stock e índice
  • la unidad indica que la acción tiene la misma volatilidad que el índice
  • más de uno: indica una mayor rentabilidad (y, por lo tanto, riesgos) de las acciones que el índice
  • menos de uno - stock menos volátil que el índice

En otras palabras, si la acción crece un 14%, mientras que el mercado creció solo un 10%, entonces el coeficiente beta de la acción será 1.4. Por lo general, los mercados con una beta más alta pueden ofrecer mejores condiciones para la recompensa (y por lo tanto, el riesgo).

imagen

Práctica


El siguiente código de Python incluye un ejemplo de regresión lineal, donde la variable de entrada es el rendimiento en el Índice de Intercambio de Moscú, y la variable estimada es el rendimiento en las acciones de Aeroflot.

Para evitar la necesidad de recordar cómo descargar datos y llevarlos a la forma necesaria para el cálculo, el código se proporciona desde el momento en que se descargan los datos y hasta que se obtienen los resultados. Aquí está la sintaxis completa para hacer regresión lineal en Python usando statsmodels:

# 
import pandas as pd
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

# 
ticker = ['AFLT.ME','IMOEX.ME']
stock = yf.download(ticker)

#    
all_adj_close = stock[['Adj Close']]

#   
all_returns = np.log(all_adj_close / all_adj_close.shift(1))

#      
aflt_returns = all_returns['Adj Close'][['AFLT.ME']].fillna(0)

#      
moex_returns = all_returns['Adj Close'][['IMOEX.ME']].fillna(0)


#   DataFrame

return_data = pd.concat([aflt_returns, moex_returns], axis=1)[1:]
return_data.columns = ['AFLT.ME', 'IMOEX.ME']


#      X  y
X = sm.add_constant(return_data['IMOEX.ME'])
y = return_data['AFLT.ME']


#  
model_moex = sm.OLS(y,X).fit()

#  
print(model_moex.summary())

imagen

En el sitio web de Yahoo y el coeficiente beta de Mosbirzhi difiere ligeramente hacia arriba. Pero debo admitir honestamente que el cálculo de algunas otras acciones de la bolsa de valores rusa mostró diferencias más significativas, pero dentro del intervalo.

imagen

El mismo análisis para las acciones de FB y el índice SP500. Aquí, el cálculo, como en el original, se realiza a través del rendimiento mensual.

sp_500 = yf.download('^GSPC')
fb = yf.download('FB')

#    
fb = fb.resample('BM').apply(lambda x: x[-1])
sp_500 = sp_500.resample('BM').apply(lambda x: x[-1])

monthly_prices = pd.concat([fb['Close'], sp_500['Close']], axis=1)
monthly_prices.columns = ['FB', '^GSPC']

monthly_returns = monthly_prices.pct_change(1)
clean_monthly_returns = monthly_returns.dropna(axis=0)  

X = clean_monthly_returns['^GSPC']
y = clean_monthly_returns['FB']

X1 = sm.add_constant(X)

model_fb_sp_500 = sm.OLS(y, X1)

results_fb_sp_500 = model_fb_sp_500.fit()
print(results_fb_sp_500.summary())

imagen

imagen

En este caso, todo coincidió y confirmó la posibilidad de usar statsmodels para determinar el coeficiente beta.

Bueno, y como beneficio adicional, si desea obtener solo beta, desea dejar a un lado el coeficiente y el resto de las estadísticas, se propone otro código para calcularlo:

from scipy import stats
slope, intercept, r_value, p_value, std_err = stats.linregress(X, y)

print(slope)

1.0568997978702754

Es cierto que esto no significa que todos los demás valores obtenidos deben ser ignorados, pero se necesitará el conocimiento de las estadísticas para comprenderlos. Daré un pequeño extracto de los valores obtenidos:

  • R cuadrado, que es el coeficiente de determinación y toma valores de 0 a 1. Cuanto más cercano sea el valor del coeficiente a 1, mayor será la dependencia;
  • Adj. R cuadrado - ajustado R cuadrado basado en el número de observaciones y el número de grados de libertad;
  • std err: error estándar de estimación del coeficiente;
  • P> | t | - valor p Un valor inferior a 0,05 se considera estadísticamente significativo;
  • 0.025 y 0.975 son los valores inferior y superior del intervalo de confianza.
  • etc.

Eso es todo por ahora. Por supuesto, es interesante buscar una relación entre diferentes valores para predecir el otro a través de uno y obtener una ganancia. En una de las fuentes extranjeras, el índice se predijo a través de la tasa de interés y la tasa de desempleo. Pero si el cambio en la tasa de interés en Rusia puede tomarse del sitio web del Banco Central, entonces continuaré buscando otros. Desafortunadamente, el sitio web de Rosstat no pudo encontrar los relevantes. Esta es la publicación final en los artículos del análisis financiero general.

All Articles