Excelでのバックテスト

モデリングにおけるバックテストとは、過去のデータを使って予測モデルをテストすることである。この記事は、Microsoft Excelでバックテストを行う方法についてのものであり、バックテストの理論的背景についてのものではありません。

バックテストはどのように行うのか?時系列の最初まで時間を巻き戻し、その時点までの利用可能なデータを使って対象モデルのパラメータを較正し、次の期間の予測(=フォーキャスト)を行います。次に、時間を進め、パラメータ値を再較正し、別の予測を行う、といった具合です。練習の最後には、私たちは一連の予測を手にすることになる。

各時点で、我々が行う唯一の仮定は、一般的なモデルの定義(例えば、ARMA(1,1))であることに注意してください。それでも、その時点までで利用可能な情報のみを使用して、パラメータの値をキャリブレーションする。

このアプローチは現実の実務と一致している。まず、初期モデルから始めて、次の期間の予測を行う。時間は進む。新しい期間が発生したので、新しいデータ点を現在の入力データセットに追加し、パラメータを再較正し、次の期間の予測を行い、これを繰り返す。

なぜ私が気にしなければならないのか?

この記事では、バックテストを実施するために必要なマイクロソフト・エクセルの手順を説明する: INDEX(.)とSEQUENCE(.)を使用し、エクセルの "データ・テーブル "メカニズムを活用して様々なシナリオを実行する。

バックテストでは、予測誤差が生成されるため、予測誤差の時系列を系列相関、分布、外れ値、その他について精査し、モデルの精度とパフォーマンスをよりよく理解することができます。

さあ、始めましょう!

今回は、200個のオブザベーションからなる合成定常データセットを使用する。このデータ集合は、次に示すようにARMA(1,1)過程に従う。

この図は、200個のオブザベーションからなる合成定常データセットを示している。

提案モデルはARMA(1,1)

この図は、オリジナルARMAモデルの表を示す。

バックテスト手順

反復のたびに、以下のことを行う必要がある: (2) (1)のデータセットを使って、ARMA(1,1)モデルのパラメータ値をキャリブレーションする。 (3) (2)のモデルと(1)のデータセットを使って、1期間先の予測を計算する。

1. 入力データセット

入力データ集合を完全に記述するには、開始と終了の2つのインデックスが必要である。次にSEQUENCE(.)関数を用いて、開始と終了の間のインデックス集合を生成する。次に、INDEX(.)関数を用いて、シーケンスセット内の行インデックスを持つ元のデータセット内のすべてのセル範囲を返す。

例: 

元の入力データセットは\$A\$3:\$A\$202です。インデックス1から50までのセルを選択します。

=INDEX(\$A\$3:\$A\$202,SEQUENCE(50,1,1,1),1)

入力データの名前を定義し、入力セル範囲の代わりにこの名前を参照できることに注意。

2. モデルの較正

ここでは、NumXL ARMA_PARAM(.)関数を使用し、較正済みパラメータにはreturn type=2を指定する。

この図は、キャリブレーションされたARMAモデルを示している。

ARMA_PARAM(.)は、モデルのパラメーターをコンパクトな形で返すので、上の図ではARMAプロセスがそうなっている: \[\begin{array}{l} {X_t} = 1.485 + 0.401{X_{t - 1}} + 0.734{a_{t - 1}} + {a_t}\\ {a_t} \sim N(0,1.14) \end{array}\]

3. 予測

ARMA_FORE(.)、(1)で設定したデータ、2で計算したモデル・パラメーターを用いて、1期先の予測値を計算することができる。

1期間先の予測値を計算する。

平均予測、予測誤差、信頼区間は私が作成した。

データ表

これで、1ステップの計算が終わりました。エクセルの「データ表」機能を使って、ステップ200までの残りの期間について同じ計算をしてみよう。

まず、出力テーブルを準備する必要がある:

データテーブルの設定

次に、以下のように、出力行から始まり、フィニッシュ・インデックス列を含むデータ・テーブル全体を選択する:

データテーブルのセル範囲を選択する

次に、"データ "ツールバーに切り替え、"What-ifシナリオ "の下にある "データテーブル "項目を探す。

この図は、エクセルのデータ・テーブル・メニューを示しています。

データ・テーブル」ダイアログがポップアップする。列入力セル」を探し、データセットの「終了」インデックスへの参照を入力し、OKボタンをクリックする。

この図は、「データ・テーブル」ダイアログ・ボックスを示しています。

データ・テーブルは、フィニッシュ・インデックスの値を我々のデータ・テーブルの値と置き換え、出力を保存する。

この図は、実際のエラーを含むデータテーブルの出力を示しています。

標準誤差」はARMA_FORE(.)関数によって生成され、右端の列(「誤差」)は予測値と実際の実現値との誤差であることに注意されたい。

バックテスト分析

まず、実際の実現値に対するバックテストの予測出力を視覚的に検証し、次に統計的特性を掘り下げてみよう。

この図は、データプロットによるバックテストの予想と実績の比較です。

プロットの網掛け部分は95%予測信頼区間に相当する。

このプロットは、モデルの良好な適合性を示しており、したがって予測精度も高い。

次に、NumXL ツールバーのサマリー統計を使って、予測誤差(予測 - 実績)の統計的特性を調べてみよう。

この図は、バックテスト・エラーのサマリー統計を示している。

要約統計量表は、予測誤差が平均ゼロ、標準偏差1.0のガウスノイズであることを示している。

この図は、バックテストのKDE対ガウスを示す。

結論として、ARMA(1,1)は与えられたデータセットに適した予測モデルである。

次は何をするのか?

今頃、モデルのパラメーターの値が気になっているのではないだろうか?それらは安定しているのだろうか?

まず、2つ目の "データテーブル "を作成し、出力行にモデルパラメーターの値を入れ、先ほどと同じようにデータテーブルを実行する。

この図はデータテーブルのパラメーターを示している。

ここで、予測誤差の場合と同様に、各パラメータの値を分析する。

Backcasting ARMA (1,1) mu plotBackcasting ARMA (1,1) - sigma plot
Backcasting ARMA (1,1) -phi plotBackcasting ARMA (1,1) - theta plot

パラメータ(θを除く)の値は安定性を示し、一定値への傾向を示している。シータ(MA係数)の値はより不安定であるが、0.6から0.9の間に収まっている。

次に、記述統計とパラメータ値の基礎分布を調べる必要があるが、この作業は皆さんにお任せする。

データセットと分析については、添付のスプレッドシートを参照されたい。

結論

この記事では、予測モデルのバックテストを最小限の中間計算で、あるいは中間計算なしで実施する手順を示した。エクセルの組み込み関数を使用した: INDEX(.)とSEQUENCE(.)を使用し、"データテーブル "機能を活用して、あらかじめ定義されたすべてのインデックスについて計算を実行した。

バックテスト結果が出たら、統計分析に目を向け、その特性や分布を評価し、出力にバイアス(系列相関など)がないかを明らかにする。

  添付ファイル

コメント

サインインしてコメントを残してください。

この記事は役に立ちましたか?
8人中7人がこの記事が役に立ったと言っています