処置は省略されました
正常正規分布のマッチング度値は,t分布ほど良くない.これは,収束分布が正規分布よりも厚い尾を持っていることを示している.次に,モデリングプロセスを入力すると,log_return (対数値帰帰率) に対してARMA-GARCH(1,1) モデル回帰が実行され,次のように推定される:
[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()
アウト[23]: 繰り返す: 1, 機能数: 10, ネガティブ LLF: -1917.4262154917305
AR - GARCH モデルの結果
平均モデル
波動性モデル
配布
コヴァリアンス推定値: 確固たる ARCH データベースによる GARCH 変動方程式の記述:
変動の条件回帰方程式は以下のように得られる.
予想された変動値と組み合わせて,サンプルにおける変動値と比較して効果を見ることができます.
[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)
アウト[26]: 平均絶対誤差 (MAE): 0.0128 平均絶対%誤差 (MAPE): 95.6 根平均正方形誤差 (RMSE): 0.018
比較のために,次のように ARCH を作成します.
[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)
アウト[27]: 平均絶対誤差 (MAE): 0.0136 平均絶対誤差率 (MAPE): 98.1 平方根平均誤差 (RMSE): 0.02
次のステップはEGARCHモデリングを実行することです
[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()
アウト[24]: 繰り返す: 1, 機能数: 11, 負 LLF: -1966.610328148909
AR - EGARCH モデルの結果
平均モデル
波動性モデル
配布
コヴァリアンス推定値: 確固たる ARCH ライブラリから提供された EGARCH 変動方程式は次のように記述されています.
代替
変動の条件回帰方程式は次のように得られます.
その中でも,対称項 γ の推定係数は信頼区間より小さい.これはビットコインの収益率の変動に有意な"対称性"があることを示唆する.
比較された予測波動性と組み合わせた結果と,サンプルの実態波動性を以下のように比較する.
[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)
出場[28]: 平均絶対誤差 (MAE): 0.0201 平均絶対%誤差 (MAPE): 122 根平均正方形誤差 (RMSE): 0.0279
EGARCHはARCHとGARCHよりも波動に敏感で 波動に適していることがわかります
時計データはサンプルに基づいて選択され,次のステップは1時間前に予測することです. RVをベンチマークの変動値として,3つのモデルの最初の10時間の予測波動性を選択します. 比較誤差値は以下のとおりです:
[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)
出場[29]:
[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
出場[30]:
いくつかのテストが行われており,最初の時間の予測結果では,EGARCHの最小誤差の確率は比較的大きいが,全体的な違いは特に明らかではない.短期予測効果にはいくつかの明らかな違いがある.EGARCHは長期予測において最も優れた予測能力を持っている.
[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
アウト[31]:
指標に関しては,GARCH と EGARCH は ARCH と比較して若干改善しているが,違いは特に顕著ではない.マルチサンプルの間隔の選択と検証の後,EGARCH はより良いパフォーマンスを得ることになる.これは主にEGARCHがサンプルの異性帯状性をよく説明しているためである.
上記の単純な分析から,ビットコインの対数回帰率は,厚い脂肪尾で特徴づけられる通常の分布に適合していないことが判明し,不安定性は蓄積とレバレッジ効果を持ち,明らかな条件的異性性を示しています.
ロガリズム回帰率の予測と評価において,ARMAモデルのサンプル内静的予測能力は動的モデルよりも著しく優れている.これは,ローリング方法が反復方法よりも明らかに優れていることを示し,オーバーマッチングやエラー増幅の問題を回避できる.サンプル外回帰率は予測が困難で,市場の低効率仮定を満たしている.
さらに,ビットコインの厚い尻尾現象,すなわち厚い尻尾回帰分布に対処する際に,GED (一般化エラー) 分布がt分布と正常分布よりも著しく優れていることが判明し,これは尾尾リスクの測定精度を大幅に向上させることができる.同時に,EGARCHは長期波動性を予測する上でより多くの利点を有し,これはサンプルの異性相性性をよく説明する.モデルマッチングにおける対称推定係数は信頼区間よりも小さいため,ビットコインの回帰率変動に著しい
モデル化プロセス全体が様々な大胆な仮定に満ちており,有効性による一貫性識別はありませんので,私たちは注意深くいくつかの現象を検証することができます.歴史は統計で未来を予測する確率のみをサポートすることができますが,正確性とコストパフォーマンス比率はまだ長い困難な旅程をします.
伝統的な市場と比較して,ビットコインの高周波データの利用は容易である.高周波データに基づく様々な指標の"実現"測定は単純で重要になる.非パラメータ的な測定が発生した市場に対する迅速な観察を提供でき,パラメータのある測定がモデルの入力精度を向上させることができれば,モデルの"ハイパーパラメーター"として実現された非パラメータ的な測定を採取することで,より"完全な"モデルを確立することができる.
しかし,上記は理論に限定されている.より高い周波数データには,実際にトレーダーの行動のより正確な分析を提供することができる.それは,金融理論モデルのためのより信頼性の高いテストを提供できるだけでなく,トレーダーのためにより豊富な意思決定情報を提供し,情報流と資本流の予測をサポートし,より正確な定量的な取引戦略を設計するのに役立ちます.しかし,ビットコイン市場は非常に不安定で,あまりにも長い歴史的データは効果的な意思決定情報と一致することはできません.したがって,高周波データは間違いなくデジタル通貨の投資家にとってより大きな市場優位性をもたらすでしょう.
最後に,上記の内容が役に立ったと思うなら,少しのBTCも用意して,コラを買ってあげてください.でも,コーヒーはいらないので,飲むと眠りにつきます.