一. 时间序列的定义
时间序列(Time Series)是一组按照时间发生先后顺序进行排列的数据点序列。通常一组时间序列的时间间隔为定值间隔(如1秒,1分钟,1天,1个月,1年等),因此时间序列可以作为离散时间数据进行分析处理。时间序列广泛应用于数理统计、信号处理、计量经济学、天气预报、地震预测、脑电图、控制工程、航空学、通信工程以及绝大多数涉及到时间数据测量的应用科学与工程学。
股票价格走势:
image.png
地震强度时序图:
image.png
二. 时间序列在金融上的应用
时间序列和金融资产的属性(价格、交易量、收益率等)是紧密关联的。Robert Fry Engle与Clive Granger因对时间序列模型的贡献获得了2003年的诺贝尔经济学奖。通过对金融资产属性的时序研究,投资者不仅可以预测价格或收益率的走势,还可以进一步估计资产未来的风险范围,也可以根据标的物的价格预测来决定衍生品的定价。
时间序列模型的发展是较为迅速的。在时间序列模型发展的早期,较多的理论集中在单一时序的研究上,即一维随机变量在时间上的趋势。随着一维时序理论的蓬勃发展,多维时序的研究开始兴起。例如,从单只股票的价格的时序拓展到多只股票(彼此有较强关联)的价格的时序。又例如,随着深度学习模型的发展,类似循环神经网络(RNN)模型之类的算法被发明出来后,极大地扩展了时序数据建模的能力与应用范畴。
2.1 资产收益率
在实际研究中,资产价格反映出来的收益率是很好的时序模型建模的变量。原因在于:
- 对于一般投资者而言,收益率是与投资规模无关的变量,能很好地反映投资机会
- 与价格相比,收益率的统计属性更加优良
收益率的计算
对于t时刻的资产价格𝑃_𝑡,收益率的计算为
简单收益率:
对数收益率(复合收益率):
三. 平稳性
从Yahoo!Finance上搜集了S&P500过去2年的调整后的收盘价,并计算了每日的简单收益率与对数收益率,结果如下:
image.png
从图中可以看到
股价本身是上涨趋势的
简单收益率和对数收益率分别围绕0.0624%和0.0603%上下浮动
看起来,收益率总比价格本身更加“平稳”一些。
如何定义时间序列{𝑋_𝑡}的平稳性?
强平稳性: 对于任意正整数k和n,如果与的联合分布是一致的,则称具有强平稳性
弱平稳性:如果是常数,且仅与k相关,则称具有弱平稳性
注:强、弱平稳性并不具有包含性。即使满足强平稳性,也未必满足弱平稳性。反之亦然。
四. 白噪声
如果一组时间序列满足以下条件:
- 是独立同分布的,即对任意k,都有与的分布函数一致
- 的期望和方差是存在且有限的
那么称为白噪声。
特别地,如果服从均值为零、方差有限的正态分布,则成为高斯白噪声。
在时间序列模型中,我们一般将数据分解成可以拟合(或者预测)的一部分,再加上有白噪声引起的随机性。
五. 线性时间序列
image.png六. AR模型
image.pngAR(1)模型:
自相关函数:
AR(p)模型:
偏自相关函数:
自相关函数,autocorrelation function(ACF),描述了时间序列数据与其之后版本的相关性(如:Y(t) 与 Y(t-1) 之间的相关性)。
偏自相关函数,partial autocorrelation function(PACF),描述了各个序列的相关性。
image.png image.png image.png
AR(p)模型的参数估计与预测:
七. MA模型
MA模型:
自相关函数:
MA模型的参数估计与预测:
八. ARMA模型
ARMA模型:
ARMA模型的阶:
ARIMA模型:
九. 实战
9.1 绘制简单收益率与对数收益率
测试数据路径:
链接:https://pan.baidu.com/s/1mWEHe-EJSfkhbEJoDNB4Zg
提取码:xb3w
python 代码:
import numpy as np
import pandas as pd
import statsmodels.api as sm
from datetime import datetime
import matplotlib.pylab as plt
from random import random
from statsmodels.tsa import stattools as ts
data = pd.read_csv("E:\GSPC.csv",index_col = 'Date')
data.index = pd.to_datetime(data.index)
data = data[['Adj Close']].copy()
#计算每日简单收益率与对数收益率
price_lag = list(data.iloc[:-1]['Adj Close'])
data_lag = data.iloc[1:]
data_lag['Adj Close Lag'] = price_lag
data_lag['simple_return'] = data_lag.apply(lambda x: x['Adj Close']/x['Adj Close Lag']-1, axis=1)
data_lag['log_return'] = data_lag.apply(lambda x: np.log(x['Adj Close']/x['Adj Close Lag']), axis=1)
print("{:.4%}".format(np.mean(data_lag['simple_return'])))
print("{:.4%}".format(np.mean(data_lag['log_return'])))
# 调整窗口尺寸
#plt.figure()
plt.figure(figsize=(15, 9))
plt.subplot(1,3,1)
plt.plot(data.index, data['Adj Close'])
plt.title('S&P500 Daily Closed Price')
plt.subplot(1,3,2)
plt.plot(data_lag.index, data_lag.simple_return)
plt.title('S&P500 Daily Simple Return')
plt.subplot(1,3,3)
plt.plot(data_lag.index, data_lag.log_return)
plt.title('S&P500 Daily Log Return')
plt.show()
网友评论