Tài nguyên đang được tải lên... tải...

Mô hình hóa và phân tích biến động Bitcoin dựa trên mô hình ARMA-EGARCH

Tác giả:FMZ~Lydia, Tạo: 2022-11-15 15:32:43, Cập nhật: 2023-09-14 20:30:52

ED, và quá trình đã bị bỏ qua.

Mức độ khớp của phân bố bình thường bình thường không tốt như phân bố t, điều này cũng cho thấy rằng phân bố năng suất có đuôi dày hơn so với phân bố bình thường.

Trong [23]:

am_GARCH = arch_model(training_garch, mean='AR', vol='GARCH',
                      p=1, q=1, lags=3, dist='ged')
res_GARCH = am_GARCH.fit(disp=False, options={'ftol': 1e-01})
res_GARCH.summary()

Ra khỏi [23]: Iteration: 1, Func. Count: 10, Neg. LLF: -1917.4262154917305

Kết quả mô hình AR - GARCHimg

Mô hình trung bìnhimg

Mô hình biến độngimg

Phân phốiimg

Ước tính sự tương đồng: mạnh mẽ Mô tả phương trình biến động GARCH theo cơ sở dữ liệu ARCH:img

Phương trình hồi quy có điều kiện cho sự biến động có thể được lấy như sau:img

Kết hợp với sự biến động dự đoán phù hợp, so sánh nó với sự biến động thực hiện của mẫu để xem tác dụng.

Trong [26]:

def recursive_forecast(pd_dataframe):     
    window = predict_lag
    model = 'GARCH'
    index = kline_test[1:].index
    end_loc = np.where(index >= kline_test.index[window])[0].min()
    forecasts = {}
    for i in range(len(kline_test[1:]) - window + 2):
        mod = arch_model(pd_dataframe['log_return'][1:], mean='AR', vol=model, dist='ged',p=1, q=1)
        res = mod.fit(last_obs=i+end_loc, disp='off', options={'ftol': 1e03})
        temp = res.forecast().variance
        fcast = temp.iloc[i + end_loc - 1]
        forecasts[fcast.name] = fcast

    forecasts = pd.DataFrame(forecasts).T
    pd_dataframe['recursive_{}'.format(model)] = forecasts['h.1']
    evaluate(pd_dataframe, 'realized_volatility_1_hour', 'recursive_{}'.format(model))

recursive_forecast(kline_test)

Ra khỏi [1]: Lỗi tuyệt đối trung bình (MAE): 0,0128 Lỗi trung bình tuyệt đối (MAPE): 95,6 Sai số trung bình vuông gốc (RMSE): 0,018

img

Để so sánh, hãy tạo ARCH như sau:

Trong [27]:

def recursive_forecast(pd_dataframe):     
    window = predict_lag
    model = 'ARCH'
    index = kline_test[1:].index
    end_loc = np.where(index >= kline_test.index[window])[0].min()
    forecasts = {}
    for i in range(len(kline_test[1:]) - window + 2):
        mod = arch_model(pd_dataframe['log_return'][1:], mean='AR', vol=model, dist='ged', p=1)
        res = mod.fit(last_obs=i+end_loc, disp='off', options={'ftol': 1e03})
        temp = res.forecast().variance
        fcast = temp.iloc[i + end_loc - 1]
        forecasts[fcast.name] = fcast

    forecasts = pd.DataFrame(forecasts).T
    pd_dataframe['recursive_{}'.format(model)] = forecasts['h.1']
    evaluate(pd_dataframe, 'realized_volatility_1_hour', 'recursive_{}'.format(model))

recursive_forecast(kline_test)

Ra khỏi [1]: Lỗi tuyệt đối trung bình (MAE): 0,0136 Lỗi trung bình tuyệt đối (MAPE): 98,1 Sai số trung bình vuông gốc (RMSE): 0.02

img

7. mô hình EGARCH

Bước tiếp theo là thực hiện mô hình EGARCH

Trong [24]:

am_EGARCH = arch_model(training_egarch, mean='AR', vol='EGARCH', 
                       p=1, lags=3, o=1,q=1, dist='ged')
res_EGARCH = am_EGARCH.fit(disp=False, options={'ftol': 1e-01})
res_EGARCH.summary()

Ra khỏi [1]: Iteration: 1, Func. Count: 11, Neg. LLF: -1966.610328148909

Kết quả mô hình AR - EGARCHimg

Mô hình trung bìnhimg

Mô hình biến độngimg

Phân phốiimg

Ước tính sự tương đồng: mạnh mẽ Phương trình biến động EGARCH được cung cấp bởi thư viện ARCH được mô tả như sau:img

thay thếimg

Phương trình hồi quy có điều kiện của biến động có thể được lấy như sau:img

Trong số đó, hệ số ước tính của thuật ngữ đối xứng γ thấp hơn khoảng thời gian tin cậy, cho thấy có một sự biến động đáng kể trong tỷ lệ lợi nhuận Bitcoin.

Kết hợp với sự biến động dự đoán phù hợp, các kết quả được so sánh với sự biến động thực hiện của mẫu như sau:

Trong [28]:

def recursive_forecast(pd_dataframe):     
    window = 280
    model = 'EGARCH'
    index = kline_test[1:].index
    end_loc = np.where(index >= kline_test.index[window])[0].min()
    forecasts = {}
    for i in range(len(kline_test[1:]) - window + 2):
        mod = arch_model(pd_dataframe['log_return'][1:], mean='AR', vol=model, 
                         lags=3, p=2, o=0, q=1, dist='ged')
        res = mod.fit(last_obs=i+end_loc, disp='off', options={'ftol': 1e03})
        temp = res.forecast().variance
        fcast = temp.iloc[i + end_loc - 1]
        forecasts[fcast.name] = fcast

    forecasts = pd.DataFrame(forecasts).T
    pd_dataframe['recursive_{}'.format(model)] = forecasts['h.1']
    evaluate(pd_dataframe, 'realized_volatility_1_hour', 'recursive_{}'.format(model))
    pd_dataframe['recursive_{}'.format(model)]

recursive_forecast(kline_test)

Ra ngoài[28]: Lỗi tuyệt đối trung bình (MAE): 0,0201 Lỗi trung bình tuyệt đối (MAPE): 122 Sai số trung bình vuông gốc (RMSE): 0,0279

img

Có thể thấy rằng EGARCH nhạy cảm hơn với biến động và phù hợp với biến động hơn ARCH và GARCH.

8. Đánh giá dự đoán biến động

Dữ liệu hàng giờ được chọn dựa trên mẫu và bước tiếp theo là dự đoán một giờ trước. Chúng tôi chọn biến động dự đoán trong 10 giờ đầu tiên của ba mô hình, với RV là biến động chuẩn. Giá trị lỗi so sánh là như sau:

Trong [29]:

compare_ARCH_X = pd.DataFrame()
compare_ARCH_X['original']=kline_test['realized_volatility_1_hour']

compare_ARCH_X['arch']=kline_test['recursive_ARCH']
compare_ARCH_X['arch_diff']=compare_ARCH_X['original']-np.abs(compare_ARCH_X['arch'])

compare_ARCH_X['garch']=kline_test['recursive_GARCH']
compare_ARCH_X['garch_diff']=compare_ARCH_X['original']-np.abs(compare_ARCH_X['garch'])

compare_ARCH_X['egarch']=kline_test['recursive_EGARCH']
compare_ARCH_X['egarch_diff']=compare_ARCH_X['original']-np.abs(compare_ARCH_X['egarch'])
compare_ARCH_X = compare_ARCH_X[280:]
compare_ARCH_X.head(10)

Ra khỏi [1]:img

Trong [30]:

compare_ARCH_X_diff = pd.DataFrame(index=['ARCH','GARCH','EGARCH'], columns=['head 1 step', 'head 10 steps', 'head 100 steps'])
compare_ARCH_X_diff['head 1 step']['ARCH'] = compare_ARCH_X['arch_diff']['2020-03-13 04:00:00+08:00']
compare_ARCH_X_diff['head 10 steps']['ARCH'] = np.mean(compare_ARCH_X['arch_diff'][:10])
compare_ARCH_X_diff['head 100 steps']['ARCH'] = np.mean(compare_ARCH_X['arch_diff'][:100])
compare_ARCH_X_diff['head 1 step']['GARCH'] = compare_ARCH_X['garch_diff']['2020-03-13 04:00:00+08:00']
compare_ARCH_X_diff['head 10 steps']['GARCH'] = np.mean(compare_ARCH_X['garch_diff'][:10])
compare_ARCH_X_diff['head 100 steps']['GARCH'] = np.mean(compare_ARCH_X['garch_diff'][:100])
compare_ARCH_X_diff['head 1 step']['EGARCH'] = compare_ARCH_X['egarch_diff']['2020-03-13 04:00:00+08:00']
compare_ARCH_X_diff['head 10 steps']['EGARCH'] = np.mean(compare_ARCH_X['egarch_diff'][:10])
compare_ARCH_X_diff['head 100 steps']['EGARCH'] = np.abs(np.mean(compare_ARCH_X['egarch_diff'][:100]))
compare_ARCH_X_diff

Rút ra[30]:img

Một số thử nghiệm đã được thực hiện, trong kết quả dự đoán của giờ đầu tiên, xác suất của lỗi nhỏ nhất của EGARCH là tương đối lớn, nhưng sự khác biệt tổng thể không đặc biệt rõ ràng; Có một số sự khác biệt rõ ràng trong hiệu ứng dự đoán ngắn hạn; EGARCH có khả năng dự đoán nổi bật nhất trong dự đoán dài hạn

Trong [31]:

compare_ARCH_X = pd.DataFrame()
compare_ARCH_X['Model'] = ['ARCH','GARCH','EGARCH']
compare_ARCH_X['RMSE'] = [get_rmse(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_ARCH'][280:320]),
                          get_rmse(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_GARCH'][280:320]),
                          get_rmse(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_EGARCH'][280:320])]
compare_ARCH_X['MAPE'] = [get_mape(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_ARCH'][280:320]),
                          get_mape(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_GARCH'][280:320]),
                          get_mape(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_EGARCH'][280:320])]
compare_ARCH_X['MASE'] = [get_mape(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_ARCH'][280:320]),
                          get_mape(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_GARCH'][280:320]),
                          get_mape(kline_test['realized_volatility_1_hour'][280:320],kline_test['recursive_EGARCH'][280:320])]

compare_ARCH_X

Ra khỏi [1]:img

Về các chỉ số, GARCH và EGARCH có một số cải thiện so với ARCH, nhưng sự khác biệt không đặc biệt rõ ràng. Sau khi lựa chọn và xác minh khoảng thời gian đa mẫu, EGARCH sẽ có hiệu suất tốt hơn, chủ yếu là bởi vì EGARCH giải thích sự dị tính của các mẫu tốt.

9. Kết luận

Từ phân tích đơn giản ở trên, có thể thấy rằng tỷ lệ lợi nhuận logaritm của Bitcoin không phù hợp với sự phân bố bình thường, được đặc trưng bởi đuôi mỡ dày, và sự biến động có hiệu ứng tổng hợp và đòn bẩy, trong khi cho thấy sự dị biệt có điều kiện rõ ràng.

Trong việc dự đoán và đánh giá tỷ lệ lợi nhuận logaritm, khả năng dự đoán tĩnh trong mẫu của mô hình ARMA tốt hơn đáng kể so với phương pháp động, điều này cho thấy phương pháp lăn rõ ràng tốt hơn phương pháp lặp lại và có thể tránh các vấn đề quá phù hợp và khuếch đại lỗi.

Ngoài ra, khi đối phó với hiện tượng đuôi dày của Bitcoin, tức là sự phân bố đuôi dày của lợi nhuận, người ta thấy rằng sự phân bố GED (lỗi tổng quát) tốt hơn so với sự phân bố t và phân bố bình thường đáng kể, có thể cải thiện độ chính xác đo lường rủi ro đuôi. Đồng thời, EGARCH có nhiều lợi thế hơn trong việc dự đoán biến động dài hạn, điều này giải thích tốt tính bất đồng của mẫu. hệ số ước tính đối xứng trong sự phù hợp mô hình nhỏ hơn khoảng thời gian tin cậy, cho thấy có một sự biến động đáng kể bất đối xứng trong tỷ lệ lợi nhuận của Bitcoin.

Toàn bộ quá trình mô hình đầy những giả định táo bạo, và không có xác định nhất quán dựa trên tính hợp lệ, vì vậy chúng ta chỉ có thể xác minh một số hiện tượng một cách cẩn thận. Lịch sử chỉ có thể hỗ trợ xác suất dự đoán tương lai trong thống kê, nhưng tỷ lệ chính xác và chi phí vẫn còn một hành trình khó khăn dài.

So với các thị trường truyền thống, việc có sẵn dữ liệu tần số cao của Bitcoin dễ dàng hơn. đo lường thực hiện của các chỉ số khác nhau dựa trên dữ liệu tần số cao trở nên đơn giản và quan trọng. Nếu các biện pháp phi tham số có thể cung cấp quan sát nhanh cho thị trường đã xảy ra, và các biện pháp với các tham số có thể cải thiện độ chính xác đầu vào của mô hình, thì việc thực hiện các biện pháp phi tham số như Hyperparameters của mô hình có thể thiết lập một mô hình hoàn chỉnh hơn.

Tuy nhiên, những điều trên chỉ giới hạn trong lý thuyết. Dữ liệu tần số cao hơn thực sự có thể cung cấp phân tích chính xác hơn về hành vi của các nhà giao dịch. Nó không chỉ có thể cung cấp các bài kiểm tra đáng tin cậy hơn cho các mô hình lý thuyết tài chính, mà còn cung cấp thông tin ra quyết định phong phú hơn cho các nhà giao dịch, thậm chí hỗ trợ dự đoán luồng thông tin và luồng vốn, và hỗ trợ thiết kế các chiến lược giao dịch định lượng chính xác hơn. Tuy nhiên, thị trường Bitcoin rất biến động đến nỗi dữ liệu lịch sử quá dài không thể phù hợp với thông tin ra quyết định hiệu quả, vì vậy dữ liệu tần số cao chắc chắn sẽ mang lại lợi thế thị trường lớn hơn cho các nhà đầu tư tiền kỹ thuật số.

Cuối cùng, nếu bạn nghĩ rằng nội dung trên là hữu ích, bạn cũng có thể cung cấp một chút BTC để mua cho tôi một tách Cola.


Có liên quan

Thêm nữa