股价/期货等时间序列数据的整合检验、Grach建模

前言

之前解决一个金融方向的时间序列类问题的实验,因为要形成一个完整的论文,自己从头开始学的时候,把需要的实验和作图整合了一下。其中包括了时间序列数据的简单收益率、对数收益率的计算。数据的稳定性检验(单位根检验、自相关检验、偏相关检验)、白噪声检验、JB检验。还有QQ、PP图、频率分布图等作图。
最后还有GRACH建模。应该能从头到尾解决一个时间序列数据的从检验到建模的论文撰写,希望能方便大家。

如果对大家有帮助,希望可以点个star。
github地址:https://github.com/bamboosir920/Time-series-data-complete-experimental-integration-package
gitee地址:https://gitee.com/bamboosir920/Time-series-data-complete-experimental-integration-package

示例

数据格式:

示例:

代码

main.py

#格式 日期 价格(元/吨)
import numpy as np
import csv
from TStest import *
from TSbase import *sns.set()  #切换到sns的默认运行配置
#避免中文显示不出来
matplotlib.rc("font",family='KaiTi')
#避免负号显示不出来
matplotlib.rcParams['axes.unicode_minus']=False
#导入数据
p=r'./xxx.csv'
with open(p) as f:data=np.loadtxt(f,str,delimiter=',')
x=np.array(data[:,0])
y=np.array(data[:,1])
y = y.astype(np.float64)'''
基础作图
'''
baseimg(data=y,date=x,xlabel="时间",ylabel="收盘价",x_loc=500,y_loc=500)'''
收益率
'''
# 简单收益率
simpleReturn=simple_return_rate(y,False)
# 对数收益率
logReturn=log_return_rate(y,False)'''
JB检验
'''
print(JBtest(logReturn))'''
平稳性检验
'''
TS_ADF(logReturn)
TS_ACF(logReturn)
TS_PACF(logReturn)'''
大图
# '''
ts_plot(logReturn,lags=30,title='对数收益率')'''
白噪声检验
'''
white_test(simpleReturn,12)
white_test(logReturn,30)'''
频率分布图
'''
frequency_distribution(logReturn,title='频率分布图')'''
Garch建模
'''
Arch(logReturn)'''
预测
'''
predict(y,logReturn,20000,'..')

TSbase.py

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
from matplotlib.pyplot import MultipleLocator
from math import *
#避免中文显示不出来
matplotlib.rc("font",family='KaiTi')
#避免负号显示不出来
matplotlib.rcParams['axes.unicode_minus']=False
#tsa为Time Series analysis缩写
import statsmodels.api as sm
import scipy.stats as scs
import seaborn as sns
# 导入 arch 包中的 arch_model 模块
from arch import arch_model'''
用来绘制基础随时间而变化趋势图date:时间,x轴
data:数据,y轴,具体数值
title:标题
xlabel:横坐标注释
ylabel:纵坐标注释
x_loc:X轴默认刻度,默认值为10
y_loc:y轴默认刻度,默认值为10
colors:折线颜色,默认为'#0066cc'
'''
def baseimg(data,date,title='',xlabel='',ylabel='',x_loc=10,y_loc=10,colors='#0066cc'):#绘制网格plt.grid(alpha=0.6,linestyle=':')#作图plt.plot(date,data,color=colors)#把x轴的刻度间隔设置为500,并存在变量里x_major_locator=MultipleLocator(x_loc)#把y轴的刻度间隔设置为500,并存在变量里y_major_locator=MultipleLocator(y_loc)#ax为两条坐标轴的实例ax=plt.gca()#把x轴的主刻度设置为500的倍数ax.xaxis.set_major_locator(x_major_locator)#把y轴的主刻度设置为500的倍数ax.yaxis.set_major_locator(y_major_locator)#设置标题、x轴注释、y轴注释plt.title(title,fontsize=16)plt.xlabel(ylabel,fontsize=12)plt.ylabel(xlabel)plt.show()return 0'''
Logarithmic return rate
对数收益率
对数收益率: 所有价格取对数后两两之间的差值。input:
data:数据
is_img:是否作图,True/False
title:标题名
colors:折线颜色,默认为'#0066cc'
'''
def log_return_rate(data,is_img=True,title='Logarithmic return rate',colors='#0066cc'):logReturn = np.diff(np.log(data))if is_img==True:plt.plot(logReturn,color=colors)plt.title(title,fontsize=16)plt.show()return logReturn'''
simple return of rate
简单收益率
input:
data:数据
is_img:是否作图,True/False
title:标题名
colors:折线颜色,默认为'#0066cc'
'''
def simple_return_rate(data,is_img=True,title='simple return of rate',colors='#0066cc'):simpleReturn = np.diff(data)if is_img==True:plt.plot(simpleReturn,color=colors)plt.title(title,fontsize=16)plt.show()return simpleReturn'''
价格预测
input:
data:价格序列
ret:收益率
count:拟合次数
title:标题
'''
def predict(data,ret,count,title=''):# 设置一个空列表来保存我们每个模拟价格序列的最终值result = []S = data[-1] #起始股票价格(即最后可用的实际股票价格)T = 252 #交易天数all=0mu=np.mean(ret) #收益率vol=np.std(ret)*sqrt(252/len(data)) #波动率#选择要模拟的运行次数-我选择了10,000for i in range(count):#使用随机正态分布创建每日收益表daily_returns=np.random.normal((1+mu)**(1/T),vol/sqrt(T),T)#设定起始价格,并创建由上述随机每日收益生成的价格序列price_list = [S]for x in daily_returns:price_list.append(price_list[-1]*x)#将每次模拟运行的结束值添加到我们在开始时创建的空列表中result.append(price_list[-1])plt.figure(figsize=(10,6))plt.hist(result,bins= 100)plt.axvline(np.percentile(result,5), color='r', linestyle='dashed', linewidth=2)plt.axvline(np.percentile(result,95), color='r', linestyle='dashed', linewidth=2)mean=np.mean(result)a5=result[int(len(result)/5)]a95=result[-int(len(result)/5)]print(mean)print(a95)print(a5)plt.figtext(0.8,0.8,s="起始价格: %.2f元" %S)plt.figtext(0.8,0.7,"平均价格 %.2f 元" %mean)plt.figtext(0.8,0.6,"5%"+" 置信度: %.2f元" %a5)plt.figtext(0.15,0.6, "95%" +"置信度: %.2f元" %a95)plt.title(title, weight='bold', fontsize=12)plt.show()'''
频率分布图
Histogram of frequency distribution
input:
data:数据
title:标题
'''
def frequency_distribution(data,title='频率分布图'):sns.distplot(data, color='blue') #密度图plt.title(title,fontsize=16)plt.show()'''
grach建模
input:
data:数据
title1:拟合ARCH残差图标题
title2:条件方差图标题
vol (str, optional) 波动率模型的名称,目前支持: 'GARCH' (默认), 'ARCH', 'EGARCH', 'FIARCH' 以及 'HARCH'。
p (int, optional) 对称随机数的滞后阶(译者注:即扣除均值后的部分)。
o (int, optional)  非对称数据的滞后阶
q (int, optional)  波动率或对应变量的滞后阶
power (float, optional)  使用GARCH或相关模型的精度
dist (int, optional) 误差分布的名称,目前支持下列分布:正态分布: 'normal', 'gaussian' (default)学生T分布: 't', 'studentst'偏态学生T分布: 'skewstudent', 'skewt'通用误差分布: 'ged', 'generalized error”
'''
def Arch(data,p_=2,q_=2,o_=1,power_=2.0,vol_='Garch',dist_='StudentsT',title1='对比图',title2='拟合残差',title3='条件方差'):# 设定模型am=arch_model(data, p=p_, q=q_, o=o_,power=power_, vol=vol_, dist=dist_)res = am.fit(update_freq=5, disp='off')print(res.summary())fig = res.hedgehog_plot(type='mean')plt.title(title1,size=15)plt.show()plt.plot(res.resid)plt.title(title2,size=15)plt.show()plt.plot(res.conditional_volatility,color='r')plt.title(title3,size=15)plt.show()

TStest.py

import pandas as pd
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 numpy as np
import matplotlib
import matplotlib.pyplot as pltfrom statsmodels.stats.diagnostic import acorr_ljungbox#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
from matplotlib.pyplot import MultipleLocator
#引入单位根检验
from arch.unitroot import ADF
from statsmodels.graphics.tsaplots import plot_acf, plot_pacfimport numpy as np
import scipy.stats as stats
#避免中文显示不出来
matplotlib.rc("font",family='KaiTi')
#避免负号显示不出来
matplotlib.rcParams['axes.unicode_minus']=False'''
做一个完整检验的大图input:
data:输入y轴数值
lags:延迟
title:标题'''
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),colspan=2)        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()plt.show()    return'''
时间序列稳定性检验,单位根ADFinput:
data:输入y轴数值
name:数值含义output:
Test Statistic : T值,表示T统计量
p-value: p值,表示T统计量对应的概率值
Lags Used:表示延迟
Number of Observations Used: 表示测试的次数
Critical Value 1% : 表示t值下小于 - 4.938690 , 则原假设发生的概率小于1%, 其它的数值以此类推。其中t值和p值是最重要的,其实这两个值是等效的,既可以看t值也可以看p值。
p值越小越好,要求小于给定的显著水平,p值小于0.05,等于0最好。
t值,ADF值要小于t值,1%, 5%, 10% 的三个level,都是一个临界值,如果小于这个临界值,说明拒绝原假设。
1%、%5、%10不同程度拒绝原假设的统计值和ADF Test result的比较,ADF Test result同时小于1%、5%、10%即说明非常好地拒绝该假设.
P-value是否非常接近0.
'''
def TS_ADF(data):print("**************************************************************************")print("**************************************************************************")print("Time Series test————ADF")res=np.array(ADF(data))print(res)print("*************************************************************************")print("*************************************************************************")return res'''
时间序列稳定性检验,自相关检验ACFinput:
data:输入数据结果含义:
ACF 是一个完整的自相关函数,可为我们提供具有滞后值的任何序列的自相关值。
简单来说,它描述了该序列的当前值与其过去的值之间的相关程度。
时间序列可以包含趋势,季节性,周期性和残差等成分。
ACF在寻找相关性时会考虑所有这些成分。
直观上来说,ACF 描述了一个观测值和另一个观测值之间的自相关,包括直接和间接的相关性信息。截尾:在大于某个常数k后快速趋于0为k阶截尾
拖尾:始终有非零取值,不会在k大于某个常数后就恒等于零(或在0附近随机波动)
'''
def TS_ACF(data):plot_acf(data)plt.show()'''
时间序列稳定性检验,偏自相关函数PACFinput:
data:输入数据结果含义:
PACF 是部分自相关函数或者偏自相关函数。
基本上,它不是找到像ACF这样的滞后与当前的相关性,而是找到残差(在去除了之前的滞后已经解释的影响之后仍然存在)与下一个滞后值的相关性。
因此,如果残差中有任何可以由下一个滞后建模的隐藏信息,我们可能会获得良好的相关性,并且在建模时我们会将下一个滞后作为特征。
请记住,在建模时,我们不想保留太多相互关联的特征,因为这会产生多重共线性问题。因此,我们只需要保留相关功能。截尾:在大于某个常数k后快速趋于0为k阶截尾
拖尾:始终有非零取值,不会在k大于某个常数后就恒等于零(或在0附近随机波动)
'''
def TS_PACF(data): plot_pacf(data)plt.show()'''
白噪声检验
'''
def white_test(data,lag=25):print(acorr_ljungbox(data, lags = lag,boxpierce=True))return acorr_ljungbox(data, lags = lag,boxpierce=True)'''
JB检验:
input:
data:输入数据、序列output:
偏度、峰值、JB检验
'''def JBtest(data):# 样本规模nn = data.sizedata_ = data - data.mean()"""M2:二阶中心钜skew 偏度 = 三阶中心矩 与 M2^1.5的比krut 峰值 = 四阶中心钜 与 M2^2 的比"""M2 = np.mean(data_**2)skew =  np.mean(data_**3)/M2**1.5krut = np.mean(data_**4)/M2**2"""计算JB统计量,以及建立假设检验"""JB = n*(skew**2/6 + (krut-3 )**2/24)pvalue = 1 - stats.chi2.cdf(JB,df=2)print("偏度:",stats.skew(data),skew)print("峰值:",stats.kurtosis(data)+3,krut)print("JB检验:",stats.jarque_bera(data))return np.array([JB,pvalue])

股价/期货等时间序列数据的整合检验、Grach建模相关推荐

  1. 多时间序列数据MK突变检验突变点提取

    多时间序列数据MK突变检验突变点提取 需求 代码 结果 需求 之前推送了一篇MK突变分析的文章[Manner-Kendall(M-K)-突变检验],针对的是如何获得单个时间序列数据的突变点,这个时候突 ...

  2. 时间序列数据的白噪声检验

    问题起源 只有数据平稳,才可以借数据. 只有借数据,才可以做分析. 什么是白噪声序列 白噪声序列也称为纯随机序列,它满足两个性质 1)数据是平稳的 2)t≠s的时候,方差为0,说明t和s没有线性的关系 ...

  3. python平稳性检验_时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python)...

    时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python) 发布时间:2019-01-10 00:02, 浏览次数:620 , 标签: Python 导读: 本文介绍了数据平稳 ...

  4. python使用statsmodels包中的adfuller函数执行增强迪基-福勒检验(ADF检验、augmented Dickey-Fuller test)、判断时间序列数据是否平稳

    python使用statsmodels包中的adfuller函数执行增强迪基-福勒检验(ADF检验.augmented Dickey-Fuller test).判断时间序列数据是否平稳(station ...

  5. 计量经济学之时间序列的平稳性、单位根检验、协整检验、时间序列数据的一般处理流程

    时间序列的平稳性 为什么要把时间序列变成平稳的?--平稳性的意义 如何检验时间序列数据的平稳性?--单位根检验 数据不平稳怎么办?--协整检验 单整.协整(cointegration) 协整检验 总结 ...

  6. R语言检验时间序列的平稳性(tseries包adf.test):时间序列数据是zoo或xts对象,使用coredata函数提取原始数据,再将其传递给adf.test函数

    R语言检验时间序列的平稳性(tseries包adf.test):时间序列数据是zoo或xts对象,使用coredata函数提取原始数据,再将其传递给adf.test函数 目录

  7. 独家 | ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)

    作者:夏米莎·查特吉 Sharmistha Chatterjee 翻译:陈之炎 校对:吴金笛 本文约5500字,建议阅读10+分钟. 本文探讨了简单的ARIMA/Sarima与LSTM的时间序列数据集 ...

  8. ARIMA时间序列分析——(一)数据平稳性检验

    时间序列,指的是按时间顺序索引的一系列数据点,是面板数据的一种,属于一维面板数据. 时间序列分析包括用于分析时间序列数据以及提取有意义的统计数据和数据其他特征的方法. ARIMA模型构建流程: 1.判 ...

  9. ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)

    作者:夏米莎·查特吉 Sharmistha Chatterjee ;翻译:陈之炎;校对:吴金笛 本文约5500字,建议阅读10+分钟. 本文探讨了简单的ARIMA/Sarima与LSTM的时间序列数据 ...

  10. python时间序列数据预测教程之 arima

    最近接触时间序列较多,在借鉴很多人的知识之后,特此总结一下.目前关于时间序列数据分析预测大致有三种主流方法: 1.ARIMA系列方法 2.facebook开源的Prophet模型 3.LSTM时间序列 ...

最新文章

  1. 聊一聊ZooKeeper的顺序一致性
  2. iBATIS之父:iBATIS框架的成功蜕变
  3. 从语言模型到Seq2Seq:Transformer如戏,全靠Mask
  4. http报文格式_理解数据通信协议的报文格式有何用?
  5. android 7.0 解锁亮屏,Android7.0亮屏流程分析
  6. 这个韩国女星在节目里吃了“巨型蛤蜊” 可能要坐牢5年了...
  7. 串口通信工具android,Android串口通信工具
  8. Xen 安装ubuntu xen DomU
  9. 属性篇(2)—If you love css …
  10. 这台iPad最适合程序媛吃鸡,号称吃鸡神器!
  11. hdu3491 最小点割集(无向图求最小点割集通用方法)
  12. 最新《JK学院 C语言教程培训 C语言教程+源代码》
  13. 蓝桥杯算法提高 小写转换为大写
  14. 我是一个*** (二)
  15. 「文献解读」利用基因沉默和过表达技术研究棉花的基因功能
  16. android ftdi,从 Android FTDI串行通信开始_ftdi_开发99编程知识库
  17. C语言练习1-判断四根木棍是否可以摆成三角形
  18. Matlab - 产生高斯噪声
  19. Linux上安装MySQl超详细教程(CentOS系统)
  20. 2021年的最后一天

热门文章

  1. python入门之排序,文件操作
  2. 3D打印产业链全景图
  3. asp.net Checkbox 绑定自定义属性
  4. Windows线程生灭 (二)
  5. Flex 学习笔记 提高编译速度
  6. 终结者:终止线程循环的方式
  7. 教你一秒理解setInterval与setTimeout的使用和区别
  8. v8go 库手动编译 v8 golang 库手动编译
  9. 28. 字符串的排列(C++版本)
  10. MySQL 时间戳(timestamp类型)和时间(datetime类型)的获取/相互转换/格式化