樣本比對和 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文件。
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()
閱讀更多 自嗨編程土法量投 的文章