回归分析加不加常数项_时间序列分析基础(一)
时间序列分析是量化投资的基础,作为本公众号的开篇,自然要从最基础的讲起。时间序列分析基础将分两个篇幅,第一篇包括时间序列的基本概念、成分与分解、自相关与偏自相关性、以及平稳性。第二篇主要讲一下用于时间序列分析的常用模型。
1.时间序列的概念、成分及分解
维基百科定义:
时间序列(time series)是一组按照时间发生先后顺序进行排列的数据点序列。下面都是时间序列的例子:
时间序列的成分
首先可以尝试分析时间序列的成分。时间序列的成分包括趋势性、季节性波动、随机噪声。时间序列可以用加法形式表示:
在上式中 yt 表示时间序列数据,St 表示季节项,Tt 表示趋势项,Rt 表示残差项。同时也可以写成乘法形式:
分析时间序列的成分可以帮助我们:
更容易预测剔除季节性因素后的时间序列。时间序列在剔除季节项后,可以让我们将更多的精力用在预测趋势上,而不受季节变化的影响,从而使得模型更加准确。
更容易识别季节性特征。
时间序列的分解
那么如何识别时间序列的成分呢,再来谈谈如何分解。常用的分解方法包括:经典法、K11分解法、SEATS分解法和STL分解法(Seasonal and Trend decomposition using Loess)。
以经典法为例解释时间序列的分解过程(其他方法是经典法的改良):
使用移动平均计算 Tt 趋势项
剔除趋势项:yt - Tt
对每个季节剔除趋势项后的值计算均值作为 St 季节项。例如,对于月度数据,三月份的季节项是对所有去除趋势后的三月份的值的平均。然后将这些季节项进行调整,使得它们的加和为 0。季节项是通过将这些各年的数据排列结合在一起而得到的。
剔除趋势项和季节项得到残差项。
时间序列分解的代码实现
statsmodels 中有两个 API 可以实现时间序列的分解,分别为statsmodels.tsa.seasonal.seasonal_decompose 和 statsmodels.tsa.seasonal.STL 。其中seasonal_decompose为经典法,STL为STL分解法。
我这里推荐使用STL对时间序列进行分解,因为:
STL可以应对各种类型的季节项,如小时、周、月、年等
STL不易受异常值的影响
同时 statsmodels 文档在 seasonal_decompose 说明中也给出了建议:
注意事项
关于乘法形式还是加法形式,这里比较麻烦,因为在实际问题中,时间序列可以同时呈现出加法与乘法的特点,如:
代码如下:
数据使用的是BTC月线收盘价。
# STL分解 from statsmodels.tsa.seasonal import STL res = STL(data_monthly['Close']).fit() # # 画图 fig, axes = plt.subplots(4, 1, figsize=(12, 2*4)) res.observed.plot(ax=axes[0], legend=True) res.trend.plot(ax=axes[1], legend=True) res.seasonal.plot(ax=axes[2], legend=True) res.resid.plot(ax=axes[3], legend=True) plt.show()
2.自相关与偏自相关
自相关(Autocorrelation)概念:对一个时间序列,现在值与其过去值的相关性。如果相关性为正,则说明现有趋势将继续保持。
偏自相关(Partial Autocorrelation)概念:可以度量现在值与过去值更纯正的相关性。比如,当我们计算 Xt 与 Xt-1 的相关性时,Xt 可能会受到 Xt-2 的影响,同时 Xt-1 也会受到 Xt-2 的影响。而偏自相关就是用来计算剔除 Xt-2 影响后,Xt 与 Xt-1 的相关性。
偏自相关的通俗计算过程:
有三个自变量X1、X2、X3,一个因变量y:
线性回归建模:通过 X1 和 X2 预测 y,取残差
线性回归建模:通过 X1 和 X2 预测 X3,取残差
由于以上两个残差都剔除了 X1 和 X2 的影响,因此对两个残差取相关性就是 y 与 X3 的偏自相关
代码实现:
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf fig, axes = plt.subplots(2, 1, figsize=(12, 4*2)) # 自相关 plot_acf(data_monthly['Close'],lags=24,title='ACF', ax=axes[0]) # 偏自相关 plot_pacf(data_monthly['Close'],lags=24,title='PACF', ax=axes[1]) plt.show()
3.时间序列的平稳性
时间序列平稳性分为严平稳和弱平稳。其中严平稳要求过于严格,不具备实用价值,本节以弱平稳为讨论对象。
弱平稳的时间序列应当满足以下条件:
均值为常数,不随时间变化;
方差为常数,不随时间变化;
自相关系数为常数,不随时间变化。
图片来源:https://static1.squarespace.com/static/53ac905ee4b003339a856a1d/t/5818f84aebbd1ac01c275bac/1478031479192/?format=750w
时间序列平稳的重要性
平稳的时间序列更容易使用简单的模型建模,而不平稳的时间序列需要更多的参数帮助建模。对于非平稳时间序列(比如有季节性),一种方法是采用之前讲过的时间序列分解,季节期间和非季节期间分开建模或者直接使用机器学习来训练。
非平稳时间序列平稳化的方法
通常使用差分法是不平稳的时间序列平稳。具体见下文代码实现。
平稳性检验
时间序列的平稳性检验——单位根检验,常用方法有:DF检、ADF检验和PP检验。而我们可以直接调用 statsmodel 中的api。
代码实现:
平稳性检验,并对非平稳的时间序列进行差分处理
# ADF检验 from statsmodels.tsa.stattools import adfuller adf = adfuller(data_monthly['Close']) print("p-value of monthly data: {}".format(float(adf[1])))
p-value of monthly data: 0.7714291133372946
p值远大于0.05的显著性水平,该时间序列不平稳。尝试用差分法剔除季节性影响,提高时间序列的平稳性。
首先进行季节性差分
普通差分,进一步降低p值
完成以上两步之后,我们所得到的时间序列已经满足平稳的条件了
# 季节性差分 data_monthly['close_diff'] = data_monthly['Close'] - data_monthly['Close'].shift(12) adf = adfuller(data_monthly['close_diff'].iloc[12:]) print("p-value of seasonal differentiation: {}".format(float(adf[1])))
p-value of seasonal differentiation: 0.3977194646413672
# p值有所下降,我们进一步差分 data_monthly['close_diff2'] = data_monthly['close_diff'] - data_monthly['close_diff'].shift() adf = adfuller(data_monthly['close_diff2'].iloc[13:]) print("p-value of regular differentiation: {}".format(float(adf[1])))
p-value of regular differentiation: 1.8898138872825653e-07
可见在进行两次差分之后,数据已经为平稳的时间序列了。
参考文献:
石川《写给你的金融时间序列分析:初级篇》 https://zhuanlan.zhihu.com/p/38321845
石川《写给你的金融时间序列分析:进阶篇》 https://zhuanlan.zhihu.com/p/38322333
《5 Steps : To get an understanding on Correlation, Auto-Correlation and Partial Auto-Correlation》 https://medium.com/analytics-vidhya/5-steps-to-get-an-understanding-on-correlation-auto-correlation-and-partial-auto-correlation-e71f6b4bba81
statsmodels官方文档
回归分析加不加常数项_时间序列分析基础(一)相关推荐
- 数学建模时间序列分析_时间序列分析建模验证
数学建模时间序列分析 时间序列预测 (Time Series Forecasting) 背景 (Background) This article is the fourth in the series ...
- python时间序列指数平滑预测_时间序列分析预测实战之指数平滑法
一.什么是时间序列分析? 在工作中,常常要对数据进行预测,确定业务未来的发展趋势,进而配置相关的营销策略.制定业务目标,由此引申出了一个重要的用数据预测未来的方法--时间序列分析,今天和大家分享就是实 ...
- python arima模型_时间序列分析 ARIMA模型 Python(2)
最近做了一个时间序列分析的项目.时间序列分析不同于以前的项目--看一下相关的库怎么用,就可以快速上线应用.它是非常需要你的基础知识的,Hamilton关于<时间序列分析>方面的知识,写了厚 ...
- 时间序列 线性回归 区别_时间序列分析的完整介绍(带R)::线性过程I
时间序列 线性回归 区别 In the last tutorial , we saw how we could express the probabilistic form of the best l ...
- covariance matrix r语言_时间序列分析|ARIMAX模型分步骤详解和R中实践
这是关于时间序列的第N篇文章,本文将介绍ARIMAX模型,简单来说就是在ARIMA的基础上增加一个外生变量.ARIMAX和ARIMA相比在理论上没有太多新的内容,所以本文直接介绍在R里怎么一步一步跑A ...
- 浅尝辄止_数学建模(笔记_时间序列分析及其SPSS实现)
本文多是广泛的概念和SPSS运用,没有具体的推导过程和深入的探究 文章目录 一.时间序列分析 1.具体步骤: 二.基本知识 1.时间序列数据 2.时间序列的基本概念 3.时间序列分解 4.叠加模型和乘 ...
- python时间序列分析航空旅人_时间序列分析-ARIMA模型(python)
时间序列概念:在生产和科学研究中,对某一个或者一组变量 进行观察测量,将在一系列时刻 所得到的离散数字组成的序列集合,称之为时间序列.时间序列分析是根据系统观察得到的时间序列数据,通过曲线拟合和参数估 ...
- arima 数据预处理_时间序列分析|ARIMA模型分步骤解析及R中实践
你是否想要做时间序列分析,但却不知道代码怎么写? 你是否不清楚时间序列分析各种模型该在什么情况下使用? 本文将针对以上两个问题,带你入门时间序列分析~ 等等! 不止'入门' 读完这篇,你立即就能在R中 ...
- 应用时间序列分析清华大学出版社电子版_时间序列分析简介
来源:stata答疑 Q1:时间序列数据和时间序列分析 时间序列数据是在特定时间内监测或记录下的有序数据集合.太阳活动.潮汐.股票市场趋势.疾病传播等都是时间序列的典型案例.是指将同一统计指标 ...
最新文章
- ​用 Python 动态可视化,看看比特币这几年
- MSSQL编程笔记四 解决count distinct多个字段的方法
- android listview divider color,android listview 属性
- java判断文件或者文件夹
- java oss 批量传输_初步使用阿里云OSS对象存储功能
- Android JNI简单实例(android 调用C/C++代码)
- codesys com库_CODESYS在线库,酷德网镜像站启用
- 新颖的自我介绍_公众场合,如何做一个吸睛的自我介绍?
- mssql 无法启动调试器 数据为空_Windows无法启动:如何利用PE拯救桌面重要数据?...
- 使用XPO过程中的代码优化
- hc 05 蓝牙c语言程序,ATK-HC05 运用在STM32平台上的HC05蓝牙通信代码用C语言编写 - 下载 - 搜珍网...
- 全网最全的私网多种穿透互联技术解析
- 归因分析笔记13 特征重要度正确性的验证
- 葡萄城报表介绍:自由报表
- ChatGPT版微信个人号搭建流程
- 把那个读书的家伙拉出来游坛示众
- Playbooks 简介
- layui数据表格分页无法正常显示
- 强化学习入门这一篇就够了!!!万字长文
- MODIS各波段介绍、电磁波谱表、可见光红外光微波细分波谱表
热门文章
- python tkinter载入图片_Python的GUI编程
- C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
- subline text3设置中文亲测
- ActiveXObject文件读写
- 血压监测方案之光电容积脉搏波描记法PPG
- 51单片机实现c语言字母滚动,基于51单片机的led点阵滚动显示上下左右c语言程序.docx...
- 查询linux磁盘剩余空间脚本,linux磁盘空间报警脚本
- Unity面试题精选(7)
- 综合实例_为啥要做“三维管线综合”?看个实例就明白
- OpenShift 4 - 为客户端配置使用基于CA证书的kubeconfig实现无密码登录