Last active
May 23, 2021 18:55
-
-
Save Moccazio/83d119386a5f8bbf1d310007d736df5f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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