import numpy as np
import pandas as pd
import statsmodels.api as sm
from scipy.stats import f
data_factors = pd.read_csv('Data_FFFactors.csv', encoding='GB2312', usecols=[2, 6, 7, 8])
data_factors.columns = ['date', 'mkt', 'smb', 'hml']
data_factors['date'] = pd.to_datetime(data_factors['date'])
data_factors['yearmonth'] = data_factors['date'].dt.strftime('%Y%m')
data_factors
data_index = pd.read_csv('Data_Index.csv', encoding='GB2312', usecols=[1, 2, 4])
data_index.columns = ['idxname', 'date', 'return']
data_index['date'] = pd.to_datetime(data_index['date'])
data_index['yearmonth'] = data_index['date'].dt.strftime('%Y%m')
data_index
idxname = np.unique(data_index['idxname'].values)
idxname
data_xinxi = data_index[data_index['idxname'] == idxname[0]]
data_xinxi
data_gongyong = data_index[data_index['idxname'] == idxname[1]]
data_yiyao = data_index[data_index['idxname'] == idxname[2]]
data_kexuan = data_index[data_index['idxname'] == idxname[3]]
data_gongye = data_index[data_index['idxname'] == idxname[4]]
data_cailiao = data_index[data_index['idxname'] == idxname[6]]
data_xiaofei = data_index[data_index['idxname'] == idxname[7]]
data_dianxin = data_index[data_index['idxname'] == idxname[8]]
data_nengyuan = data_index[data_index['idxname'] == idxname[9]]
data_jinrong = data_index[data_index['idxname'] == idxname[10]]
data_rf = pd.read_csv('Data_RiskFreeReturn.csv', encoding='GB2312', usecols=[0, 3])
data_rf.columns = ['date', 'rfreturn']
data_rf['date'] = pd.to_datetime(data_rf['date'])
data_rf['yearmonth'] = data_rf['date'].dt.strftime('%Y%m')
data_rf
data_matrix = pd.merge(left=data_factors[['yearmonth', 'date', 'mkt', 'smb', 'hml']],
right=data_xinxi[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix
data_matrix = pd.merge(left=data_matrix,
right=data_gongyong[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_yiyao[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_kexuan[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_gongye[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_cailiao[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_xiaofei[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_dianxin[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_nengyuan[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_jinrong[['yearmonth', 'return']],
on=['yearmonth'],
how='inner')
data_matrix = pd.merge(left=data_matrix,
right=data_rf[['yearmonth', 'rfreturn']],
on=['yearmonth'],
how='inner')
data_matrix
data_matrix.columns = ['yearmonth', 'date', 'mkt', 'smb', 'hml', 'xinxi', 'gongyong', 'yiyao', 'kexuan',
'gongye', 'cailiao', 'xiaofei', 'dianxin', 'nengyuan', 'jinrong', 'rfreturn']
data_matrix.dropna(inplace=True)
data_matrix.sort_values(by='date', inplace=True)
data_matrix
x = data_matrix.loc[:, ['mkt', 'smb', 'hml']].values
ret_rf = data_matrix.loc[:, ['rfreturn']].values
ret_stock = data_matrix.loc[:, ['nengyuan']].values
# 单资产检验
X = sm.add_constant(x)
Y = ret_stock - ret_rf
model = sm.OLS(Y, X)
results = model.fit()
print(results.summary())
# 多资产检验
T = len(Y)
N = 10
K = 3
y = data_matrix.iloc[:, 5:15].values - data_matrix.loc[:, ['rfreturn']].values
# x = sm.add_constant(x)
xTx = np.dot(np.transpose(x), x)
xTy = np.dot(np.transpose(x), y)
AB_hat = np.dot(np.linalg.inv(xTx), xTy)
ALPHA = AB_hat[0]
ALPHA
RESD = y - np.dot(x, AB_hat)
COV = np.dot(np.transpose(RESD), RESD)/T
invCOV = np.linalg.inv(COV)
fs = x[:, [1, 2, 3]]
muhat = np.mean(fs, axis=0).reshape((3, 1))
fs = fs - np.mean(fs, axis=0)
omegahat = np.dot(np.transpose(fs), fs)/T
invOMG = np.linalg.inv(omegahat)
xxx = np.dot(np.dot(np.transpose(muhat), invOMG), muhat)
yyy = np.dot(np.dot(ALPHA, invCOV), np.transpose(ALPHA))
GRS = (T-N-K)/N*(1/(1+xxx))*yyy
pvalue = 1 - f.cdf(GRS[0][0], N, T-N-K)
print('三因子模型的多资产检验结果')
print('{:>7s},{:>7s},{:>7s},{:>7s},{:>7s},{:>7s},{:>7s},{:>7s},{:>7s}'.format('alpha1', 'alpha2', 'alpha3', 'alpha4', 'alpha5', 'alpha6', 'alpha7', 'GRS', 'pvalue'))
print('{:7.4f},{:7.4f},{:7.4f},{:7.4f},{:7.4f},{:7.4f},{:7.4f},{:7.4f},{:7.4f}'.format(ALPHA[0], ALPHA[1], ALPHA[2], ALPHA[3], ALPHA[4], ALPHA[5], ALPHA[6], GRS[0][0], pvalue))