黄磊 副教授

个人信息Personal Information


出生日期:1987-05-29

入职时间:2015-08-28

学历:博士研究生毕业

办公地点:交大犀浦校区第三号教学楼30439室

性别:

在职信息:在岗

主要任职:Associate Professor

其他任职:Supervisor of graduate students

毕业院校:新加坡国立大学

学科:数学. 统计学

所在单位:数学学院

报考该导师研究生的方式

欢迎你报考黄磊老师的研究生,报考有以下方式:

1、参加西南交通大学暑期夏令营活动,提交导师意向时,选择黄磊老师,你的所有申请信息将发送给黄磊老师,老师看到后将和你取得联系,点击此处参加夏令营活动

2、如果你能获得所在学校的推免生资格,欢迎通过推免方式申请黄磊老师研究生,可以通过系统的推免生预报名系统提交申请,并选择意向导师为黄磊老师,老师看到信息后将和你取得联系,点击此处推免生预报名

3、参加全国硕士研究生统一招生考试报考黄磊老师招收的专业和方向,进入复试后提交导师意向时选择黄磊老师。

4、如果你有兴趣攻读黄磊老师博士研究生,可以通过申请考核或者统一招考等方式报考该导师博士研究生。

点击关闭

教师博客

当前位置: 中文主页 >> 教师博客

数据会聊天之用Python实现GARCH建模

## 今天展示的主要内容是用Python做GARCH模型的模拟实验和真实数据分析,真实数据源自标准普尔500指数,模型拟合和预测结果都将呈现。另外,还会介绍一个从雅虎网站爬取股票数据的工具,以及一个常用的时间序列画图函数。


import datetime as dt #时间格式,用于网上爬股票数据

from arch.univariate import arch_model # 进行一元ARCH或GARCH模型建模的函数

import numpy as np

import pandas as pd

import statsmodels.api as sm

import statsmodels.tsa.api as smt

import pandas_datareader.data as web # 网络爬数据程序包

import matplotlib.pyplot as plt



## 构造一个画图函数

def tsplot(y, lags=None, figsize=(10, 8), style='bmh'):

    if not isinstance(y, pd.Series):   #判断类型

        y = pd.Series(y)

    with plt.style.context(style):    

        layout = (3, 2)

        ts_ax = plt.subplot2grid(layout, (0, 0), colspan=2)

        acf_ax = plt.subplot2grid(layout, (1, 0))

        pacf_ax = plt.subplot2grid(layout, (1, 1))

        qq_ax = plt.subplot2grid(layout, (2,0))        


        y.plot(ax=ts_ax)

        ts_ax.set_title('Time Series Analysis Plots')

        smt.graphics.plot_acf(y, lags=lags, ax=acf_ax, alpha=0.5)

        smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax, alpha=0.5)

        sm.qqplot(y, line='s', ax=qq_ax)

        qq_ax.set_title('QQ Plot')        

       

        plt.tight_layout()

    return


##简单ARCH(1)模拟

np.random.seed(23) #随机种子

a0 = 2.24

a1 = 0.6 # ARCH模型的设定参数

y = w = np.random.normal(size=500) #正态分布随机数

Y = np.empty_like(y)   


for t in range(len(y)):

    Y[t] = w[t] * np.sqrt((a0 + a1*y[t-1]**2))

# Y[t]即为满足ARCH(1)模型的模拟序列

    

tsplot(Y, lags=30)# 考察原序列的自相关图

plt.figure()

tsplot(Y**2, lags=30) #考察原序列平方的自相关图

plt.figure()


## GARCH(1,1)模拟

np.random.seed(2)

a0 = 0.2

a1 = 0.5

b1 = 0.3

n = 10000

w = np.random.normal(size=n)

eps = np.zeros_like(w)

sigsq = np.zeros_like(w)


for i in range(1, n):

    sigsq[i] = a0 + a1*(eps[i-1]**2) + b1*sigsq[i-1]

    eps[i] = w[i] * np.sqrt(sigsq[i])

    

# eps即满足GARCH(1,1)模型的模拟序列

tsplot(eps, lags=30) #考察序列自相关图

plt.figure()

tsplot(eps**2, lags=30) #考察序列平方的自相关图

plt.figure()


# 做参数估计

am = arch_model(eps) #若不作任何参数设定,则默认为GARCH(1,1)模型

res = am.fit() #拟合结果,参数估计和模拟设定值很接近

print(res.summary())


##标准普尔500指数实例分析

start = dt.datetime(2015,1,1) # 爬数据起始时间

end = dt.datetime(2020,1,1)  #爬数据结束时间,五年时间

sp500 = web.get_data_yahoo('SPY', start=start, end=end) # Yahoo网上,SPY即Standard&Poor500指数的缩写

returns = 100 * sp500['Close'].pct_change().dropna() # 价格转换成收益率

tsplot(returns**2,lags=30) #收益率平方有明显的群聚效应,适合建立GARCH模型

plt.figure()

returns.shape

#对SPY收益率拟合GARCH(1,1)模型

model=arch_model(returns, vol='Garch', p=1, o=0, q=1, dist='Normal')

results=model.fit()

print(results.summary()) #模型参数皆显著


#对未来收益率用模拟预测

forecasts = results.forecast(horizon=30, method='simulation', simulations=500) #模拟500次

sims = forecasts.simulations

sims.values.shape # 对每一个t时刻的return, 往后预测steps=30, 模拟500次

lines = plt.plot(sims.values[-1,:,:].T, color='blue',alpha=0.05)# 模拟结果作图

plt.figure()

#1步预报和30步预报对比图

plt.hist(sims.values[-1,:,-1],bins=50)

print(np.percentile(sims.values[-1,:,-1].T,5))

plt.hist(sims.values[-1, :,0],bins=50)

print(np.percentile(sims.values[-1,:,0].T,5))

plt.title('Distribution of Returns') # 橙色的是1步预报(500次模拟直方图),蓝色的是30步预报,明显步长越大方差越大