时间序列分析是量化投资的基础,作为本公众号的开篇,自然要从最基础的讲起。时间序列分析基础将分两个篇幅,第一篇包括时间序列的基本概念、成分与分解、自相关与偏自相关性、以及平稳性。第二篇主要讲一下用于时间序列分析的常用模型。

1.时间序列的概念、成分及分解

维基百科定义:

时间序列(time series)是一组按照时间发生先后顺序进行排列的数据点序列。下面都是时间序列的例子:

时间序列的成分

首先可以尝试分析时间序列的成分。时间序列的成分包括趋势性、季节性波动、随机噪声。时间序列可以用加法形式表示:

在上式中 yt 表示时间序列数据,St 表示季节项,Tt 表示趋势项,Rt 表示残差项。同时也可以写成乘法形式:

分析时间序列的成分可以帮助我们:

  1. 更容易预测剔除季节性因素后的时间序列。时间序列在剔除季节项后,可以让我们将更多的精力用在预测趋势上,而不受季节变化的影响,从而使得模型更加准确。

  2. 更容易识别季节性特征。

时间序列的分解

那么如何识别时间序列的成分呢,再来谈谈如何分解。常用的分解方法包括:经典法、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对时间序列进行分解,因为:

  1. STL可以应对各种类型的季节项,如小时、周、月、年等

  2. 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的显著性水平,该时间序列不平稳。尝试用差分法剔除季节性影响,提高时间序列的平稳性。

  1. 首先进行季节性差分

  2. 普通差分,进一步降低p值

  3. 完成以上两步之后,我们所得到的时间序列已经满足平稳的条件了

 # 季节性差分 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官方文档

回归分析加不加常数项_时间序列分析基础(一)相关推荐

  1. 数学建模时间序列分析_时间序列分析建模验证

    数学建模时间序列分析 时间序列预测 (Time Series Forecasting) 背景 (Background) This article is the fourth in the series ...

  2. python时间序列指数平滑预测_时间序列分析预测实战之指数平滑法

    一.什么是时间序列分析? 在工作中,常常要对数据进行预测,确定业务未来的发展趋势,进而配置相关的营销策略.制定业务目标,由此引申出了一个重要的用数据预测未来的方法--时间序列分析,今天和大家分享就是实 ...

  3. python arima模型_时间序列分析 ARIMA模型 Python(2)

    最近做了一个时间序列分析的项目.时间序列分析不同于以前的项目--看一下相关的库怎么用,就可以快速上线应用.它是非常需要你的基础知识的,Hamilton关于<时间序列分析>方面的知识,写了厚 ...

  4. 时间序列 线性回归 区别_时间序列分析的完整介绍(带R)::线性过程I

    时间序列 线性回归 区别 In the last tutorial , we saw how we could express the probabilistic form of the best l ...

  5. covariance matrix r语言_时间序列分析|ARIMAX模型分步骤详解和R中实践

    这是关于时间序列的第N篇文章,本文将介绍ARIMAX模型,简单来说就是在ARIMA的基础上增加一个外生变量.ARIMAX和ARIMA相比在理论上没有太多新的内容,所以本文直接介绍在R里怎么一步一步跑A ...

  6. 浅尝辄止_数学建模(笔记_时间序列分析及其SPSS实现)

    本文多是广泛的概念和SPSS运用,没有具体的推导过程和深入的探究 文章目录 一.时间序列分析 1.具体步骤: 二.基本知识 1.时间序列数据 2.时间序列的基本概念 3.时间序列分解 4.叠加模型和乘 ...

  7. python时间序列分析航空旅人_时间序列分析-ARIMA模型(python)

    时间序列概念:在生产和科学研究中,对某一个或者一组变量 进行观察测量,将在一系列时刻 所得到的离散数字组成的序列集合,称之为时间序列.时间序列分析是根据系统观察得到的时间序列数据,通过曲线拟合和参数估 ...

  8. arima 数据预处理_时间序列分析|ARIMA模型分步骤解析及R中实践

    你是否想要做时间序列分析,但却不知道代码怎么写? 你是否不清楚时间序列分析各种模型该在什么情况下使用? 本文将针对以上两个问题,带你入门时间序列分析~ 等等! 不止'入门' 读完这篇,你立即就能在R中 ...

  9. 应用时间序列分析清华大学出版社电子版_时间序列分析简介

    来源:stata答疑 Q1:时间序列数据和时间序列分析     时间序列数据是在特定时间内监测或记录下的有序数据集合.太阳活动.潮汐.股票市场趋势.疾病传播等都是时间序列的典型案例.是指将同一统计指标 ...

最新文章

  1. ​用 Python 动态可视化,看看比特币这几年
  2. MSSQL编程笔记四 解决count distinct多个字段的方法
  3. android listview divider color,android listview 属性
  4. java判断文件或者文件夹
  5. java oss 批量传输_初步使用阿里云OSS对象存储功能
  6. Android JNI简单实例(android 调用C/C++代码)
  7. codesys com库_CODESYS在线库,酷德网镜像站启用
  8. 新颖的自我介绍_公众场合,如何做一个吸睛的自我介绍?
  9. mssql 无法启动调试器 数据为空_Windows无法启动:如何利用PE拯救桌面重要数据?...
  10. 使用XPO过程中的代码优化
  11. hc 05 蓝牙c语言程序,ATK-HC05 运用在STM32平台上的HC05蓝牙通信代码用C语言编写 - 下载 - 搜珍网...
  12. 全网最全的私网多种穿透互联技术解析
  13. 归因分析笔记13 特征重要度正确性的验证
  14. 葡萄城报表介绍:自由报表
  15. ChatGPT版微信个人号搭建流程
  16. 把那个读书的家伙拉出来游坛示众
  17. Playbooks 简介
  18. layui数据表格分页无法正常显示
  19. 强化学习入门这一篇就够了!!!万字长文
  20. MODIS各波段介绍、电磁波谱表、可见光红外光微波细分波谱表

热门文章

  1. python tkinter载入图片_Python的GUI编程
  2. C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
  3. subline text3设置中文亲测
  4. ActiveXObject文件读写
  5. 血压监测方案之光电容积脉搏波描记法PPG
  6. 51单片机实现c语言字母滚动,基于51单片机的led点阵滚动显示上下左右c语言程序.docx...
  7. 查询linux磁盘剩余空间脚本,linux磁盘空间报警脚本
  8. Unity面试题精选(7)
  9. 综合实例_为啥要做“三维管线综合”?看个实例就明白
  10. OpenShift 4 - 为客户端配置使用基于CA证书的kubeconfig实现无密码登录