Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化(下)

简介: Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化

Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化(上):https://developer.aliyun.com/article/1498624


滚动窗口平滑和移动平均


pandas.DataFrame.rolling 让我们将数据拆分为聚合的窗口,并应用诸如均值或总和之类的函数。

在交易中的一个典型例子是使用50天和200天的移动平均线来买入和卖出资产。

让我们计算苹果公司的这些指标。请注意,在计算滚动均值之前,我们需要有50天的数据。

apple_price_history_recent[['close', 'rolling_50', 'rolling_200']].plot(title='Apple vs. 50SMA & 200SMA', figsize=(32,18))

image.png

点击标题查阅往期内容


对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归


01

02

03

04



使用Matplotlib可视化时间序列数据


Matplotlib使我们可以轻松地可视化Pandas时间序列数据。Seaborn添加了额外的选项,帮助我们使图表更加漂亮。我们导入matplotlib和seaborn来尝试几个基本的例子。

折线图

sns.lineplot 绘制标准折线图。它的工作方式类似于我们上面使用的dataframe.plot。

ax=ax).set_title("Apple Stock Price History")
Text(0.5, 1.0, 'Apple Stock Price History')

image.png

箱线图/盒图

盒图能够帮助我们对数据进行分组和理解其分布。对于季节性数据来说往往非常有用。

sns.set(rc={'figure.figsize':(32, 18)})
sns.boxplot(data=apple_price_recent_history, x='quarter', y='close').s

image.png

image.png

在 Pandas 中分析时间序列数据

时间序列分析方法可以分为两类:

  1. 频域方法
  2. 时域方法

频域方法分析信号在频率带(如最后100个样本)上的变化程度。时域方法分析信号在指定时间段(如前100秒)内的变化程度。

时间序列趋势、季节性和周期性

时间序列数据可以分解为四个组成部分:

  • 趋势
  • 季节性
  • 周期性
  • 噪声

并不是所有的时间序列都具有趋势、季节性或周期性;而且必须有足够的数据支持存在季节性、周期性或趋势。

并不是所有的时间序列必须呈现趋势或模式,它们也可能完全是随机的。

除了高频变动(如季节性和噪声)外,时间序列数据通常还会呈现渐变的变异性。通过在不同时间尺度上进行滚动平均可以很容易地可视化这些趋势。让我们导入苹果公司的销售数据以研究季节性和趋势。

趋势

趋势指的是时间序列中存在上升或下降斜率的情况。亚马逊的销售增长就是上升趋势的一个例子。此外,趋势不一定是线性的。趋势可以是确定性的,是时间的函数,也可以是随机的。

季节性

季节性指的是一年内在固定时间间隔内观察到的明显重复模式,包括峰值和低谷。苹果公司的销售在第四季度达到峰值就是亚马逊收入中的一个季节性模式的例子。

周期性

周期性指的是在不规则时间间隔内观察到的明显重复模式,如商业周期。

让我们分析苹果公司的收入历史数据,看看能否进行分解。

import urllib
import pandas as pd
from scipy import stats
                                   + apple_revenue_history['fiscal_period'].str.upper()
slope, intercept, r_value, p_value, std_err = stats.linregress(apple_revenue_history.index,

时间序列趋势图与趋势线

fig = plt.figure(figsize=(32,18))
ax1 = fig.add_subplot(1,1,1)
apple_revenue_history.plot(

image.png

时间序列堆叠图进行周期分析

fig = plt.figure(figsize=(32,18))
ax1 = fig.add_subplot(1,1,1)
lsharey=True)
ax1.legend(legend)

image.png

分解时间序列数据

statsmodel可以将时间序列统计分解为其组成部分。

apple_revenue_history.index = apple_revenue_history.index.to_timestamp(freq='Q')
# 加法分解
result_add = seasonal_decompose(apple_revenue_history['value'])
# 绘图
plt.rcParams.update({'figure.figsize': (32,18)})

image.png

时间序列的平稳性

时间序列与传统的分类和回归预测建模问题不同。时间序列数据是有序的,并且需要平稳性才能进行有意义的摘要统计。

平稳性是时间序列分析中许多统计过程的假设,非平稳数据经常被转化为平稳数据。

平稳性有以下几种分类:

  • 平稳过程/模型:平稳的观察序列。
  • 趋势平稳:不呈现趋势。
  • 季节平稳:不呈现季节性。
  • 严格平稳:数学定义的平稳过程。

在一个平稳的时间序列中,时间序列的均值和标准差是恒定的。此外,没有季节性、周期性或其他与时间相关的结构。通常首先查看时间序列是否平稳,以更容易理解。

# 平稳序列
vol = .002
df1.plot(title=

image.png

df2.plot(t

image.png


np.logspace(1,2,num=200, dtype=int))
df3.plot(title')

image.png

df4[0] = df4[0] + df4['cyclical']
df4[0].plot(title=')

image.png

如何检验平稳性

我们可以通过直观地检查上述图形来测试平稳性,就像之前所做的那样;将图形分成多个部分,查看均值、方差和相关性等摘要统计数据;或者使用更高级的方法,如增广迪基-富勒检验(Augmented Dickey-Fuller test)。

增广迪基-富勒测试用于测试是否存在单位根。如果时间序列有单位根,则表示存在一些时间相关结构,即时间序列不是平稳的。

统计量越负值,时间序列越有可能是平稳的。一般来说,如果 p 值 > 0.05,则数据有单位根,不是平稳的。让我们使用 statsmodel 进行检验。

import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import adfuller
     print('Critial Values:')
     print(f'   {key}, {value:.2f}')

image.png

上述示例运行后打印出的测试统计值分别为 0.00(平稳)和 0.88(非平稳)。

如何处理非平稳时间序列

如果时间序列中存在明显的趋势和季节性,可以对这些组成部分进行建模,将它们从观测值中剔除,然后在残差上训练模型。

去趋势化

有多种方法可以从时间序列中去除趋势成分。

  1. 减去最佳拟合直线
  2. 使用分解进行减法
  3. 使用滤波器进行减法

滤波器

使用 SciPy 进行最佳拟合直线

SciPy 的 detrend 函数可以通过减去最佳拟合直线来移除趋势。

detrend = signal.detrend(df[0].values)
plt.plot(detrend)

image.png

使用 StatsModels 进行分解

seasonal_decompose 函数返回一个带有季节性、趋势和残差属性的对象,我们可以从系列值中减去它们。

from statsmodels.tsa.seasonal import seasonal_decompose
from dateutil.parser import parse
df[0].plot(figsize=(32,18))

image.png

df[0] = df[0] - decompose.trend
df[0].plot(figsize=(32,18))

image.png

相关文章
|
12天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
22 1
|
13天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
13天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
12天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
22 0
|
7天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
6天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
7天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
8天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
7天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
8天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。