2016-03-16 15 views
12

Tôi đang tính toán hàm tự tương quan cho lợi nhuận của cổ phiếu. Để làm như vậy, tôi đã thử nghiệm hai chức năng, chức năng autocorr được xây dựng thành gấu trúc và chức năng acf được cung cấp bởi statsmodels.tsa. Này được thực hiện trong MWe sau:Sự khác nhau giữa gấu trúc ACF và ACM thống kê mô-đun là gì?

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') 

Những gì tôi nhận được những giá trị mà họ dự đoán là không giống nhau:

enter image description here

chiếm gì cho sự khác biệt này, và đó giá trị này nên được sử dụng?

+2

Nhìn vào tài liệu, độ trễ mặc định là '1' cho phiên bản gấu trúc và' 40' cho số liệu thống kêmodel – EdChum

+0

Thử 'unbiased = True' làm tùy chọn cho phiên bản mô hình thống kê. – user333700

+0

Bạn đảo ngược các nhãn trong cốt truyện của mình, tôi nghĩ rằng 'không thiên vị = True' sẽ làm cho hệ số tự tương quan lớn hơn. – user333700

Trả lời

4

Sự khác biệt giữa Pandas và Statsmodels phiên bản nằm trong trừ trung bình và bình thường hóa/sai phân:

  • autocorr không gì hơn hơn là chuyển các gói con của chuỗi ban đầu thành np.corrcoef. Bên trong phương pháp này, phương sai mẫu và phương sai mẫu của các phân đoạn này được sử dụng để xác định hệ số tương quan
  • acf, sử dụng phương sai mẫu chung và phương sai mẫu để xác định hệ số tương quan.

Sự khác biệt có thể trở nên nhỏ hơn cho chuỗi thời gian dài hơn nhưng khá lớn đối với chuỗi thời gian ngắn hơn.

So với Matlab, hàm Pandas autocorr lẽ tương ứng với làm Matlabs xcorr (cross-Corr) với (tụt) loạt bản thân, thay vì Matlab của autocorr này sẽ tính tự tương quan mẫu (đoán từ các tài liệu, tôi không thể xác nhận điều này bởi vì tôi không có quyền truy cập vào Matlab).

Xem MWe này để làm rõ:

import numpy as np 
import pandas as pd 
from statsmodels.tsa.stattools import acf 
import matplotlib.pyplot as plt 
plt.style.use("seaborn-colorblind") 

def autocorr_by_hand(x, lag): 
    # Slice the relevant subseries based on the lag 
    y1 = x[:(len(x)-lag)] 
    y2 = x[lag:] 
    # Subtract the subseries means 
    sum_product = np.sum((y1-np.mean(y1))*(y2-np.mean(y2))) 
    # Normalize with the subseries stds 
    return sum_product/((len(x) - lag) * np.std(y1) * np.std(y2)) 

def acf_by_hand(x, lag): 
    # Slice the relevant subseries based on the lag 
    y1 = x[:(len(x)-lag)] 
    y2 = x[lag:] 
    # Subtract the mean of the whole series x to calculate Cov 
    sum_product = np.sum((y1-np.mean(x))*(y2-np.mean(x))) 
    # Normalize with var of whole series 
    return sum_product/((len(x) - lag) * np.var(x)) 

x = np.linspace(0,100,101) 

results = {} 
nlags=10 
results["acf_by_hand"] = [acf_by_hand(x, lag) for lag in range(nlags)] 
results["autocorr_by_hand"] = [autocorr_by_hand(x, lag) for lag in range(nlags)] 
results["autocorr"] = [pd.Series(x).autocorr(lag) for lag in range(nlags)] 
results["acf"] = acf(x, unbiased=True, nlags=nlags-1) 

pd.DataFrame(results).plot(kind="bar", figsize=(10,5), grid=True) 
plt.xlabel("lag") 
plt.ylim([-1.2, 1.2]) 
plt.ylabel("value") 
plt.show() 

See this plot for the result

Statsmodels sử dụng np.correlate để tối ưu hóa này, nhưng điều này về cơ bản là như thế nào nó hoạt động.

0

Như được đề xuất trong nhận xét, sự cố có thể bị giảm, nhưng chưa được giải quyết hoàn toàn, bằng cách cung cấp unbiased=True cho chức năng statsmodels. Sử dụng một đầu vào ngẫu nhiên:

import statistics 

import numpy as np 
import pandas as pd 
from statsmodels.tsa.stattools import acf 

DATA_LEN = 100 
N_TESTS = 100 
N_LAGS = 32 

def test(unbiased): 
    data = pd.Series(np.random.random(DATA_LEN)) 
    data_acf_1 = acf(data, unbiased=unbiased, nlags=N_LAGS) 
    data_acf_2 = [data.autocorr(i) for i in range(N_LAGS+1)] 
    # return difference between results 
    return sum(abs(data_acf_1 - data_acf_2)) 

for value in (False, True): 
    diffs = [test(value) for _ in range(N_TESTS)] 
    print(value, statistics.mean(diffs)) 

Output:

False 0.464562410987 
True 0.0820847168593 
Các vấn đề liên quan