首页 > 编程语言 > Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化

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

时间:2023-09-04 23:22:15浏览次数:97  
标签:Python Series 日期 可视化 频率 序列 时间 平稳性 dt

全文链接:https://tecdat.cn/?p=33550

原文出处:拓端数据部落公众号

什么是时间序列?

时间序列是一系列按时间顺序排列的观测数据。数据序列可以是等间隔的,具有特定频率,也可以是不规则间隔的,比如电话通话记录。

在进行投资和交易研究时,对于时间序列数据及其操作要有专业的理解。本文将重点介绍如何使用Python和Pandas帮助客户进行时间序列分析来分析股票数据。

理解日期时间和时间差

在我们完全理解Python中的时间序列分析之前,了解瞬时、持续时间和时间段的差异非常重要。

类型 描述 例子
日期(瞬时) 一年中的某一天 2019年9月30日,2019年9月30日
时间(瞬时) 时间上的单个点 6小时,6.5分钟,6.09秒,6毫秒
日期时间(瞬时) 日期和时间的组合 2019年9月30日06:00:00,2019年9月30日上午6:00
持续时间 两个瞬时之间的差异 2天,4小时,10秒
时间段 时间的分组 2019第3季度,一月

Python的Datetime模块

datetime模块提供了在简单和复杂方式下进行日期和时间操作的类。

创建瞬时

日期日期时间时间都是单独的类,我们可以通过多种方式创建它们,包括直接创建和通过字符串解析。

   

now = datetime.datetime.today()
today = datetime.date.today()

print(now)
print(today)

创建持续时间

timedeltas 表示时间的持续时间。它们可以与时间点相加或相减。

  python

past = now - alldelta
print(type(future))
print(future)
print(type(past))
print(past)

访问日期时间属性

类和对象属性可以帮助我们分离出我们想要看到的信息。我列出了最常见的属性,但你可以在datetime模块的文档上找到详尽的列表。

类/对象 属性 描述
共享类属性 class.min 可表示的最早日期、datetime、time
  class.max 可表示的最晚日期、datetime、time
  class.resolution 两个日期、datetimes 或 times 之间的最小差值
日期/日期时间 object.year 返回年份
  object.month 返回月份(1 - 12)
  object.day 返回日期(1-32)
时间/日期时间 object.hour 返回小时(0-23)
  object.minute 返回分钟(0-59)
  object.second 返回秒数(0-59)
  python
print(datetime.datetime.min)
print(datetime.datetime.max)
print(datetime1.microsecond)

在Pandas中创建时间序列

让我们获取由Intrinio开发者沙盒提供的苹果股票历史数据。

  python

  apple_price_history = pd.read_csv(f)

apple_price_history[['open', 'high', 'low', 'close', 'volume']].head()

image.png

让我们查看数据框的数据类型或 dtypes,看看是否有任何日期时间信息。

让我们将数据框的 RangeIndex 更改为 DatetimeIndex。为了好看,我们将展示如何使用 read_csv 用 DatetimeIndex 读取数据。

  python
apptime64)
apple_price_history.dtypes

image.png

  python

print(apple_price_history[['open', 'high', 'low', 'close']].head())
apple_price_history.index[0:10]

image.png

  python
import numpy as np
import urllib.request


                                    index_col='date',
                                    usecols=['date',
                                             'adj_open',
                                             'adj_high',
                                             'adj_low',
                                             'adj_close',
                                             'adj_volume'])
apple_price_history.columns = names

print(apple_price_history.head())

image.png

添加日期时间字符串

通常,日期的格式可能是无法解析的。我们可以使用dt.strftime将字符串转换为日期。在创建 sp500数据集 时,我们使用了strptime

sp500.loc[:,'date'].apply(lambda x: datetime.strptime(x,'%Y-%m-%d'))

时间序列选择

按日、月或年选择日期时间

现在我们可以使用索引和loc轻松选择和切片日期。

   

apple_price_history.loc['2018-6-1']

image.png

使用日期时间访问器

dt访问器具有多个日期时间属性和方法,可以应用于系列的日期时间元素上,这些元素在Series API文档中可以找到。

属性 描述
Series.dt.date 返回包含Python datetime.date对象的numpy数组(即,没有时区信息的时间戳的日期部分)。
Series.dt.time 返回datetime.time的numpy数组。
Series.dt.timetz 返回还包含时区信息的datetime.time的numpy数组。
Series.dt.year 日期的年份。
Series.dt.month 月份,其中一月为1,十二月为12。
Series.dt.day 日期的天数。
Series.dt.hour 时间的小时。
Series.dt.minute 时间的分钟。
Series.dt.second 时间的秒数。
Series.dt.microsecond 时间的微秒数。
Series.dt.nanosecond 时间的纳秒数。
Series.dt.week 年的星期序数。
Series.dt.weekofyear 年的星期序数。
Series.dt.dayofweek 星期几,星期一为0,星期日为6。
Series.dt.weekday 星期几,星期一为0,星期日为6。
Series.dt.dayofyear 年的第几天的序数。
Series.dt.quarter 季度。
Series.dt.is_month_start 表示日期是否为月的第一天。
Series.dt.is_month_end 表示日期是否为月的最后一天。
Series.dt.is_quarter_start 表示日期是否为季度的第一天。
Series.dt.is_quarter_end 表示日期是否为季度的最后一天。
Series.dt.is_year_start 表示日期是否为年的第一天。
Series.dt.is_year_end 表示日期是否为年的最后一天。
Series.dt.is_leap_year 表示日期是否为闰年。
Series.dt.daysinmonth 月份中的天数。
Series.dt.days_in_month 月份中的天数。
Series.dt.tz 返回时区(如果有)。
Series.dt.freq  

 

方法 描述
Series.dt.to_period(self, *args, **kwargs) 将数据转换为特定频率的PeriodArray/Index。
Series.dt.to_pydatetime(self) 将数据返回为本机Python datetime对象的数组。
Series.dt.tz_localize(self, *args, **kwargs) 将时区非感知的Datetime Array/Index本地化为时区感知的Datetime Array/Index。
Series.dt.tz_convert(self, *args, **kwargs) 将时区感知的Datetime Array/Index从一个时区转换为另一个时区。
Series.dt.normalize(self, *args, **kwargs) 将时间转换为午夜。
Series.dt.strftime(self, *args, **kwargs) 使用指定的日期格式转换为索引。
Series.dt.round(self, *args, **kwargs) 对数据执行舍入操作,将其舍入到指定的频率。
Series.dt.floor(self, *args, **kwargs) 对数据执行floor操作,将其舍入到指定的频率。
Series.dt.ceil(self, *args, **kwargs) 对数据执行ceil操作,将其舍入到指定的频率。
Series.dt.month_name(self, *args, **kwargs) 返回具有指定区域设置的DateTimeIndex的月份名称。
Series.dt.day_name(self, *args, **kwargs) 返回具有指定区域设置的DateTimeIndex的星期几名称。

周期

   

print(df.dt.quarter)
print(df.dt.day_name())

image.png

DatetimeIndex包括与dt访问器大部分相同的属性和方法。

   
apple_price_history.index.day_name()

image.png

频率选择

当时间序列是均匀间隔的时,可以在Pandas中与频率关联起来。

pandas.date_range 是一个函数,允许我们创建一系列均匀间隔的日期。

   
dates = pd.date_range('2019-01-01', '2019-12-31', freq='D')
dates

image.png

除了指定开始或结束日期外,我们可以用一个周期来替代,并调整频率。

   

hours = pd.date_range('2019-01-01', periods=24, freq='H')
print(hours)

image.png

pandas.DataFrame.asfreq 返回具有新频率的数据帧或序列。对于数据中缺失的时刻,将添加新行并用NaN填充,或者使用我们指定的方法填充。通常需要提供偏移别名以获得所需的时间频率。

别名

别名 描述
B 工作日频率
C 定制的工作日频率
D 日历日频率
W 周频率
M 月底频率
SM 半月末频率(每月15日和月末)
BM 工作日月末频率
CBM 定制的工作日月末频率
MS 月初频率
SMS 半月初频率(每月1日和15日)
BMS 工作日月初频率
CBMS 定制的工作日月初频率
Q 季末频率
BQ 工作日季末频率
QS 季初频率
BQS 工作日季初频率
A, Y 年末频率
BA, BY 工作日年末频率
AS, YS 年初频率
BAS, BYS 工作日年初频率
BH 工作小时频率
H 小时频率
T, min 分钟频率
S 秒频率
L, ms 毫秒
U, us 微秒
N 纳秒
   

print(apple_quarterly_history.head())

image.png

填充数据

pandas.Series.asfreq 允许我们提供一个填充方法来替换NaN值。

   
print(apple_price_history['close'].asfreq('H', method='ffill').head())

image.png

重新采样:上采样和下采样

pandas.Dataframe.resample 返回一个重新取样对象,与groupby对象非常相似,可以在其上运行各种计算。

我们经常需要降低(下采样)或增加(上采样)时间序列数据的频率。如果我们有每日或每月的销售数据,将其降采样为季度数据可能是有用的。或者,我们可能希望上采样我们的数据以匹配另一个用于进行预测的系列的频率。上采样较少见,并且需要插值。

   

print(apple_quarterly_history.agg({'high':'max', 'low':'min'})[:5])

image.png

现在我们可以使用我们上面发现的所有属性和方法。

   

print(apple_price_history.index.day_name())
   

Index(['Friday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
       'Monday', 'Tuesday', 'Wednesday', 'Friday',
       ...
       'Wednesday', 'Thursday', 'Friday', 'Monday', 'Tuesday', 'Wednesday',
       'Thursday', 'Friday', 'Monday', 'Tuesday'],
      dtype='object', name='date', length=9789)
   

print(datetime.to_period('Q'))
datetime.to_period('Q').end_time

image.png

滚动窗口平滑和移动平均

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

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

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

   

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

下载 (2).png

使用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

箱线图/盒图

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

  python

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,
  

时间序列趋势图与趋势线

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

apple_revenue_history.plot(

image.png

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

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

image.png

分解时间序列数据

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

  python

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

时间序列的平稳性

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

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

平稳性有以下几种分类:

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

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

  python
# 平稳序列
vol = .002

df1.plot(title='平稳序列')

image.png

  python

df2.plot(title='非平稳序列:均值不恒定')

image.png

  python
np.logspace(1,2,num=200, dtype=int))
df3.plot(title='非平稳序列:波动性不恒定')

image.png

  python

df4[0] = df4[0] + df4['cyclical']
df4[0].plot(title='非平稳序列:周期性')

image.png

如何检验平稳性

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

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

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

  python
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 函数可以通过减去最佳拟合直线来移除趋势。

  python

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


rate reset presents banks with irrbb challenge_1365585930_standard_1536x1536.webp

最受欢迎的见解

1.在python中使用lstm和pytorch进行时间序列预测

2.python中利用长短期记忆模型lstm进行时间序列预测分析

3.Python用RNN循环神经网络:LSTM长期记忆、GRU门循环单元、回归和ARIMA对COVID-19新冠疫情新增人数时间序列

4.Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准确性

5.r语言copulas和金融时间序列案例

6.R 语言用RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测

7.Matlab创建向量自回归(VAR)模型分析消费者价格指数 (CPI) 和失业率时间序列

8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类

9.R语言结合新冠疫情COVID-19股票价格预测:ARIMA,KNN和神经网络时间序列分析

标签:Python,Series,日期,可视化,频率,序列,时间,平稳性,dt
From: https://www.cnblogs.com/tecdat/p/17678378.html

相关文章

  • Python入门 - 推导式
    推导式是什么?用于创建容器对象的一种语法,主要用于创建list,dict,set,tuple。 1,list推导式遍历+条件+产生的元素,用[]包装产生的每一个元素,其中条件是可选的。my_list=[1,2,3]result=[elem+1foreleminmy_list]print(type(result),result)#<class'list......
  • python使用 - 匿名函数lambda
    例1fn=lambdax,y:x+yprint(type(fn))#<class'function'>print(fn(1,2))#3例2defadd(x,y):returnx+yprint(type(add))#<class'function'>print(add(1,2))#3 def方式和lambda方式功能是一样的,只是lambda更简洁,到底用哪个......
  • Python操作文本(.TXT)文件
    在Python中,我们可以使用内置的文件操作函数来读取、写入和操作文本文件。无论无论对文件做任何的操作,我们都需要使用 open()函数来打开文件,打开模式有只读、写入、追加三种模式。下面是使用Python操作文本文件的实例。读取文件要读取文本文件,我们需要使用open()函数来打开文件,并使......
  • python实现百钱百鸡问题​
    前言百钱百鸡问题作为一个经典的数学问题,利用python实现,其思路也是比较简单的,主要就是利用for循环语句通过枚举法,根据题目条件确定解的大致范围,并对此范围内的所有可能的解进行逐一验证。功能需求一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱。用百钱买百鸡,那么公鸡、母鸡和小鸡分......
  • python DAY 2 #9.4
    赋值方法: 字符串拼接中间要加+号 python中的除法是浮点数除法整除是//  是向下取整,而不是向0取整  2**3代表2的3次方 类型转换方法,非输出语句中,字符串只能与字符串一起拼接 输入:input()默认类型是个str,需要强制转换为int输入多个数的方法:#......
  • Python 遍历字典的若干方法
    哈喽大家好,我是咸鱼我们知道字典是Python中最重要且最有用的内置数据结构之一,它们无处不在,是语言本身的基本组成部分我们可以使用字典来解决许多编程问题,那么今天我们就来看看如何在Python中遍历字典全文内容:https://realpython.com/iterate-through-dictionary-python/p......
  • python中文件的操作
    文件的基本操作1.我们目前能够操作哪些类型的文件:.txt没有后缀名的文件"""将来学了openpyxl模块将支持操作:word、Excel、ppt"""2.如何操作文件""" 三步法: 1.打开文件(关键字open) 2.读或者写 3.关闭文件"""文件的路径: 相对路径绝对路径......
  • 【python自动化】pytest系列(下)
    pytest系列文章一共有四篇,本文为第三篇。公众号:梦无矶的测试开发之路,回复pytest可以领取对应资料本章知识点文章目录Pytest之fixture(1)fixture实现前/后置(2)fixture数据传递(3)fixture全局共享机制conftest.py(4)fixture嵌套Pytest之fixture示列代码使用装饰器的方式,scope参数是代表指......
  • 【python自动化】pytest系列(完结)
    pytest系列文章一共有四篇,本文为第四篇完结篇。应各位小伙伴留言,希望可以把这几篇pytest文章进行汇总。公众号:梦无矶的测试开发之路,回复pytest可以领取对应汇总资料本章知识点文章目录Pytest高阶用法(1)参数化(2)pytest.ini①marks标记②addopts配置(3)pytest.mark.相关1、直接跳过执......
  • Lnton羚通视频分析算法平台OpenCV-Python 教程 Hough直线变换
    OpenCVPythonHough直线变换霍夫直线变换(HoughTransform)是一种在图像中检测直线的技术。它可以帮助我们从图像中鲜明地检测出直线段,并且对于噪声和不完整的线段也有较好的鲁棒性。霍夫直线变换的基本思想是将直线表示为参数空间中的曲线,通过统计参数空间中的交点来检测直线。以下......