整理了一下时间序列不同于别的数据的比较典型的几个处理方法,欢迎讨论~
目录
预处理
平滑
移动平均Moving average(加法,乘法),指数平滑Exponential Smoothing,STL分解
滤波
hp滤波
信号分解
傅里叶变换
差分(dif)
金融数据往往有很大的波动率,为了在一定程度上平滑这些数据,采用差分处理:两个相邻数据做差,这样可以为模型减少一些噪声便于学习,但每次做差都会损失一些信息,所以差分不宜超过两次,对高频数据,可考虑采用分数阶差分。
以close为目标变量,open为自变量为例:
freq['open_diff'] = freq['open'].diff()
滞后(lag)
对于一个数据集,我们要用特征x们去预测目标列y,换句话说,要用今天的数据去预测明天的y,所以我们需要让x下移一位把它们对齐,这时候索引 2015-3-20 11:15 对应的就是 上一时刻(10:45) 的open,high,low 和 当前(11:15)的close。
freq['open_lag'] = freq['open'].shift(1)
或者把y给领先一下也可以,只不过这个时候2015-3-20 11:15对应的是下一时刻(13:15)的close和当前时刻(11:15)的x。
这两个方法没什么差别,只要清楚当前索引时间对应的是哪天的y就好了。
滑动
由于时间序列的特殊性,它近期的数据往往比久远的历史数据更重要的一些。
为了摒弃对当前而言过于久远的数据,我们固定一个窗口,当加入新数据时,就同时移动窗口的左右边界,随着一条新数据被纳入,最早的一条数据就会被扔掉。像指数平滑也是加重了近期数据的比重来削弱早期数据的影响。
def rolling(window,step,dataset)
Date = []
hurst = []
for i in range(window,len(dataset),step): #[左闭右开)
#[0,100),[3,103)...[9,109)
df = dataset.iloc[i-window:i].values.reshape(-1,1)
#date[0]...date[9]
date = dataset.index[i-window]
hurst_exponent, c, data = compute_hc(df)#对当前窗口的数据进行计算(hurst指数)
hurst.append(hurst_exponent)
Date.append(date)
plt.plot(Date, hurst)
plt.xlabel('Date')
plt.ylabel('hurst')
plt.title(f'rolling window {window}')
plt.show
return Date,hurst
rolling(100,3,freq_train)
变量分析
单变量分析方法
-
自相关性Auto-correlation:当前时刻数据与历史时刻的相关性
from statsmodels.tsa.stattools import acf
from statsmodels.graphics.tsaplots import plot_acf
-
偏自相关性Partial Auto-Correlation
from statsmodels.tsa.stattools import pacf
from statsmodels.graphics.tsaplots import plot_pacf
-
平稳性检验Stationary:adf&kpss, 这俩H0和H1正好相反
from statsmodels.tsa.stattools import adfuller,kpss
-
hurst:序列是否随机游走(白噪声之和)
from hurst import compute_Hc
-
variance ratio test 方差比率: 关于市场有效说的随机游走检测
-
anova方差分析
from scipy.stats import kstest, f_oneway
-
统计模型
注:需要考虑序列平稳,若当前阶段的数据不处于平稳状态,则对下一阶段不具备代表性,会导致回归分析的结果不准确。
线性回归,逻辑回归等:统计中的拟合结果会显示系数、t统计量、f统计量这些
import statsmodels.api as sm
sm.OLS(y,x).fit()
sm.Logit(y,x).fit()
-
模型的残差白噪声检验: 残差为白噪声则序列拟合的好(反之说明还有信息没有被拟合)
from statsmodels.stats.diagnostic import acorr_ljungbox
-
因果分析Causation(格兰杰因果)
多变量分析方法
-
协整Cointegration:多序列间存在组合平稳的现象(cadf, johansen)
from statsmodels.tsa.vector_ar import vecm
时间序列模型
-
波动率模型Volatility model
- ar:自回归模型,ma(滑动平均模型),arima(Auto Regressive Integrated Moving Average),步骤以ar为例:
-
#白噪声检验 from statsmodels.tsa import stattools LjungBox=stattools.q_stat(stattools.acf(df['close']),len(df['close'])) #平稳性检验 from statsmodels.tsa.stattools import adfuller #定阶 from statsmodels.graphics.tsaplots import plot_pacf plot_pacf(df['close'],use_vlines=True,lags=30) #建立模型 from sklearn.metrics import mean_squared_error import statsmodels.tsa.api as smt ar = smt.ARMA(df['close'], order=(1, 0)).fit(disp=-1) print(ar.summary()) #有效性检验:残差白噪声 from statsmodels.stats.diagnostic import acorr_ljungbox as lb_test #残差正态性 from statsmodels.graphics.api import qqplot #预测
- arch(自回归条件异方差模型), garch,以arch为例:
-
#平稳,白噪声 #取均值模型的残差 residual_ar = ar_model.resid #对残差进行检验, from statsmodels.stats.diagnostic import acorr_ljungbox as lb_test lb_test(residual_ar1**2)[1] #get p-value """ H0:序列无相关性 p-value < 0.05,认为显著,残差的平方非白噪声,序列有相关性,则建立arch模型 """ #定阶 plot_pacf(residual_ar1**2,use_vlines=True,lags=30) #arch import arch arch = arch.arch_model(df['data1'],mean='AR',lags=1,vol='ARCH',p=3) ARCH = arch.fit() ARCH.summary() #残差检验(正态分布)
补充:聚集现象:一个大的扰动会带来另一个扰动,之后产生聚集现象
高低频时序的不同处理方法
补充中...