Skip to content

Instantly share code, notes, and snippets.

@Moccazio
Last active May 23, 2021 18:55
Show Gist options
  • Save Moccazio/83d119386a5f8bbf1d310007d736df5f to your computer and use it in GitHub Desktop.
Save Moccazio/83d119386a5f8bbf1d310007d736df5f to your computer and use it in GitHub Desktop.
import pandas as pd
import numpy as np
import scipy as sp
import statsmodels.formula.api as sm
from statsmodels.iolib.summary2 import summary_col
import datetime as dt
from datetime import datetime
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['figure.figsize'] = (16.0, 8.0)
class Stock:
def __init__(self, ticker, start=None, end=None):
self.ticker = ticker
try:
self._ticker = yf.Ticker(self.ticker)
if not (start or end):
self.df = self.df_ = self._ticker.history(period='max', auto_adjust=True)
else:
self.df = self.df_ = self._ticker.history(start=start, end=end, auto_adjust=True)
except Exception as err:
print(err)
def adj_data(sym):
df = Stock(sym).df
ohlc = df[['Close']]
ohlc =ohlc.rename(columns={'Close': sym})
ohlc.name = sym
return ohlc
def to_return(prices,retType='simple'):
if retType == 'simple':
ret = (prices/prices.shift(1))-1
else:
ret = np.log(prices/prices.shift(1))
return ret
def factor_regression(df_stk):
stkName = df_stk.name
import pandas_datareader.data as web
df_factors = web.DataReader('F-F_Research_Data_5_Factors_2x3_daily', 'famafrench')[0]
df_factors.rename(columns={'Mkt-RF': 'MKT'}, inplace=True)
df_factors['MKT'] = df_factors['MKT']/100
df_factors['SMB'] = df_factors['SMB']/100
df_factors['HML'] = df_factors['HML']/100
df_factors['RMW'] = df_factors['RMW']/100
df_factors['CMA'] = df_factors['CMA']/100
df_stock_factor = pd.merge(df_stk,df_factors,left_index=True,right_index=True)
df_stock_factor['XsRet'] = df_stock_factor[stkName] - df_stock_factor['RF']
CAPM = sm.ols(formula = 'XsRet ~ MKT', data=df_stock_factor).fit(cov_type='HAC',cov_kwds={'maxlags':1})
FF3 = sm.ols( formula = 'XsRet ~ MKT + SMB + HML', data=df_stock_factor).fit(cov_type='HAC',cov_kwds={'maxlags':1})
FF5 = sm.ols( formula = 'XsRet ~ MKT + SMB + HML + RMW + CMA', data=df_stock_factor).fit(cov_type='HAC',cov_kwds={'maxlags':1})
CAPMtstat = CAPM.tvalues
FF3tstat = FF3.tvalues
FF5tstat = FF5.tvalues
CAPMcoeff = CAPM.params
FF3coeff = FF3.params
FF5coeff = FF5.params
CAPMpredi = CAPM.predict()
FF3predi = FF3.predict()
FF5predi = FF5.predict()
CAPMresid = CAPM.resid
FF3resid = FF3.resid
FF5resid = FF5.resid
results_df = pd.DataFrame({'CAPMcoeff':CAPMcoeff,'CAPMtstat':CAPMtstat,
'FF3coeff':FF3coeff, 'FF3tstat':FF3tstat,
'FF5coeff':FF5coeff, 'FF5tstat':FF5tstat},
index = ['Intercept', 'MKT', 'SMB', 'HML', 'RMW', 'CMA'])
df_stock_factor['CAPM'] = CAPMpredi
df_stock_factor['CAPMResiduals'] = CAPMresid
# Fama-French 3 Factor Model (FF3)
df_stock_factor['FF3'] = FF3predi
df_stock_factor['FF3Residuals'] = FF3resid
# Fama-French 5 Factor Model (FF5)
df_stock_factor['FF5'] = FF5predi
df_stock_factor['FF5Residuals'] = FF5resid
dfoutput = summary_col([CAPM, FF3, FF5],stars=True,float_format='%0.4f',
model_names=['CAPM','FF3','FF5'],
info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),
'Adjusted R2':lambda x: "{:.4f}".format(x.rsquared_adj)},
regressor_order = ['Intercept', 'MKT', 'SMB', 'HML', 'RMW', 'CMA'])
results_df.to_csv('stats/stats_'+stkName+'.csv')
df_stock_factor.to_csv('apm/'+stkName+'.csv')
return print(dfoutput)
df = adj_data("AMD")
sym = df.name
data = to_return(df,retType='simple')
data.name = sym
data.dropna(inplace=True)
print('==============================================')
print(sym+' - Risk Factor Regression')
print('==============================================')
factor_regression(data)
print(' ')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment