国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python時間序列分析--從線性模型到GARCH模型

2019-11-06 08:57:11
字體:
來源:轉載
供稿:網友

四級渣渣看個英文文章簡直就是自虐,一天只能看一點,還只能看個半懂。唉,寫下來以后慢慢理解改正吧。

目錄

一、Motivation 二、基礎知識 1.平穩性 2.序列相關(自相關) 3.為什么我們關心序列相關性? 三、白噪聲和隨機游動 四、線性模型 五、對數線性模型 六、AR模型(P) 七、移動平均模型MA(q) 八、自回歸滑動平均模型ARMA(p,q) 九、綜合自回歸移動平均模型ARIMA(p,d,q) 十、自回歸條件heterskedastic模型ARCH(p) 十一、廣義自回歸條件heterskedastic模型GARCH(p,q)

一、Motivation

早期我在做金融方面工作時,我學到了各種時間序列分析的技術和用法,但我不能對怎樣將各部分組合到一起有一個更深的理解。我們很難看到為什么我們用某些模型與其他的進行比較或者這些模型如何建立在對方的弱點之上的更大的圖景。使用這些技術的根本目的使我困惑了很長時間。直到我理解了這個:

**時間序列分析試圖明白過去并且預測未來**

通過發展我們的時間序列分析技能,使我們能夠更好的明白發生了什么,進而更好的預測未來。示例應用包括預測未來資產回報,未來相關性/協方差和未來波動性。

這篇文章的靈感來自于Michael Halls Moore在他博客上做的偉大工作。我覺得把他的一些工作翻譯成Python可以幫助那些對R語言不熟悉的人。我也采用了一些其他博客上的代碼。這篇文章是一個活的文件,我可以根據需要和時間流逝的更有用信息來更新他。

Before we begin let’s import our Python libraries.

import osimport sysimport pandas as pdimport pandas_datareader.data as webimport numpy as npimport statsmodels.formula.api as smfimport statsmodels.tsa.api as smtimport statsmodels.api as smimport scipy.stats as scsfrom arch import arch_modelimport matplotlib.pyplot as plt import matplotlib as mpl%matplotlib inlinep = Let’s use the pandas_datareader package to grab some sample data using the Yahoo Finance API.

start = '2010-01-01'end = '2017-02-25'get_px = lambda x: web.get_data_yahoo(x, start=start, end=end)['Adj Close']symbols = ['SPY', 'TLT', 'MSFT']data = pd.DataFrame({sym:get_px(sym) for sym in symbols})Irets = np.log(data/data.shift(1)).dropna()

二、基礎知識

What is a Time Series? A time series is a series of data points indexed (or listed or graphed) in time order. - Wikipedia 1.平穩性 對數據來說什么是平穩性: a.序列的平均值不應該是時間的函數。下圖中紅色的線是不平穩的,因為它的平均值隨時間增長。 這里寫圖片描述 b.序列的方差不應該是時間的函數。這個屬性被稱為同方差。注意到紅色數據隨時間的變化很大。 這里寫圖片描述 c.最后,第i項和第i+m項的協方差不應該是時間的函數。在下面的圖中,你會注意到隨時間的推移差距變得越來越近。因此,紅色序列的協方差是隨時間變化的。 這里寫圖片描述

So what? Why do we care about stationarity?

一個平穩的時間序列是容易進行預測的,我們可以假設其未來與現在的統計屬性是相同的或成比例的。我們用的大多數時間序列分析模型都是假設協方差平穩。這就意味著這些預測模型的統計描述如均值、方差、協方差等只有在序列平穩時才是有效的,否則無效。

如上所說,金融中的大多數時間序列都是不平穩的。因此,有一大部分時間序列分析需要檢驗我們要預測的序列是否是平定的,如果它不是,我們怎需要找到方法去把它轉化成平穩的序列。

2.序列相關(自相關)–Serial Correlation (Autocorrelation) 實質上,當我們對一個時間序列建模時,我們將該系列分成三個部分:趨勢、周期和隨機。隨機分量稱為殘差或誤差。它僅僅是預測值與觀測值的差異。當我們模型的殘差彼此相關時是自相關。

3.為什么我們關心序列相關性?–Why Do We Care about Serial Correlation? 我們關心的序列相關(自相關)是因為它對我們的模型預測的有效性是至關重要的,是與平穩性密切相關。回想一下,根據定義一個平穩的時間序列的殘差是連續不相關的。如果在模型中我們不能解釋這一點,我們系數的標準誤差的作用會被降低,從而膨脹了T統計量的大小。(If we fail to account for this in our models the standard errors of our coefficients are underestimated, inflating the size of our T-statistics. )使得結果中存在太多Type-1誤差,使得我們拒絕我們的零假設即使是在它是真的。在外行人的術語中,忽略自相關意味著我們的模型預測將是廢話,我們在的模型中可能得出了有關自變量的影響的不正確的結論。

三、白噪聲和隨機游動–White Noise and Random Walks

白噪聲是第一個我們需要明白的時間序列模型。根據定義,一個白噪聲過程的時間序列具有連續不相關的誤差,并且那些誤差的預期平均值等于零。另一個關于連續不相關誤差的描述是獨立同分布。這很重要,因為如果我們的TSM是得當的,并且成功的捕獲了基本過程,那么我們模型的殘差將會是獨立同分布的,類似于白噪聲過程。因此,一部分時間序列分析是在試圖擬合時間序列致使殘差序列與白噪聲不可區分。

讓我們模擬白噪聲的過程,并查看它。下面我介紹一個方便的函數,用于繪制時間序列和分析序列相關。

def tsplot(y, lags=None, figsize=(10,8), style='bmh'): if not isinstance(y, pd.Series): y = pd.Series(y) with plt.style.context(style):#定義局部樣式 fig = plt.figure(figsize=figsize) layout = (3, 2) ts_ax = plt.subplot2grid(layout, (0, 0), colspan=2) acf_ax = plt.subplot2grid(layout, (1,0)) pacf_ax = plt.subplot2grid(layout, (1,1))
QQ_ax = plt.subplot2grid(layout, (2,0)) pp_ax = plt.subplot2grid(layout, (2,1)) y.plot(ax=ts_ax) ts_ax.set_title('Time Series Analysis Plots') smt.graphics.plot_acf(y, lags=lags, ax=acf_ax, alpha=0.5)#自相關系數ACF圖 smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax, alpha=0.5)#偏相關系數PACF圖 sm.qqplot(y, line='s', ax=qq_ax)#QQ圖檢驗是否是正太分布 qq_ax.set_title('QQ Plot') scs.probplot(y, sparams=(y.mean(), y.std()), plot=pp_ax) plt.tight_layout() return

We can model a white noise process easily and output the TS plot for visual inspection.

np.random.seed(1)randser = np.random.normal(size=1000)#高斯概率分布tsplot(randser, lags=30)

這里寫圖片描述

我們可以看出這個過程是隨機的并且中心為0.ACF和PACF圖也顯示沒有明顯的相關性。Keep in mind we should see approximately 5% significance in the autocorrelation plots due to pure chance as a result of sampling from the Normal distribution. 下面我們可以看到QQ和概率圖,它將我們數據的分布與另一個理論分布進行比較。在這個示例中,理論分布是標準正態分布。顯然,我們的數據是隨機分布的,似乎遵循高斯(正常)白噪聲,正如它應該是的那樣。

p("Random Series/n------------/nmean: {:.3f}/nvariance: {:.3f}/nstandard deviation: {:.3f}" .format(randser.mean(), randser.var(), randser.std()))# Random Series# -------------# mean: 0.039 # variance: 0.962# standard deviation: 0.981

A Random Walk is defined below: 這里寫圖片描述 隨機游走的意義在于它是非穩定的,因為觀察點之間的協方差是時間相關的。如果我們建模的TS是一個隨機游走,那么它是不可預測的。 讓我們使用“numpy.random.normal(size = our_sample_size)”函數從標準正態分布中抽樣模擬一個隨機游走。

#Random Walk without a driftnp.random.seed(1)n_samples = 1000x = w =np.random.normal(size=n_samples)for t in range(n_samples): x[t] = x[t-1] + w[t]_ = tsplot(x, lags=30)

這里寫圖片描述

顯然,我們的TS不是固定的。 讓我們來看看隨機游走模型是否適合我們的模擬數據。 回想一下隨機游走是xt = xt-1 + wt。 使用代數我們可以說xt - xt-1 = wt。 因此,我們的隨機游走系列的一階差分應該等于一個白噪聲過程! 我們可以在我們的TS上使用“np.diff()”函數,看看這是否成立。

#First difference of simulated Random Walk series#隨機游走序列的一階差分_ = tsplot(np.diff(x),lags=30)

這里寫圖片描述

Our definition holds as this looks exactly like a white noise process. What if we fit a random

walk to the first difference of SPY's prices?#First difference of SPYprices#SPY價格的一階差分_ = tsplot(np.diff(data.SPY), lags=30 )

這里寫圖片描述 這和白噪聲很相似。不過,注意QQ的形狀和概率圖。這表明,該過程是接近正常,但“重尾”。在ACF和PACF圖中似乎也有一些顯著的序列相關性,如1,5,16,18,21等。這意味著應該有更好的模型來描述實際的價格變化過程。 注:“重尾”還是不太懂,以后再慢慢看。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开阳县| 伊春市| 乐山市| 郑州市| 北海市| 普兰县| 红安县| 建宁县| 平乡县| 天水市| 崇左市| 肃宁县| 宁陕县| 绥化市| 万州区| 辽宁省| 来凤县| 凤冈县| 上虞市| 卫辉市| 盱眙县| 黔西| 秀山| 漾濞| 清丰县| 保德县| 屏南县| 西城区| 石首市| 娄烦县| 苍山县| 华蓥市| 商洛市| 大荔县| 天镇县| 南部县| 东乌| 微山县| 象州县| 祥云县| 青冈县|