利用tushare-pro进行时间序列分析
tushare-id:371594
一些预备知识
我们称一个时间序列
{
x
t
}
\left\{ {{x}_{t}} \right\}
{xt},满足
称其服从
G
A
R
C
H
(
m
,
s
)
GARCH\left( m,s \right)
GARCH(m,s)模型,即广义自回归条件异方差模型。其中,
μ
t
{{\mu }_{t}}
μt为均值项,
a
t
{{a}_{t}}
at为残差项,
a
t
{{a}_{t}}
at的条件方差是时变的,即条件异方差。
a
2
t
−
i
{{a}^{2}}_{t-i}
a2t−i是 ARCH项,反映第前
i
i
i期的新消息;
σ
2
t
−
i
{{\sigma }^{2}}_{t-i}
σ2t−i 是条件方差即 GARCH 项,是对第前
j
j
j期方差的预测。同时,各项的系数应该满足非负条件。
准备工作,导入需要的包
import pandas as pd
import numpy as np
import statsmodels.tsa.api as smt
#tsa为Time Series analysis缩写
import statsmodels.api as sm
import scipy.stats as scs
from arch import arch_model
#画图
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
登录tushare
import tushare as ts
token='输入你的token'
pro=ts.pro_api(token)
编写函数反映金融数据特征
def ts_plot(data, lags=None,title=''):
if not isinstance(data, pd.Series):
data = pd.Series(data)
#matplotlib官方提供了五种不同的图形风格,
#包括bmh、ggplot、dark_background、
#fivethirtyeight和grayscale
with plt.style.context('ggplot'):
fig = plt.figure(figsize=(10, 8))
layout = (3, 2)
ts_ax = plt.subplot2grid(layout, (0, 0))
acf_ax = plt.subplot2grid(layout, (1, 0))
pacf_ax = plt.subplot2grid(layout, (1, 1))
qq_ax = plt.subplot2grid(layout, (2, 0))
pp_ax = plt.subplot2grid(layout, (2, 1))
data.plot(ax=ts_ax)
ts_ax.set_title(title+'时序图')
smt.graphics.plot_acf(data, lags=lags,
ax=acf_ax, alpha=0.5)
acf_ax.set_title('自相关系数')
smt.graphics.plot_pacf(data, lags=lags,
ax=pacf_ax, alpha=0.5)
pacf_ax.set_title('偏自相关系数')
sm.qqplot(data, line='s', ax=qq_ax)
qq_ax.set_title('QQ 图')
scs.probplot(data, sparams=(data.mean(),
data.std()), plot=pp_ax)
pp_ax.set_title('PP 图')
plt.tight_layout()
return
调用tusharepro数据,进行分析
df=pro.index_daily(ts_code='000300.SH')#调用沪深300指数日线情况
df.index=pd.to_datetime(df.trade_date)#换时间戳
df=df.sort_index()#按照index排序
df['ret']=np.log(df.close/df.close.shift(1))#计算ret率
#df.head()
ts_plot(df.ret.dropna(),lags=30,title='沪深300收益率')
结果
从上图可以看出,沪深300指数收益率时间序列呈现出以下几个现象,具有一定的普遍性。
自相关性比较弱,但对其进行变换后,如取平方、绝对值等,则表现出很强的自相关性(见后文);
收益率的条件方差(Conditional Variance)随着时间而变化,即存在条件异方差的特征。
收益率序列的波动具有持续性,即存在波动集聚(Volatility Clustering)的现象。比如2007-2008、2015-2016、2019具有较大的波动性。
QQ图显示,收益率并不服从正态分布,极端值较多,具有厚尾的现象。
GARCH模型
模拟garch(1,1)模型
# 模拟GARCH(1, 1) 过程
np.random.seed(1)
a0 = 0.2
a1 = 0.5
b1 = 0.3
n = 10000
w = np.random.normal(size=n)
garch = np.zeros_like(w)
sigsq = np.zeros_like(w)
for i in range(1, n):
sigsq[i] = a0 + a1*(garch[i-1]**2) + b1*sigsq[i-1]
garch[i] = w[i] * np.sqrt(sigsq[i])
_ = ts_plot(garch, lags=30,title='模拟GARCH')
使用模拟的数据,进行模型拟合
#update_freq=0表示不输出中间结果,只输出最终结果
# 使用模拟的数据进行 GARCH(1, 1) 模型拟合
#arch_model默认建立GARCH(1,1)模型
am = arch_model(garch)
res = am.fit(update_freq=0)
print(res.summary())
拟合沪深300收益率数据
Y=ret*100.0
am = arch_model(Y,p=1, o=1, q=1, dist='StudentsT')
res = am.fit(update_freq=0)
#update_freq=0表示不输出中间结果,只输出最终结果
print(res.summary())
res.resid.plot(figsize=(12,5))
plt.title('沪深300收益率拟合GARCH(1,1)残差',size=15)
plt.show()
res.conditional_volatility.plot(figsize=(12,5),color='r')
plt.title('沪深300收益率条件方差',size=15)
plt.show()