Pemodelan dan Analisis Volatiliti Bitcoin Berdasarkan Model ARMA-EGARCH

Penulis:Lydia, Dicipta: 2022-11-15 15:32:43, Dikemas kini: 2023-09-14 20:30:52

ED, dan prosesnya dihilangkan.

Ijazah pencocokan Pengedaran Normal Normal tidak sebaik pengedaran t, yang juga menunjukkan bahawa pengedaran hasil mempunyai ekor yang lebih tebal daripada pengedaran normal. Seterusnya, masukkan proses pemodelan, regresi model ARMA-GARCH(1,1) dijalankan untuk log_return (peratusan logaritma pengembalian) dan dianggarkan seperti berikut:

Dalam [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()

Keluar[23]: Iterasi: 1, Func. Hitung: 10, Negatif LLF: -1917.4262154917305

Hasil Model AR - GARCHimg

Model purataimg

Model Volatilitiimg

Pengedaranimg

Pengira kovarian: mantap Penerangan persamaan turun naik GARCH mengikut pangkalan data ARCH:img

Persamaan regresi bersyarat untuk turun naik boleh diperolehi sebagai:img

Digabungkan dengan turun naik yang diramalkan yang sepadan, bandingkan dengan turun naik sampel yang direalisasikan untuk melihat kesannya.

Dalam [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)

Keluar[26]: Kesalahan mutlak purata (MAE): 0.0128 Kesalahan Peratusan Absolut Purata (MAPE): 95.6 Kesilapan Akar Rata-rata Kuadrat (RMSE): 0.018

img

Untuk perbandingan, buat ARCH seperti berikut:

Dalam [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)

Keluar[27]: Kesalahan mutlak purata (MAE): 0.0136 Kesalahan Peratusan Absolut Purata (MAPE): 98.1 Kesilapan Akar Rendah Kuadrat (RMSE): 0.02

img

7. pemodelan EGARCH

Langkah seterusnya adalah untuk menjalankan EGARCH pemodelan

Dalam [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()

Keluar[24]: Iterasi: 1, Func. Bilangan: 11, Negatif LLF: -1966.610328148909

Hasil Model AR - EGARCHimg

Model purataimg

Model Volatilitiimg

Pengedaranimg

Pengira kovarian: mantap Persamaan turun naik EGARCH yang disediakan oleh perpustakaan ARCH diterangkan seperti berikut:img

penggantiimg

Persamaan regresi bersyarat volatiliti boleh diperolehi seperti berikut:img

Di antara mereka, pekali anggaran istilah simetri γ adalah kurang daripada selang kepercayaan, menunjukkan bahawa terdapat asimetri yang signifikan dalam turun naik kadar pulangan Bitcoin.

Digabungkan dengan turun naik yang diramalkan yang disesuaikan, hasilnya dibandingkan dengan turun naik sampel yang direalisasikan seperti berikut:

Dalam [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)

Keluar[28]: Kesalahan mutlak purata (MAE): 0.0201 Kesalahan Peratusan Absolut Purata (MAPE): 122 Kesalahan Peringkat Peringkat (RMSE): 0.0279

img

Ia dapat dilihat bahawa EGARCH lebih sensitif terhadap turun naik dan lebih sesuai dengan turun naik daripada ARCH dan GARCH.

8. Penilaian ramalan turun naik

Data sejam dipilih berdasarkan sampel, dan langkah seterusnya adalah meramalkan satu jam ke hadapan. Kami memilih turun naik yang diramalkan dalam 10 jam pertama dari tiga model, dengan RV sebagai turun naik penanda aras. Nilai ralat perbandingan adalah seperti berikut:

Dalam [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)

Keluar[29]:img

Dalam [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

Keluar[30]:img

Beberapa ujian telah dijalankan, dalam hasil ramalan jam pertama, kebarangkalian kesilapan terkecil EGARCH agak besar, tetapi perbezaan keseluruhan tidak begitu jelas; Terdapat beberapa perbezaan yang jelas dalam kesan ramalan jangka pendek; EGARCH mempunyai keupayaan ramalan yang paling cemerlang dalam ramalan jangka panjang

Dalam [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

Keluar[31]:img

Dari segi penunjuk, GARCH dan EGARCH mempunyai beberapa peningkatan berbanding dengan ARCH, tetapi perbezaannya tidak begitu jelas. Selepas pemilihan dan pengesahan selang pelbagai sampel, EGARCH akan mempunyai prestasi yang lebih baik, yang terutamanya kerana EGARCH menjelaskan heteroscedasticity sampel dengan baik.

9. Kesimpulan

Dari analisis mudah di atas, dapat didapati bahawa kadar pulangan logaritma Bitcoin tidak sesuai dengan pengedaran normal, yang dicirikan oleh ekor lemak tebal, dan turun naik mempunyai pengumpulan dan kesan leverage, sambil menunjukkan heterogeniti bersyarat yang jelas.

Dalam ramalan dan penilaian kadar pulangan logaritma, kemampuan ramalan statik intra sampel ARMA lebih baik daripada yang dinamik secara ketara, yang menunjukkan bahawa kaedah gulung jelas lebih baik daripada kaedah berulang, dan dapat mengelakkan masalah overmatching dan penguatan ralat.

Selain itu, apabila berurusan dengan fenomena ekor tebal Bitcoin, iaitu pengedaran ekor tebal pulangan, didapati bahawa pengedaran GED (kesalahan umum) lebih baik daripada pengedaran t dan pengedaran normal dengan ketara, yang dapat meningkatkan ketepatan pengukuran risiko ekor. Pada masa yang sama, EGARCH mempunyai lebih banyak kelebihan dalam meramalkan turun naik jangka panjang, yang menjelaskan dengan baik heteroskedastikiti sampel. Gabungan anggaran simetri dalam pencocokan model kurang daripada selang keyakinan, yang menunjukkan bahawa terdapat asimetri yang signifikan dalam turun naik kadar pulangan Bitcoin.

Keseluruhan proses pemodelan penuh dengan pelbagai andaian berani, dan tidak ada pengenalan konsistensi bergantung pada kesahihan, jadi kita hanya boleh mengesahkan beberapa fenomena dengan teliti. Sejarah hanya dapat menyokong kebarangkalian meramalkan masa depan dalam statistik, tetapi ketepatan dan nisbah prestasi kos masih mempunyai perjalanan yang panjang dan sukar.

Berbanding dengan pasaran tradisional, ketersediaan data frekuensi tinggi Bitcoin lebih mudah. Pengukuran yang direalisasikan pelbagai penunjuk berdasarkan data frekuensi tinggi menjadi mudah dan penting. Jika langkah-langkah bukan parameter dapat memberikan pemerhatian cepat untuk pasaran yang telah berlaku, dan langkah-langkah dengan parameter dapat meningkatkan ketepatan input model, maka mengambil langkah-langkah bukan parameter yang direalisasikan sebagai Hyperparameters model boleh menubuhkan model yang lebih lengkap.

Walau bagaimanapun, yang di atas adalah terhad kepada teori. Data frekuensi yang lebih tinggi benar-benar dapat memberikan analisis yang lebih tepat mengenai tingkah laku peniaga. Ia tidak hanya dapat menyediakan ujian yang lebih boleh dipercayai untuk model teori kewangan, tetapi juga memberikan maklumat pengambilan keputusan yang lebih banyak untuk peniaga, bahkan menyokong ramalan aliran maklumat dan aliran modal, dan membantu merancang strategi perdagangan kuantitatif yang lebih tepat.

Akhirnya, jika anda fikir kandungan di atas membantu, anda juga boleh menawarkan sedikit BTC untuk membeli saya secangkir Cola.


Berkaitan

Lebih lanjut