2014-06-20 16 views
7

Theo câu hỏi này How to get constant term in AR Model with statsmodels and Python?. Tôi hiện đang cố gắng sử dụng mô hình ARMA để phù hợp với dữ liệu nhưng một lần nữa tôi không thể tìm ra cách để giải thích kết quả của mô hình. Dưới đây là những gì tôi đã thực hiện theo ARMA out-of-sample prediction with statsmodelsARMAResults.predict API document.Cách đúng để sử dụng hàm ARMAResult.predict()

# Parameter 

INPUT_DATA_POINT = 200 
P = 5 
Q = 0 

# Read Data 

data = [] 

f = open('stock_all.csv', 'r') 
for line in f: 
    data.append(float(line.split(',')[5])) 
f.close() 

# Fit ARMA-model using the first piece of data 

result = arma_model(data[:INPUT_DATA_POINT], P, Q) 

# Predict using model (fit dimension is len(data) + 1 why?) 

fit = result.predict(0, len(data)) 

# Plot 

plt.figure(facecolor='white') 
plt.title('ARMA Model Fitted Using ' + str(INPUT_DATA_POINT) + ' Data Points, P=' + str(P) + ' Q=' + str(Q) + '\n') 
plt.plot(data, 'b-', label='data') 
plt.plot(range(INPUT_DATA_POINT), result.fittedvalues, 'g--', label='fit') 
plt.plot(range(len(data)), fit[:len(data)], 'r-', label='predict') 
plt.legend(loc=4) 
plt.show() 

Đây là kết quả rất lạ vì nó gần giống với kết quả từ câu hỏi cuối cùng của tôi như tôi đã đề cập trong liên kết ở trên. Ngoài ra tôi không hoàn toàn hiểu tại sao có một số kết quả cho một vài điểm dữ liệu đầu tiên vì nó không nên hợp lệ (không có giá trị trước đó để tính toán).

enter image description here

tôi cố gắng viết mã dự đoán của riêng tôi mà được hiển thị bên dưới (bỏ qua phần trên giống hệt các mã trên)

# Predict using model 

start_pos = max(result.k_ar, result.k_ma) 

fit = [] 
for t in range(start_pos, len(data)): 
    value = 0 
    for i in range(1, result.k_ar + 1): 
     value += result.arparams[i - 1] * data[t - i] 
    for i in range(1, result.k_ma + 1): 
     value += result.maparams[i - 1] * data[t - i] 
    fit.append(value) 

# Plot 

plt.figure(facecolor='white') 
plt.title('ARMA Model Fitted Using ' + str(INPUT_DATA_POINT) + ' Data Points, P=' + str(P) + ' Q=' + str(Q) + '\n') 
plt.plot(data, 'b-', label='data') 
plt.plot(range(INPUT_DATA_POINT), result.fittedvalues, 'r+', label='fit') 
plt.plot(range(start_pos, len(data)), fit, 'r-', label='predict') 
plt.legend(loc=4) 
plt.show() 

Đây là kết quả tốt nhất mà tôi đã

enter image description here

Trả lời

0

Bạn đã đào tạo mô hình trên một tập hợp con dữ liệu và sau đó dự đoán ra khỏi mẫu. Dự đoán AR (MA) nhanh chóng hội tụ đến mức trung bình của dữ liệu. Đó là lý do tại sao bạn thấy kết quả đầu tiên. Trong kết quả thứ hai của bạn, bạn không thực hiện dự báo mẫu, bạn chỉ nhận được các giá trị được lắp đặt ngoài mẫu.

Một vài điểm dữ liệu quan sát đầu tiên phù hợp với việc thu thập bộ lọc Kalman (đây là sự khác biệt giữa ước tính tối đa khả năng tối đa và ước tính khả năng tối đa có điều kiện).

Tôi sẽ chọn một sách giáo khoa dự báo tốt và xem lại sách để hiểu hành vi này.

+0

Cảm ơn. Có, tôi chỉ muốn một giá trị được trang bị ngoài mẫu. Mã của tôi có đúng là câu lệnh 'value = 0' phải là' value = result.params [0] '? Nếu mã của tôi được sửa, 200 điểm dữ liệu đầu tiên phải bằng với kết quả từ 'result.fittedvalues' phải không? Nhưng trong trường hợp này thì không. Nêu tôi sai vui long chân chỉnh tôi. – PalmRobotZ

+0

Có vẻ như tôi đang bỏ qua hằng số. Xem mã của tôi và nhận xét về giá trị trung bình so với hằng số trong câu hỏi cuối cùng của bạn. – jseabold

+0

Tôi đã thử nhưng không biết làm thế nào để có được thời hạn liên tục. Sử dụng 'value = result.params [0]' thích câu hỏi trước của tôi không hoạt động ở đây. – PalmRobotZ

0

Một giải pháp ngắn càng tốt và lẽ:

for i in range(0,len(data)): 
    fit.append(result.forecast()[0]) 
    numpy.append(result.data.endog.data[i]) 
Các vấn đề liên quan