金融时间序列分析:9. ARMA自回归移动平均模型
金融时间序列分析:8. MA模型实例(Python)
金融时间序列分析:7. MA滑动平均模型
金融时间序列分析:6. AR模型实例
金融时间序列分析:5. AR模型实例(Python)
金融时间序列分析:4. AR自回归模型
金融时间序列分析:3. First Demo By Python
金融时间序列分析:2. 数学分析模型
金融时间序列分析:1. 基础知识
金融时间序列分析:1. 基础知识
金融时间序列分析:2. 数学分析模型
前面2篇文章讲了金融时间序列分析的基础知识,本文简单介绍下怎么实战。
网上有很多用R语言进行金融时间序列分析的资料,但是用Python的不多,我在此介绍下怎么用Python操作,至于R语言怎么弄,读者随便在网上查查就好了。
PS: 在时间序列分析领域R比Python简单的多,如果单单是进行分析的话R就够了,但是要集成一个系统的话就得用Python。(个人之见)
本文只讨论前3步,至于后面的再提到具体的模型的时候回在补上。
用Python进行时间序列分析需要用到下面一些库:
pandas,numpy,scipy,matplotlib,statsmodels
其中一些的基本使用参考下面的文章:
十分钟搞定pandas
Numpy Tutor
Python应用matplotlib绘图简介
有两种方式:
(1)从网络获取
这个参考以前的文章:
Python获取Yahoo股票数据
(2)从本地读取
在金融时间序列中CSV文件格式是一种非常简单的文件格式,最为常见的格式。
在Python中,Pandas中可以直接处理这种格式:
data = pd.read_csv('./Yahoo/000001.SS.csv', index_col='Date')
print data.head()
print data.dtypes
此时Date的类型还不是时间,需要转化一下:
data.index = pd.to_datetime(data.index)
print "Select 2016:\n", data['2016']
print 'Select 2016-02:\n', data['2016-02']
print 'Select 2016-02-22:\n', data['2016-02-22']
print 'Select 2016-02-22 : 2016-01-07:\n', data['2016-02-22':'2016-02-07']
首先获取收盘数据,并将其翻转下顺序,因为前面的数据截图可以看到,数据是逆序的,所以需要处理下。
ts = data['Close']
ts = ts[::-1]
计算日收益率:
ts_ret = np.diff(1)
对数收益率:
ts_log = np.log(ts)
ts_diff = ts_log.diff(1)
ts_diff.dropna(inplace=True)
def test_ts(ts, w, title='test_ts'):
roll_mean = ts.rolling(window = w).mean()
roll_std = ts.rolling(window = w).std()
pd_ewma = pd.ewma(ts, span=w)
plt.clf()
plt.figure()
plt.grid()
plt.plot(ts, color='blue',label='Original')
plt.plot(roll_mean, color='red', label='Rolling Mean')
plt.plot(roll_std, color='black', label = 'Rolling Std')
plt.plot(pd_ewma, color='yellow', label = 'EWMA')
plt.legend(loc='best')
plt.title('Rolling Mean & Standard Deviation')
#plt.show()
plt.savefig('./PDF/'+title+'.pdf', format='pdf')
test_ts(ts['2014-01-01':'2015-12-31'], 20, title='test_org')
test_ts(ts_log['2014-01-01':'2015-12-31'], int(adf_res['Lags Used']), title='test_log')
从上面显示图可以看出,无论简单收益率还是对数收益率都具有尖峰厚尾现象。
平稳性检验:观察法和单位根检验法
最简单稳定性检验就是肉眼观察下,只要没有明显趋势,就好^_^!
观察法,通俗的说就是通过观察序列的趋势图与相关图是否随着时间的变化呈现出某种规律。所谓的规律就是时间序列经常提到的周期性因素,现实中遇到得比较多的是线性周期成分,这类周期成分可以采用差分或者移动平均来解决,而对于非线性周期成分的处理相对比较复杂,需要采用某些分解的方法。下图为航空数据的线性图,可以明显的看出它具有年周期成分和长期趋势成分。
下面谈谈单位根检验。。。
在时间序列分析中,通常采用ADF进行稳定性检验。
下面的代码是如何用python进行ADF检验:
def adf_test(ts):
adftest = adfuller(ts)
adf_res = pd.Series(adftest[0:4], index=['Test Statistic','p-value','Lags Used','Number of Observations Used'])
for key, value in adftest[4].items():
adf_res['Critical Value (%s)' % key] = value
return adf_res
本来不打算在这篇文章中解释这快内容,只有讲了分析模型后才会这块有大致的概念。
所以本文在此不会细谈,之后有机会慢慢谈。
简单的理解就是找到时间序列的周期,比如说气温这一项,就有明显的年度周期性,前几年的同期数据对预测当年的气温有极大的参考意义。
从统计学上讲就是寻找是得ACF(样本自相关系数)最大的时间间隔。
常用定阶方法是ACF和PACF。
def draw_acf_pacf(ts, w):
plt.clf()
fig = plt.figure()
ax1 = fig.add_subplot(211)
plot_acf(ts, ax = ax1, lags=w)
ax2 = fig.add_subplot(212)
plot_pacf(ts, ax=ax2, lags=w)
#plt.show()
plt.savefig('./PDF/test_acf_pacf.pdf', format='pdf')