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))
点击标题查阅往期内容
对用电负荷时间序列数据进行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')
箱线图/盒图
盒图能够帮助我们对数据进行分组和理解其分布。对于季节性数据来说往往非常有用。
sns.set(rc={'figure.figsize':(32, 18)}) sns.boxplot(data=apple_price_recent_history, x='quarter', y='close').s
在 Pandas 中分析时间序列数据
时间序列分析方法可以分为两类:
- 频域方法
- 时域方法
频域方法分析信号在频率带(如最后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(
时间序列堆叠图进行周期分析
fig = plt.figure(figsize=(32,18)) ax1 = fig.add_subplot(1,1,1) lsharey=True) ax1.legend(legend)
分解时间序列数据
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)})
时间序列的平稳性
时间序列与传统的分类和回归预测建模问题不同。时间序列数据是有序的,并且需要平稳性才能进行有意义的摘要统计。
平稳性是时间序列分析中许多统计过程的假设,非平稳数据经常被转化为平稳数据。
平稳性有以下几种分类:
- 平稳过程/模型:平稳的观察序列。
- 趋势平稳:不呈现趋势。
- 季节平稳:不呈现季节性。
- 严格平稳:数学定义的平稳过程。
在一个平稳的时间序列中,时间序列的均值和标准差是恒定的。此外,没有季节性、周期性或其他与时间相关的结构。通常首先查看时间序列是否平稳,以更容易理解。
# 平稳序列 vol = .002 df1.plot(title=
df2.plot(t
np.logspace(1,2,num=200, dtype=int)) df3.plot(title')
df4[0] = df4[0] + df4['cyclical'] df4[0].plot(title=')
如何检验平稳性
我们可以通过直观地检查上述图形来测试平稳性,就像之前所做的那样;将图形分成多个部分,查看均值、方差和相关性等摘要统计数据;或者使用更高级的方法,如增广迪基-富勒检验(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}')
上述示例运行后打印出的测试统计值分别为 0.00(平稳)和 0.88(非平稳)。
如何处理非平稳时间序列
如果时间序列中存在明显的趋势和季节性,可以对这些组成部分进行建模,将它们从观测值中剔除,然后在残差上训练模型。
去趋势化
有多种方法可以从时间序列中去除趋势成分。
- 减去最佳拟合直线
- 使用分解进行减法
- 使用滤波器进行减法
滤波器
使用 SciPy 进行最佳拟合直线
SciPy 的 detrend 函数可以通过减去最佳拟合直线来移除趋势。
detrend = signal.detrend(df[0].values) plt.plot(detrend)
使用 StatsModels 进行分解
seasonal_decompose 函数返回一个带有季节性、趋势和残差属性的对象,我们可以从系列值中减去它们。
from statsmodels.tsa.seasonal import seasonal_decompose from dateutil.parser import parse df[0].plot(figsize=(32,18))
df[0] = df[0] - decompose.trend df[0].plot(figsize=(32,18))