股票数据的日历效应(一):星期效应
文章目录
完整代码和数据可关注gzh’finance褪黑素’回复关键词 【2001】 免费+无套路 获取!
1. 获取数据
import baostock as bs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, date
# 登陆系统
import baostock as bs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, date
lg = bs.login()
code = 'sz.399006'
start = '2018-01-01'
end = '2023-1-01'
# 获取指数基金指数历史数据
# 沪深300指数
hs300_price = bs.query_history_k_data_plus(code, "date,code,open,high,low,close,preclose,pctChg",
start_date=start, end_date=end, frequency="d")
# 整合为DataFrame格式
data_list = []
while (hs300_price.error_code == '0') & hs300_price.next():
data_list.append(hs300_price.get_row_data())
hs300 = pd.DataFrame(data_list, columns=hs300_price.fields)
hs300.to_csv('hs30.csv')
hs300.to_excel('hs30.xlsx')
login success!
hs300.to_excel('hs30.xlsx')
hs300=pd.read_csv('hs30.csv',index_col='date')
del hs300['code']
hs300.head()
df=hs300['close']
plt.rcParams['font.sans-serif'] = ['simhei'] #字体为黑体
plt.rcParams['axes.unicode_minus'] = False #正常显示负号 #时序图的绘制
df.plot()
plt.xticks(rotation=45) #坐标角度旋转
plt.xlabel('日期') #横、纵坐标以及标题命名
plt.ylabel('收盘价')
plt.title('沪深300收盘价',loc='center')
plt.grid()
plt.legend()
plt.savefig("hs300_close.svg")
plt.show()
2. 描述性统计分析
基本指标介绍:
-
平均值(Mean):
- 公式: Mean = ∑ i = 1 n x i n \text{Mean} = \frac{\sum_{i=1}^{n} x_i}{n} Mean=n∑i=1nxi
- 解释: 所有数据点的总和除以观测次数。
-
中位数(Median):
- 公式: 对数据进行排序,中间位置的值即为中位数。
- 解释: 将数据按升序或降序排列,中间位置的值即为中位数。
-
标准差(Standard Deviation):
- 公式: σ = ∑ i = 1 n ( x i − Mean ) 2 n \sigma = \sqrt{\frac{\sum_{i=1}^{n} (x_i - \text{Mean})^2}{n}} σ=n∑i=1n(xi−Mean)2
- 解释: 衡量数据点与平均值的偏离程度,标准差越大,数据分散越广。
-
方差(Variance):
- 公式: Variance = ∑ i = 1 n ( x i − Mean ) 2 n \text{Variance} = \frac{\sum_{i=1}^{n} (x_i - \text{Mean})^2}{n} Variance=n∑i=1n(xi−Mean)2
- 解释: 标准差的平方,表示数据偏离平均值的程度。
-
百分位数(Percentiles):
- 公式: P k = k ( n + 1 ) 100 P_k = \frac{k(n+1)}{100} Pk=100k(n+1) ,其中 k k k 是百分位数的百分比。
- 解释: 将数据排序并将其分为百分比,描述给定百分比以下的数据点的值。
-
四分位数(Quartiles):
- 公式: 第一四分位数 Q 1 Q_1 Q1,中位数 Q 2 Q_2 Q2,第三四分位数 Q 3 Q_3 Q3。
- 解释: 将数据分为四个等份,通常用来检测数据分布的形状。
-
偏度(Skewness):
- 公式: Skewness = ∑ i = 1 n ( x i − Mean σ ) 3 n \text{Skewness} = \frac{\sum_{i=1}^{n} \left(\frac{x_i - \text{Mean}}{\sigma}\right)^3}{n} Skewness=n∑i=1n(σxi−Mean)3
- 解释: 衡量数据分布的偏斜程度。
-
峰度(Kurtosis):
- 公式: Kurtosis = ∑ i = 1 n ( x i − Mean σ ) 4 n − 3 \text{Kurtosis} = \frac{\sum_{i=1}^{n} \left(\frac{x_i - \text{Mean}}{\sigma}\right)^4}{n} - 3 Kurtosis=n∑i=1n(σxi−Mean)4−3
- 解释: 衡量数据分布的尖锐或平缓程度。
-
Jarque-Bera统计量。JB统计量主要用于检验一个样本是否符合正态分布,特别是对于大样本。
JB统计量的计算公式为:
J B = n 6 ( S 2 + ( K − 3 ) 2 4 ) JB = \frac{n}{6} \left( S^2 + \frac{(K-3)^2}{4} \right) JB=6n(S2+4(K−3)2)
其中,(n) 是样本大小,(S) 是偏度,(K) 是峰度。
在零假设下(假设数据是正态分布的),JB统计量应该近似服从卡方分布,因此可以进行卡方检验。检验的原假设是数据是正态分布的,如果JB统计量的值显著大于期望的卡方分布的临界值,就会拒绝这一假设,意味着数据不服从正态分布。
在实际应用中,如果对数据正态性的检验结果为拒绝原假设,则可能需要谨慎解释和处理数据,尤其是在使用依赖于正态性的统计方法时。如果接受原假设,则可以在统计分析中使用正态性假设。
# from pandas_datareader import data
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 导入数据
hs300 =pd.read_csv("hs30.csv")
del hs300['code']
# 标准化数据格式
hs300["dates"]=pd.to_datetime(hs300["date"])
# 获取星期几的数据
hs300["weekday"] = hs300["dates"].dt.day_name()
# 星期字符串转换成数值
days ={'Monday':1,'Tuesday':2,'Wednesday':3,'Thursday':4,'Friday':5}
hs300["weekday"] = hs300["weekday"].apply(lambda x: days[x])
# 计算对数收益率
hs300_close=hs300['close']
hs300_lgreturn=np.log(hs300_close)-np.log(hs300_close.shift(1))
# 计算收益率
hs300_return=hs300_close/hs300_close.shift(1)
# 分组描述
df1=pd.DataFrame(hs300_lgreturn.groupby(hs300["weekday"]).describe())
df2=pd.DataFrame(hs300_lgreturn.describe())
df3=pd.DataFrame(np.array(df2).reshape(1,8))
df3.columns=['count','mean','std','min','25%','50%','75%','max']
df3.index=['All']
hh=pd.concat([df1,df3],axis=0)
hh
# 偏度、峰度、标准差、J-B统计量
import numpy as np
import scipy.stats as stats
def self_JBtest(y):
# 样本规模n
n = y.size
y_ = y - y.mean()
"""
M2:二阶中心钜
skew 偏度 = 三阶中心矩 与 M2^1.5的比
krut 峰值 = 四阶中心钜 与 M2^2 的比
"""
M2 = np.mean(y_**2)
skew = np.mean(y_**3)/M2**1.5
krut = np.mean(y_**4)/M2**2
"""
计算JB统计量,以及建立假设检验
"""
JB = n*(skew**2/6 + (krut-3 )**2/24)
pvalue = 1 - stats.chi2.cdf(JB,df=2)
data={'偏度':skew,'峰值':krut,'JB检验':JB,'P值':pvalue}
data1=pd.DataFrame(data,index=[1])
return data1
a1=pd.DataFrame()
a2=self_JBtest(hs300_lgreturn)
a2.index=['All']
for i in range(1,6):
data=hs300[hs300['weekday']==i]
w_close=data["close"]
ret = np.log(w_close) - np.log(w_close.shift(1)) # 这里用对数收益率,因为对数收益率的统计特性比较好
a=self_JBtest(ret)
a1=pd.concat([a,a1],axis=0)
a1.index=[1,2,3,4,5]
result=pd.concat([a1,a2])
result
ds=pd.concat([result,hh],axis=1)
del ds['25%']
del ds['50%']
del ds['75%']
ds1=pd.DataFrame()
for i in range(6):
ds0=pd.DataFrame(np.array(ds[i:i+1]).reshape(9,1))
ds1=pd.concat([ds1,ds0],axis=1)
ds1.columns=['Monday','Tuesday','Wednesday','Thursday','Friday','All']
ds1.index=ds.columns
ds1
Monday | Tuesday | Wednesday | Thursday | Friday | All | |
---|---|---|---|---|---|---|
偏度 | 0.011566 | -0.151217 | -5.523671e-01 | -0.323176 | 0.043572 | -0.249467 |
峰值 | 3.262469 | 3.956899 | 4.541166e+00 | 3.402407 | 3.136129 | 4.109590 |
JB检验 | 0.697143 | 10.364963 | 3.700504e+01 | 5.893644 | 0.256897 | 74.931360 |
P值 | 0.705695 | 0.005614 | 9.214204e-09 | 0.052506 | 0.879459 | 0.000000 |
count | 236.000000 | 243.000000 | 2.470000e+02 | 247.000000 | 241.000000 | 1214.000000 |
mean | 0.002005 | 0.001620 | -1.016630e-03 | -0.001022 | -0.000336 | 0.000232 |
std | 0.022007 | 0.016063 | 1.673080e-02 | 0.016365 | 0.017609 | 0.017873 |
min | -0.082707 | -0.059298 | -4.919148e-02 | -0.065055 | -0.063340 | -0.082707 |
max | 0.053526 | 0.047266 | 5.370838e-02 | 0.051846 | 0.047039 | 0.053708 |
3. 可视化收益率序列
绘制总体收益率图以及周一到周五的收益率序列
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns #seaborn画出的图更好看,且代码更简单,缺点是可塑性差
from statsmodels.graphics.tsaplots import plot_acf #自相关图
from statsmodels.tsa.stattools import adfuller as ADF #平稳性检测
from statsmodels.graphics.tsaplots import plot_pacf #偏自相关图
from statsmodels.stats.diagnostic import acorr_ljungbox #白噪声检验
from statsmodels.tsa.arima_model import ARIMA
#seaborn 是建立在matplotlib之上的
#jupyter中文显示是方框,加入下面两行即可显示中文,若嫌麻烦,也可去网上搜索如何永久显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6) #设置输出图片大小
sns.set(color_codes=True) #seaborn设置背景
# 计算对数收益率
hs300_close=hs300['close']
hs300_lgreturn=np.log(hs300_close)-np.log(hs300_close.shift(1))
# print(hs300_close.head())
hs300_lgreturn.plot(grid=True).axhline(y=0,c="orange",ls="--",lw=2)
plt.show()
for i in range(1,6):
bel=['Monday','Tuesday','Wednesday','Thursday','Friday']
fig, ax = plt.subplots()
plt.axhline(y=0,c="orange",ls="--",lw=2)
data=hs300[hs300['weekday']==i]
w_close=data["close"]
ret = np.log(w_close) - np.log(w_close.shift(1)) # 这里用对数收益率,因为对数收益率的统计特性比较好
y=ret
ax.plot(y, linewidth=2.0,label=bel[i-1])
ax.legend()
plt.grid()
# save=['w1.svg','w2.svg','w3.svg','w4.svg','w5.svg'] #保存为svg格式的图形
# plt.savefig(save[i-1])
plt.show()
4. 虚拟变量回归
当涉及到星期效应的回归分析时,我们同样可以使用虚拟变量回归来处理。假设我们有一个表示星期的分类变量,通常用1到7表示周一到周日。我们可以创建6个虚拟变量,每个对应一个工作日(周一到周五),如下所示:
D 1 , D 2 , D 3 , D 4 , D 5 D_1, D_2, D_3, D_4, D_5 D1,D2,D3,D4,D5
这里, D i D_i Di 表示是否是星期 i i i,取值为:
D i = { 1 , if 当前天是星期 i 0 , otherwise D_i = \begin{cases} 1, & \text{if 当前天是星期 } i \\ 0, & \text{otherwise} \end{cases} Di={1,0,if 当前天是星期 iotherwise
然后,我们的回归模型可能如下:
Y = β 0 + β 1 D 1 + β 2 D 2 + β 3 D 3 + β 4 D 4 + β 5 D 5 + … + ϵ Y = \beta_0 + \beta_1 D_1 + \beta_2 D_2 + \beta_3 D_3 + \beta_4 D_4 + \beta_5 D_5 + \ldots + \epsilon Y=β0+β1D1+β2D2+β3D3+β4D4+β5D5+…+ϵ
这里, β 0 \beta_0 β0 是截距, β 1 , β 2 , … , β 5 \beta_1, \beta_2, \ldots, \beta_5 β1,β2,…,β5是相应虚拟变量的回归系数, ϵ \epsilon ϵ 是误差项。
通过检验每个虚拟变量的回归系数,你可以评估每个工作日对因变量的影响。例如,如果 β 1 \beta_1 β1 是显著的正值,说明星期一对因变量有正向影响;如果 β 2 \beta_2 β2 是显著的负值,说明星期二对因变量有负向影响,以此类推。
import statsmodels.api as sm
# 设置虚拟变量
all_data = []
for x in hs300["weekday"]:
item={
"Mon": 1 if x==1 else 0,
"Tue": 1 if x==2 else 0,
"Wens": 1 if x==3 else 0,
"Thus": 1 if x==4 else 0,
"Fri": 1 if x==5 else 0
}
all_data.append(item)
all_data = pd.DataFrame(data=all_data)
r=pd.DataFrame(hs300_lgreturn)
X=all_data[['Mon','Tue','Wens','Thus','Fri']]
X.index = r.index
df=pd.concat([r,X],axis=1)
# 处理空值
import missingno
# missingno.matrix(df)
# 直接剔除
df = df.dropna()
missingno.matrix(df)
plt.savefig("dropno.svg")
plt.show()
X=df[['Mon','Tue','Wens','Thus','Fri']]
Y=df[["close"]]
from statsmodels.compat import scipy
import statsmodels.api as sm
X2 = sm.add_constant(X)
est = sm.OLS(Y*100, X2).fit()
print(est.summary())
OLS Regression Results
==============================================================================
Dep. Variable: close R-squared: 0.005
Model: OLS Adj. R-squared: 0.002
Method: Least Squares F-statistic: 1.616
Date: Sat, 27 May 2023 Prob (F-statistic): 0.168
Time: 03:23:37 Log-Likelihood: -2423.8
No. Observations: 1214 AIC: 4858.
Df Residuals: 1209 BIC: 4883.
Df Model: 4
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0208 0.043 0.488 0.626 -0.063 0.105
Mon 0.1796 0.104 1.726 0.085 -0.025 0.384
Tue 0.1411 0.103 1.373 0.170 -0.061 0.343
Wens -0.1225 0.102 -1.200 0.231 -0.323 0.078
Thus -0.1230 0.102 -1.204 0.229 -0.323 0.077
Fri -0.0544 0.103 -0.527 0.598 -0.257 0.148
==============================================================================
Omnibus: 48.158 Durbin-Watson: 1.994
Prob(Omnibus): 0.000 Jarque-Bera (JB): 89.286
Skew: -0.285 Prob(JB): 4.09e-20
Kurtosis: 4.200 Cond. No. 1.02e+15
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The smallest eigenvalue is 1.41e-27. This might indicate that there are
strong multicollinearity problems or that the design matrix is singular.
结果分析:
根据上述结果,可以看出周一到周五的系数都存在,其中周一周二的系数为正,说明在一定程度上可能存在正的日历效应;周三周四周五的系数为负,说明在一定程度上存在负的日历效应。但是周一至周五的回归系数t检验的P值都大于0.05,说明接受原假设,该模型不显著。回归方程R2的值为0.005,说明该模型的拟合效果不佳,有待进一步提高。
5.使用arch-garch进行波动性消除以进一步验证星期效应的稳健性
参考文献《中国股市日历效应研究 :基于滚动样本检验的方法》,运用基于 GED 分布的 GARCH(1 , 1)模型, 专
注于研究在不同长度窗口时, 星期效应存在的稳健性。
对于金融时间序列,波动率往往具有以下特征:
(1)存在波动率聚集现象。 即波动率在一段时间上高,一段时间上低。
(2)波动率以连续时间变化,很少发生跳跃
(3)波动率不会发散到无穷,波动率往往是平稳的
(4)波动率对价格大幅上升和大幅下降的反应是不同的,这个现象为杠杆效应
建立arch-garch模型进行收益率序列的波动率修正
5.1 查看收益率序列情况
# data=hs300['pctChg']
data=df["close"]*100
data.plot(grid=True)
plt.legend()
plt.savefig("revenue.svg")
5.2 利用混成检验(Ljung-Box),检验序列 { a t 2 a_t^2 at2} 的相关性,来判断是否具有ARCH效应
计算均值方程残差:
a
t
=
r
t
−
μ
t
a_t=r_t- \mu_t
at=rt−μt
画出残差及残差的平方
at = data - model.fittedvalues
at2 = np.square(at)
plt.figure(figsize=(10,6))
plt.subplot(211)
plt.plot(at,label = 'at')
plt.legend()
plt.subplot(212)
plt.plot(at2,label='at^2')
plt.legend(loc=0)
plt.savefig("at2.svg")
然后对{ a t 2 a_t^2 at2}序列进行混成检验: 原假设H0:序列没有相关性,备择假设H1:序列具有相关性
m = 15 # 我们检验15个自相关系数
acf,q,p = sm.tsa.acf(at2,nlags=m,qstat=True) ## 计算自相关系数 及p-value
out = np.c_[range(1,16), acf[1:], q, p]
output=pd.DataFrame(out, columns=['lag', "AC", "Q", "P-value"])
output = output.set_index('lag')
output
p-value小于显著性水平0.05,我们拒绝原假设,即认为序列具有相关性。因此具有ARCH效应。
fig = plt.figure(figsize=(10,5))
ax1=fig.add_subplot(111)
fig = sm.graphics.tsa.plot_pacf(at2,lags = 30,ax=ax1)
plt.savefig("arch.svg")
import arch
可以用{ a t 2 a_t^2 at2}序列的偏自相关函数PAC来确定阶次,由上面的图我们可以定为7阶
train = data[:-10]
test = data[-10:]
am = arch.arch_model(train,mean='AR',lags=0,vol='ARCH',p=7)
res = am.fit()
res.summary()
Dep. Variable: | close | R-squared: | 0.000 |
---|---|---|---|
Mean Model: | AR | Adj. R-squared: | 0.000 |
Vol Model: | ARCH | Log-Likelihood: | -2410.30 |
Distribution: | Normal | AIC: | 4826.60 |
Method: | Maximum Likelihood | BIC: | 4841.88 |
No. Observations: | 1204 | ||
Date: | Sat, May 27 2023 | Df Residuals: | 1203 |
Time: | 03:24:33 | Df Model: | 1 |
coef | std err | t | P>|t| | 95.0% Conf. Int. | |
---|---|---|---|---|---|
Const | 0.0235 | 5.132e-02 | 0.457 | 0.648 | [-7.713e-02, 0.124] |
coef | std err | t | P>|t| | 95.0% Conf. Int. | |
---|---|---|---|---|---|
omega | 3.1776 | 0.183 | 17.363 | 1.581e-67 | [ 2.819, 3.536] |
alpha[1] | 9.9298e-03 | 2.696e-02 | 0.368 | 0.713 | [-4.292e-02,6.278e-02] |
Covariance estimator: robust
r
t
=
0.086676
+
0.042566
a
t
−
0.007013
a
t
−
1
+
0.024126
a
t
−
2
−
0.020781
a
t
−
3
−
0.046320
a
t
−
4
−
0.071373
a
t
−
5
+
0.051107
a
t
−
6
r_t=0.086676+0.042566a_t-0.007013a_{t-1}+0.024126a_{t-2}-0.020781a_{t-3}-0.046320a_{t-4}-0.071373a_{t-5}+0.051107a_{t-6}
rt=0.086676+0.042566at−0.007013at−1+0.024126at−2−0.020781at−3−0.046320at−4−0.071373at−5+0.051107at−6
σ
2
=
1.308054
+
0.185033
a
t
−
1
2
+
0.087033
a
t
−
2
2
\sigma^2=1.308054+0.185033a_{t-1}^2+0.087033a_{t-2}^2
σ2=1.308054+0.185033at−12+0.087033at−22
对上述模型,我们可以看出,上证指数的日收益率期望大约在0.%。 模型的R-squared较小,拟合效果一般。
ARCH模型的预测
res.hedgehog_plot()
plt.savefig("hedgehog.svg")
可以看出,虽然具体值差距挺大,但是均值和方差的变化相似。
5.3 GARCH模型与波动率预测
GARCH(m,s)的定阶较难,一般使用低阶模型如GARCH(1,1),GARCH(2,1),GARCH(1,2)等。
下面我们以之前的数据为例,构建GARCH模型,均值方程为AR(7)模型,波动率模型为GARCH(1,1)
am = arch.arch_model(y=data,x=X,mean='LS',lags=0,vol='GARCH')
res1 = am.fit()
res1.summary()
Dep. Variable: | close | R-squared: | 0.004 |
---|---|---|---|
Mean Model: | Least Squares | Adj. R-squared: | -0.000 |
Vol Model: | GARCH | Log-Likelihood: | -2395.71 |
Distribution: | Normal | AIC: | 4809.41 |
Method: | Maximum Likelihood | BIC: | 4855.33 |
No. Observations: | 1214 | ||
Date: | Sat, May 27 2023 | Df Residuals: | 1208 |
Time: | 03:24:50 | Df Model: | 6 |
coef | std err | t | P>|t| | 95.0% Conf. Int. | |
---|---|---|---|---|---|
Const | 0.0316 | 4.947e-02 | 0.639 | 0.523 | [-6.537e-02, 0.129] |
Mon | 0.2166 | 0.134 | 1.619 | 0.105 | [-4.559e-02, 0.479] |
Tue | 0.1246 | 9.989e-02 | 1.247 | 0.212 | [-7.118e-02, 0.320] |
Wens | -0.2264 | 0.112 | -2.024 | 4.301e-02 | [ -0.446,-7.121e-03] |
Thus | -0.0351 | 6.651e-02 | -0.528 | 0.598 | [ -0.165,9.525e-02] |
Fri | -0.0480 | 9.643e-02 | -0.498 | 0.618 | [ -0.237, 0.141] |
coef | std err | t | P>|t| | 95.0% Conf. Int. | |
---|---|---|---|---|---|
omega | 0.1327 | 5.085e-02 | 2.610 | 9.060e-03 | [3.304e-02, 0.232] |
alpha[1] | 0.0734 | 1.776e-02 | 4.135 | 3.554e-05 | [3.863e-02, 0.108] |
beta[1] | 0.8864 | 2.356e-02 | 37.630 | 6.861e-310 | [ 0.840, 0.933] |
Covariance estimator: robust
σ 2 = 0.096793 + 0.132097 a t − 1 2 + 0.821024 σ t − 1 2 \sigma^2= 0.096793+ 0.132097a_{t-1}^2+ 0.821024\sigma_{t-1}^2 σ2=0.096793+0.132097at−12+0.821024σt−12
am = arch.arch_model(y=data,x=X,mean='LS',lags=0,vol='GARCH')
res1 = am.fit()
res1.plot()
plt.plot(data)
plt.savefig("residuals.svg")
观察上图,第一张图为标准化残差,近似平稳序列,说明模型在一定程度上是正确的;
第二张图,绿色为原始收益率序列、蓝色为条件异方差序列,可以发现条件异方差很好得表现出了波动率。
am = arch.arch_model(y=data,x=X,mean='AR',lags=0,vol='GARCH')
res1 = am.fit()
res1.summary()
Dep. Variable: | close | R-squared: | 0.000 |
---|---|---|---|
Mean Model: | AR | Adj. R-squared: | 0.000 |
Vol Model: | GARCH | Log-Likelihood: | -2400.75 |
Distribution: | Normal | AIC: | 4809.51 |
Method: | Maximum Likelihood | BIC: | 4829.91 |
No. Observations: | 1214 | ||
Date: | Sat, May 27 2023 | Df Residuals: | 1213 |
Time: | 03:25:00 | Df Model: | 1 |
coef | std err | t | P>|t| | 95.0% Conf. Int. | |
---|---|---|---|---|---|
Const | 0.0349 | 4.744e-02 | 0.737 | 0.461 | [-5.803e-02, 0.128] |
coef | std err | t | P>|t| | 95.0% Conf. Int. | |
---|---|---|---|---|---|
omega | 0.1280 | 4.960e-02 | 2.582 | 9.835e-03 | [3.083e-02, 0.225] |
alpha[1] | 0.0684 | 1.620e-02 | 4.222 | 2.420e-05 | [3.664e-02, 0.100] |
beta[1] | 0.8929 | 2.225e-02 | 40.136 | 0.000 | [ 0.849, 0.936] |
Covariance estimator: robust
res1.hedgehog_plot()
plt.savefig("heg2.svg")
观察拟合图发现,在方差的还原上还是不错的
6. 利用修正的数据再次进行OLS回归检验稳健性
Y=res.conditional_volatility
df=pd.concat([Y,X2],axis=1)
missingno.matrix(df)
plt.show()
df = df.dropna()
df=df.values
X=df[:,1:7]
Y=df[:,0]
from statsmodels.compat import scipy
import statsmodels.api as sm
est2 = sm.OLS(Y, X).fit()
print(est2.summary())
P值均小于0.05 说明模型参数是显著的 存在影响,当前星期效应是初步存在的。但R2依然不高 后续可考虑使用滚动样本检验进一步进行稳健性分析。
参考文献:
[1]张兵.中国股市日历效应研究:基于滚动样本检验的方法[J].金融研究,2005(07):33-44.
[2]焦璇琨,李从欣.中国股票市场周内效应的实证研究[J].统计与管理,2020,35(02):64-68.DOI:10.16722/j.issn.1674-537x.2020.02.012.
完整代码和数据可关注gzh’finance褪黑素’回复关键词【2001】免费+无套路 获取!