时间序列分析——函数分解

第一篇 函数分解
函数分解decompose


文章目录

  • 时间序列分析——函数分解
  • 前言
  • 一、函数分解是什么?
  • 二、建立分解函数
    • 1.功能
    • 2.测试函数
  • 总结

前言

这几天一直在深思,如何建立一个和实际比较贴切的金融模型,能反映现实生活?比如我们听到国家又放水了,我们可以预期物价又得上涨了,但是如何通过模型来反映这种相关关系呢?
伙伴杨RC说用EXCEL建了个模型来预测本期深圳车牌竞价,以达到最小的成本拍到车牌,这个想法不错,Good lucky to my brother。
简单的模型可以用EXCEL,复杂的模型就得使用python。
随着人工智能的不断发展,机器学习越来越重要,我们的目标是让机器进行数据分析,发现一些特性和趋势。本文就介绍时间序列分析的基础。


一、函数分解是什么?

说白了就是拆分信号。刚好函数分解和我们想要建立的模型有点吻合:environment大趋势 + company的周期性波动 + market的高斯扰动。
当然后续我们会引入相关性分析、情感分析等要素。

二、建立分解函数

1.功能

分解函数成三部分:趋势、周期、和剩余部分(一般指噪声,均值为0)
分解就是将时序数据分离成不同的成分,分解有:长期趋势Trend、季节性seasonality和随机残差residuals
返回包含三个部分 trend(趋势部分) , seasonal(季节性部分) 和residual (残留部分)
传入:一个序列,可以是时间序列
输出:趋势、周期、和剩余部分 三部分
函数详解地址:链接
所以,我们建立一个python文件,命名为compose.py ,方便后续函数进行调用。
代码如下:

# 功能:分解函数成三部分:趋势、周期、和剩余部分(一般指噪声)
# 分解就是将时序数据分离成不同的成分,分解有:长期趋势Trend、季节性seasonality和随机残差residuals
# 返回包含三个部分 trend(趋势部分) , seasonal(季节性部分) 和residual (残留部分)
# 创建时间:2021-01-15
# 传入:一个序列
# 输出:趋势、周期、和剩余部分 三部分
# 函数详解地址:https://machinelearningmastery.com/decompose-time-series-data-trend-seasonality/
from statsmodels.tsa.seasonal import seasonal_decompose
import matplotlib.pyplot as pltdef decompose(timeseries,frequence):# 传入数列和频率数# 返回包含三个部分 trend(趋势部分) , seasonal(季节性部分) 和residual (残留部分)# statsmodels也支持两类分解模型,加法模型和乘法模型,model的参数设置为"additive"(加法模型)和"multiplicative"(乘法模型)。# period:int, optional,系列的时期。如果x不是pandas对象或x的索引没有频率,则必须使用。如果x是具有时间序列索引的pandas对象,则覆盖x的默认周期性# decomposition = seasonal_decompose(timeseries,model='multiplicative',freq=frequence)decomposition = seasonal_decompose(timeseries, model='additive', freq=frequence)trend = decomposition.trendseasonal = decomposition.seasonalresidual = decomposition.resid# 画图参数fig = plt.figure()ax1 = fig.add_subplot(411)ax1.plot(timeseries, label='Original')ax1.legend(loc='best')ax2 = fig.add_subplot(412)ax2.plot(trend, label='Trend')ax2.legend(loc='best')ax3 = fig.add_subplot(413)ax3.plot(seasonal, label='Seasonality')ax3.legend(loc='best')ax4 = fig.add_subplot(414)ax4.plot(residual, label='Residuals')ax4.legend(loc='best')fig.tight_layout()plt.show(block=False)return trend, seasonal, residual

2.测试函数

我们先合成一个:趋势 + 周期性波动 + 高斯扰动的函数,测试我们的compose函数能否成功分解。
测试函数如下:

import matplotlib.pyplot as plt
import numpy as np
import math
from math import *
import pandas as pd
from decompose import *plt.rcParams['font.sans-serif']=['SimHei']  #解决中文乱码
plt.rcParams['axes.unicode_minus'] = Falsextime = np.arange(1,1000,1)
xnorm = xtime/len(xtime)queshi = 2*xnorm +1
fig1 = plt.figure()
ax1 = fig1.add_subplot(412)
ax1.plot(xtime,queshi, label='趋势')
ax1.legend(loc='best')zouqi = [sin(x*20*math.pi) for x in xnorm]
ax2 = fig1.add_subplot(413)
ax2.plot(zouqi, label='周期')
ax2.legend(loc='best')noize = 0.02*np.random.normal(size=xtime.size)
ax3 = fig1.add_subplot(414)
ax3.plot(noize, label='噪声')
ax3.legend(loc='best')signal = queshi+zouqi+noize
ax4 = fig1.add_subplot(411)
ax4.plot(signal, label='合成信号')
ax4.legend(loc='best')fig1.tight_layout()
plt.show(block=False)signal = pd.Series(signal).astype('float')
trend , seasonal, residual = decompose(signal,frequence = 200)
plt.show()

生成合成函数如下:

分解函数结果如下:

可以看出完全分解还原了我们模拟的信号。
这里需要注意的是:我们提前知道了输入序列的周期,所以可以完美拆分,如果我们把周期信号填错了,那么结果又会出现非常大的偏差。
比如本次合成信号的周期是100的整数倍,如果我们输成了150,那会是怎么样?

signal = pd.Series(signal).astype('float')
trend , seasonal, residual = decompose(signal,frequence = 150)

分解结果:

可以看到,此时趋势不同了,周期函数的权重降低了,本该是噪音的信号,现在变得很强。模型已经开始失真。
如果我们用33这个周期去测试,结果会是怎样?

trend , seasonal, residual = decompose(signal,frequence = 33)


结果如下:周期信号基本成了噪音,趋势信号已经糅合和其他信号,市场扰动也不明显了。
因此对信号的周期的确定,有至关重要的作用。
下篇我们将探寻如何寻找时间序列的周期。


总结

每个G民都觉得自己是G神,实际上只是布朗运动中的一份子,高斯白噪声中的一个噪点而已。
没有谁能预测未来。未来是属于未来的。

时间序列分析之:函数分解decompose相关推荐

  1. KDD 2018 | 小波分解网络用于可解释的时间序列分析

    关注微信公众号"时序人"获取更好的阅读体验 时间序列学术前沿 NeurIPS 2020 | 时间序列相关论文一览 ICML 2020 | 时间序列相关论文一览 KDD 2020 | ...

  2. 时间序列、时间序列分析、时间序列效应分解、平稳时间序列、AIC和BIC

    时间序列.时间序列分析.时间序列效应分解.平稳时间序列.AIC和BIC 目录 时间序列.时间序列分析.时间序列效应分解.平稳时间序列.AIC和BIC

  3. 独家 | Python时间序列分析:一项基于案例的全面指南

    作者: Selva Prabhakaran 翻译:陈超校对:王可汗本文约7500字,建议阅读20+分钟本文介绍了时间序列的定义.特征并结合实例给出了时间序列在Python中评价指标和方法. 时间序列是 ...

  4. 时间序列分析及应用r语言pdf_R语言:时间序列经典分析法(二)

    题记:本文是个人的读书笔记,仅用于学习交流使用.本文将深入研究时间序列技术. 01 解决什么问题? 前面一章,介绍了时间序列中涉及到的基本概念,本章将在此基础上介绍如何对时间序列的资料进行分析,怎么选 ...

  5. 语言时间序列年月日_R语言系列 时间序列分析

    [免责声明:本文用于教学] 时间序列分析 基础操作 数据输入 d <- c(10,15,10,10,12,10,7,7,10,14,8,17,14,18,3,9,11,10,6,12,14,10 ...

  6. 【转】时间序列分析——基于R,王燕

    <时间序列分析--基于R>王燕,读书笔记 笔记: 一.检验: 1.平稳性检验: 图检验方法: 时序图检验:该序列有明显的趋势性或周期性,则不是平稳序列 自相关图检验:(acf函数)平稳序列 ...

  7. R时间序列分析|SP500股指的ARIMA模型预测与残差ARCH效应分析

    R时间序列分析|S&P500股指的ARIMA模型预测与残差ARCH效应分析 前言 一.数据及分析目的 二.数据探索 三.ARIMA模型构建 四.残差分析 五.模型预测 前言 由于R语言对新手并 ...

  8. 【Python】时间序列分析

    I. 数据探索 1. 趋势分解 def decompose(timeseries,p=7):'''时间序列趋势分解的函数,timeseries是所需要分析的时序数据,p是需要确认的周期性的期数'''f ...

  9. 数据分析-时间序列分析

    时间序列分析和预测,举几个栗子:用优衣K在天猫的连续n年的销售数据,对双12的销售量进行预测.用阿里妈妈的站内站外媒体投放的监测数据,预估宝J在双12广告投放的效果.这些问题中数据的共同特点是序列中的 ...

最新文章

  1. angular学习笔记(二十五)-$http(3)-转换请求和响应格式
  2. 电脑开机一会就蓝屏怎么回事_常见的电脑蓝屏是怎么回事?学会三种解决方法,远离电脑维修店...
  3. Storm 04_Storm单机模式搭建完全分布式安装部署集群drpc
  4. 12如何隐藏dock栏_iPhone边框“变色”壁纸,隐藏Dock栏
  5. altium designer 10哪个作者写的好 。
  6. 5006.c++类中使用static变量bug
  7. 【原创】 Boost序列化自己手写实现简易版
  8. eigrp配置实验_来,太阁带你做实验
  9. DataSet.Tables[].Rows[][]的用法
  10. C#匿名委托,匿名函数,lambda表达式
  11. 割平面法 matlab,割平面法matlab
  12. ASUS AURA无法启动问题
  13. PSAM卡、SAM卡、SIM卡
  14. android最新仿微信表情面板,Android高仿微信表情输入与键盘输入详解
  15. Qt Model/View 学习(6) - Delegate教程之——渲染
  16. 使用ARCGIS多重缓冲区分析工具建立颜色渐变行政边界
  17. 单日峰值2T发送量邮件营销平台实践经验
  18. Laravel填充数据Seeder出现Target class [***] does not exist.
  19. 微软Win10彻底封杀exFAT/FAT32磁盘,格式化只剩NTFS/REFS
  20. 度过漫长又艰辛的 2020 年,我收集了 1273 人的年度感悟

热门文章

  1. 浙大计算机系学霸,国内三个“图灵班”,学霸中的尖子才能考得上,全是计算机人才!...
  2. java中对象的生存期_Java中对象的生存周期
  3. java web modules_使用Java web工程建立Maven Web Module工程
  4. linux mysql设置数据库utf_设置mysql数据库 utf8
  5. 上海找python工作容易吗_Python程序员去上海工作有多难?
  6. 在Matlab命令窗口中执行,交互式命令操作就是在MATLAB命令行窗口中输入命令并执行。...
  7. php 转义取消,php如何取消转义
  8. linux+mysql高并发测试_MySQL压力测试shell脚本
  9. 如何设置取消小票的二维码
  10. 【翻译】卡通图解DNS,你的信息怎么被泄露的?