我在计算股票收益的自相关函数。为此,我测试了两个函数:内置于Pandas中的autocorr
函数和由statsmodels.tsa
提供的acf
函数。这在以下MWE中完成:
import pandas as pd
from pandas_datareader import data
import matplotlib.pyplot as plt
import datetime
from dateutil.relativedelta import relativedelta
from statsmodels.tsa.stattools import acf, pacf
ticker = 'AAPL'
time_ago = datetime.datetime.today().date() - relativedelta(months = 6)
ticker_data = data.get_data_yahoo(ticker, time_ago)['Adj Close'].pct_change().dropna()
ticker_data_len = len(ticker_data)
ticker_data_acf_1 = acf(ticker_data)[1:32]
ticker_data_acf_2 = [ticker_data.autocorr(i) for i in range(1,32)]
test_df = pd.DataFrame([ticker_data_acf_1, ticker_data_acf_2]).T
test_df.columns = ['Pandas Autocorr', 'Statsmodels Autocorr']
test_df.index += 1
test_df.plot(kind='bar')
我注意到他们预测的数值不一样:
是什么导致了这种差异,应该使用哪些值?
Pandas和Statsmodels版本之间的区别在于均值减和归一化/方差除:
autocorr
只将原始序列的子序列传递给np.corrcoef
。在该方法中,利用这些子序列的样本均值和样本方差来确定相关系数acf
相反,使用总体序列样本均值和样本方差来确定相关系数。长时间序列的差异可能会变小,但短时间序列的差异会很大。
与Matlab相比,Pandas
autocorr
函数可能对应于对(滞后)序列本身进行Matlab sxcorr
(交叉校正),而不是Matlab的autocorr
,后者计算样本自相关(从文档中猜测;我无法验证这一点,因为我没有访问Matlab的权限)。请参阅本MWE以获得澄清:
Statsmodels使用
np.correlate
来优化它,但这基本上就是它的工作原理。如注释中所建议的,通过向
statsmodels
函数提供unbiased=True
,可以减少但不能完全解决问题。使用随机输入:输出:
相关问题 更多 >
编程相关推荐