python⾦融时间序列分析实验报告_Python⽤于⾦融数据分析
第9课-----时间序列。。。
⼤纲
⼀、时间序列基础知识
时间序列有⼀些基本的性质。
1. 趋势
从上图可以看出有个⼀开始向上,中间静⽌或者叫⽔平,后半段向下的趋势,这个趋势需要通过对数据求平均值才会看得更加明显。
虽然有围绕着均值上下波动的偏差,但是从较⼤的时间尺度上⾯来看,它仍然是可以看作有明显的趋势的。
2. 季节性
季节性
季节性⽐较好理解,就是值随着⽉份有着明显的涨落,⽐如⾕歌搜索snowboarding的明显到了冬天就有个明显的飞涨,到了夏天就有明显的回落,重复出现。当然,从图上总体趋势还可以看出搜索snowboarding的量总体上也有个下降。
3. 周期性
周期性
周期性跟季节性的区别在于它带有明显的趋势,但没有重复,在上图当中不是季节性,因为并不是⼀到某个季节值就会有明显的涨落,⽽是每隔⼏年就有⼀次涨落。(这⾥还有些不理解)
⼆、statsmodels模块介绍
statsmodels是能够对数据进⾏建模,预测的⼯具包,它还能对数据进⾏假设性检验。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as smwrap in me plastic弗兰克歌曲
nt=sm.datasets.macrodata.NOTE#datasets模块包含了很多数据集,我们在这⾥调⽤macrodata这个数据集,然后查看这个数据集的相关信息
print nt
接下来载⼊数据集
df=sm.datasets.macrodata.load_pandas().data
df.head()
在这⾥的意思是说以pandas的形式加载这个macrodata的数据,然后我取加载后的数据(可能是load_pandas之后不只有data这个属性,还有其他的属性)
我们看⼀下官⽅⽂档,可以发现,它的作⽤是传⼊开始start和end的⽇期⽂本,然后会转换成⼀系列的datetime序列(可以认为是range函数的⽇期版),关键是这⾥的⽇期缩写是怎么规律?
在这⾥我们⼤致可以看到缩写前⾯⼀部分是年份,后⾯字母代表频率,如果是Q则代表季度qurter,字
母后⾯的数字代表开始的节点,如果是1996Q2,代表1996年的第⼆个季度开始,往后推length个长度的单位。
index=pd.Index(sm.tsa.datetools.dates_from_range('1959Q1', '2009Q3'))
df.index=index
我们发现原始数据的步长都是按照季度来的,因此我们⽣成按照季度来的时间序列,并将这个序列作为索引,给原始数据对应上
#画出重新设置序列以后的图
df['realgdp'].plot(color='darkgreen', linestyle='dashed')
plt.ylabel('gdp')
使⽤statsmodel模块得到趋势
Hodrick-Prescott filter能够把趋势和周期性区分开来。趋势⽤tao_{t}表⽰,⽽周期项⽤zeta_{t}
表⽰。所以某个时间的值可以⽤两者的加和表⽰。
⽽预测模型的组成由是最⼩化以下这个⼆次⽅损失函数所决定:
gdp_cyclical, gdp_trend=sm.tsa.filters.hpfilter(df['realgdp'])
gdp_trend.head()
打印出的结果是这个。
接下来我们把趋势和原数据都⼀起作图。
df['gdp_trend']=gdp_trend
df['gdp_cyclical']=gdp_cyclical
df[['realgdp', 'gdp_trend']].plot(figsize=(16, 6), color=['darkgreen', 'red'], linestyle='dashed')
可以看得到趋势和原始数据符合得不错。
python数据分析基础教程答案还可以通过设置线的颜⾊和实虚线来突出表⽰。
df[['realgdp', 'gdp_trend']].plot(figsize=(16, 6), color=['darkgreen', 'red'], style=['-','--'])
三、指数平均化移动平均值EWMA
#导⼊航班数据
ad_csv('airline_passengers.csv', index_col='Month', parse_dates=True)
#指定index column,并且尽可能按照⽇期格式来解析index
df.dropna(inplace=True)#丢掉缺失的⾏
df._datetime(df.index)
plt.plot_date(data=df, x=df.index, y='Thousands of Passengers', xdate=True, marker=None, linestyle='solid',
color='darkgreen')
⼩提⽰,在这⾥可以通过指定marker为None来消除标记。
java循环语句案例SMA
接下来使⽤简单的移动平均,也就是不引⼊权重和指数。
df['6_rolling_mean']=df['Thousands of Passengers'].rolling(6).mean()#仍旧是在移动完rolling之后要⽤聚合函数
df['12_rolling_mean']=df['Thousands of Passengers'].rolling(12).mean()
df.plot(kind='line', color=['darkred', 'darkgreen', 'darkblue'])
以上分别代表原数据,6个⽉为⼀个窗⼝的移动平均值以及12个⽉为移动窗⼝的平均值绘图。
java编译程序包不存在EWMA
简单移动平均值具有⼀些缺点:
gzip怎么解压过⼩的窗⼝会受到噪声的影响,⽽不是反映出真实的信号。
移动平均值⼀直与窗⼝的⼤⼩有关。
移动平均值不会达到数据的极值。
移动平均值并不会告诉你的未来的发展,它只是告诉你过去的趋势。
极端的历史值会影响到现在的移动平均值。
针对以上问题,引⼊expotentionial weighted moving average,也就是引⼊为指数项表达的权重,权重的⼤⼩除了与窗⼝有关,也跟当前时间上的远近程度有关,与当前时间相距更远的,权重会更⼩,可以理解为影响效果会更弱。
表达式如下:
这⾥的x_{t-i}代表输⼊(其实我这⾥也不太懂是什么输⼊),代表着距离当前时间点t前i个单位的输⼊的影响,wi就是这个距离为i的权值。
EW函数⽀持两种,⼀种是默认adjust=True,在这种情况下,距离为i的滞后对t的权值
这样以上的公式可以写成:
如果adjust=False,那么就是另外⼀种计算⽅式:
相当于使⽤权重:
在这⾥其实是类似于之前的ARIMA模型,认为当前值是跟前⾯的⼀项有关,并且加上当前的误差项。
具体有进⼀步的推导,参考这篇⽂章。
接下来要注意
,alpha可以从以下这些值当中取。
在这⾥s代表移动平均值所涉及的跨度,c代表移动跨度s的⼀半,
,h是指权重项衰减到原有的⼀半的时候所需的时间⼤⼩。
代码部分。
df['12_span_ewm']=df['Thousands of Passengers'].ewm(span=12).mean()
df[['12_span_ewm', 'Thousands of Passengers']].plot(style=['--', '-'], color=['darkgreen','darkred'])
可以看得出相对于简单的移动平均值,指数权值化后的移动平均值具有更加明显的季节性,与原有的数据更加贴合。
关于这部分还有很多需要学习的,⽬前只是⼊门。
三、ETS模型
我们还可以通过对原始数据按照Error、Trend和Seasonality三部分来分解,具体原理可以参考这篇⽂章。
ETS模型分为加法和乘法模型,如果趋势Trend是线性增长的关系,那么就⽤加法模型additive,否则⾮线性则⽤multiplicative乘法模型。具体⽤法是⽤seasonal_decompose,传⼊数据,以及对应的模型参数model。
printf是什么意思怎么用from statsmodels.tsa.seasonal import seasonal_decompose
result=seasonal_decompose(df['Thousands of Passengers'], model='multiplicative')
result.plot()
plt.show()
result包括四部分内容,⼀个是观察值,趋势,季节性的值还有残差。残差可以认为是trend和观察值之间的差距。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论