python數據分析樣本比對和 SciKits

樣本比對和 SciKits

我們經常會遇到兩組數據樣本,它們可能來自不同的實驗,但互相有一些關聯。統計檢驗可

以進行樣本比對。scipy.stats模塊中已經實現了部分統計檢驗。

另一種筆者喜歡的統計檢驗是scikits.statsmodels.stattools中的Jarque-Bera正態性

檢驗。SciKits是Python的小型實驗工具包,它並不是SciPy的一部分。此外還有pandas(Python Data

Analysis Library),它是scikits.statsmodels的分支。你可以訪問https://scikits.appspot.

com/scikits查閱SciKits的模塊索引。你可以使用setuptools安裝statsmodels,命令如下:

easy_install statsmodels

動手實踐:比較股票對數收益率

我們將使用Matplotlib下載一年以來的兩隻股票的數據。如同前面的章節中所述,我們可以

從雅虎財經頻道獲取股價數據。我們將比較DIA和SPY收盤價的對數收益率。我們還將在兩隻股

票對數收益率的差值上應用Jarque-Bera正態性檢驗。請完成如下步驟。

(1) 編寫一個函數,用於返回指定股票的收盤價數據。

def get_close(symbol):

today = date.today()

start = (today.year - 1, today.month, today.day)

quotes = quotes_historical_yahoo(symbol, start, today)

quotes = np.array(quotes)

return quotes.T[4]

(2) 計算DIA和SPY的對數收益率。先對收盤價取自然對數,然後計算連續值之間的差值,即

得到對數收益率。

spy = np.diff(np.log(get_close("SPY")))

dia = np.diff(np.log(get_close("DIA")))

(3) 均值檢驗可以檢查兩組不同的樣本是否有相同的均值。返回值有兩個,其中第二個為

p-value,取值範圍為0~1。

print "Means comparison", stats.ttest_ind(spy, dia)

均值檢驗的結果如下:

Means comparison (-0.017995865641886155, 0.98564930169871368)

因此有98%的概率兩組樣本對數收益率的均值相同。

(4) Kolmogorov-Smirnov檢驗可以判斷兩組樣本同分布的可能性。

print "Kolmogorov smirnov test", stats.ks_2samp(spy, dia)

同樣,該函數有兩個返回值,其中第二個為p-value。

Kolmogorov smirnov test (0.063492063492063516, 0.67615647616238039)

(5) 在兩隻股票對數收益率的差值上應用Jarque-Bera正態性檢驗。

print "Jarque Bera test", jarque_bera(spy - dia)[1]

Jarque-Bera正態性檢驗得到的p-value如下:

Jarque Bera test 0.596125711042

(6) 使用Matplotlib繪製對數收益率以及其差值的直方圖。

plt.hist(spy, histtype="step", lw=1, label="SPY")

plt.hist(dia, histtype="step", lw=2, label="DIA")

plt.hist(spy - dia, histtype="step", lw=3,label="Delta")

plt.legend()

plt.show()

我們比較了DIA和SPY樣本數據的對數收益率,還對它們的差值應用了Jarque-Bera正態性檢

驗。示例代碼見pair.py文件。

python數據分析樣本比對和 SciKits

from matplotlib.finance import quotes_historical_yahoo

from datetime import date

import numpy as np

from scipy import stats

from statsmodels.stats.stattools import jarque_bera

import matplotlib.pyplot as plt

def get_close(symbol):

today = date.today()

start = (today.year - 1, today.month, today.day)

quotes = quotes_historical_yahoo(symbol, start, today)

quotes = np.array(quotes)

return quotes.T[4]

spy = np.diff(np.log(get_close("SPY")))

dia = np.diff(np.log(get_close("DIA")))

print "Means comparison", stats.ttest_ind(spy, dia)

print "Kolmogorov smirnov test", stats.ks_2samp(spy, dia)

print "Jarque Bera test", jarque_bera(spy - dia)[1]

plt.hist(spy, histtype="step", lw=1, label="SPY")

plt.hist(dia, histtype="step", lw=2, label="DIA")

plt.hist(spy - dia, histtype="step", lw=3, label="Delta")

plt.legend()

plt.show()


分享到:


相關文章: