English Русский 中文 Español Deutsch Português
preview
知っておくべきMQL5ウィザードのテクニック(第05回):マルコフ連鎖

知っておくべきMQL5ウィザードのテクニック(第05回):マルコフ連鎖

MetaTrader 5テスター | 7 2月 2023, 09:52
695 0
Stephen Njuki
Stephen Njuki

はじめに

マルコフ連鎖は、金融をはじめとする様々な分野で、時系列データのモデル化や予測に利用できる強力な数学的ツールです。金融の時系列モデル化や予測では、株価や為替レートなど、金融資産の時間的変化をモデル化するためにマルコフ連鎖がよく使われます。  マルコフ連鎖モデルの大きな利点の1つは、そのシンプルさと使いやすさにあります。これらは、システムの時間的な進化を記述する単純な確率モデルに基づいており、複雑な数学的仮定やデータの統計的特性に関する仮定は必要ありません。このため、非常に複雑で非定常的な挙動を示す金融時系列データのモデル化や予測に特に役立ちます。

マルコフ連鎖モデルのモデル化は、離散時間マルコフ連鎖、連続時間マルコフ連鎖、隠れマルコフモデル、マルコフスイッチングモデルの4種類に大別されます。離散時間マルコフ連鎖は、一連の離散時間ステップに渡るシステムの進化をモデル化するのに用いられ、連続時間マルコフ連鎖は、連続期間に渡るシステムの進化をモデル化するのに用いられています。いずれも金融時系列データのモデル化と予測に利用できます。

金融時系列データからのマルコフ連鎖モデルの確率推定は、いくつかの方法でおこなうことができます。これから8つ挙げますが、その中で最も顕著なのが「期待値最大化法」です。これは、alglibで実装されている手法で、私のMQL5コードライブラリに採用されています。

マルコフ連鎖モデルの確率(パラメータ)が推定されると、そのモデルを用いて将来の状態や事象を予測することができるようになります。例えば、金融の時系列データの場合、現在の市場の状態と異なる市場の状態間の遷移確率から、マルコフ連鎖モデルを用いて将来の株価や為替レートを予測することができます。


連鎖のモデル化

マルコフ連鎖とは、ある状態から別の状態へ、ある確率的な規則に従って遷移する数学的体系です。マルコフ連鎖の特徴は、システムがどのようにして現在の状態に至ったかにかかわらず、特定の状態に遷移する確率は現在の状態と経過時間のみに依存することです。マルコフ連鎖は状態遷移図で表すことができ、図の各ノードが状態を表し、ノード間のエッジが状態間の遷移を表します。ある状態から別の状態に遷移する確率は、対応するエッジの重みで表現されます。

連鎖


図中の矢印(別名マルコフ連鎖)は、状態間の遷移を表しています。状態「雨天」から状態「晴天」に遷移する確率は、2つのノード間のエッジの重み(この場合0.1)で表すことができ、他の遷移についても同様に表すことができます。 


行列


この状態図を用いて、システムの状態間の遷移の確率をモデル化することができます。作成したモデルは、確率行列と呼ぶことの方が多いです。上図に示します。

マルコフ連鎖の重要な前提の1つは、システムの将来の振る舞いは現在の状態と経過時間のみに依存し、過去の履歴には依存しないことです。これはマルコフ連鎖の「メモリレス」な性質として知られています。つまり、現在の状態に到達するまでにいくつの中間状態を経由してきたかにかかわらず、ある状態から別の状態に遷移する確率は同じになります。

マルコフ連鎖は、金融システム、気象システム、生物システムなど、さまざまなシステムのモデル化に利用できます。特に、時系列など、現在の状態が過去の状態に依存するような時間依存性を示すシステムのモデル化に有効です。

マルコフ連鎖は、時間の経過とともに一定間隔で収集される一連のデータポイントである時系列データのモデル化に広く用いられています。時系列データは、金融、経済、気象、生物など、さまざまな分野で見られます。

マルコフ連鎖を用いて時系列データをモデル化するためには、まずシステムの状態とその間の遷移を定義する必要があります。状態間の遷移確率は、最尤推定や期待値最大化などの手法によってデータから推定することができます。遷移確率が推定されると、マルコフ連鎖を用いて、現在の状態と経過時間から将来の状態や事象を予測することができるようになります。

時系列のデータをモデル化するためにマルコフ連鎖を利用する方法はいくつかあります。

  1. 離散時間マルコフ連鎖:離散時間マルコフ連鎖は、一連の時間ステップにおける離散時間確率過程の発展を記述するために用いられる数学モデルです。これは、ある時点で任意の状態に遷移する確率が現在の状態のみに依存するような、一連の事象や状態をモデル化するために使用することができます。 

  2. 以下は、離散時間マルコフ連鎖を用いて日常の出来事をモデル化する例です。

    • 天気予報:特定の場所の毎日の天気をモデル化するために、離散時間マルコフ連鎖を使用することができます。マルコフ連鎖の状態は、晴れ、曇り、雨、雪などのさまざまな天候を表すことができます。過去の気象データから遷移確率を推定し、マルコフ連鎖を用いて、現在の気象状況から翌日の天気に関する予測をおこなうことができます。
    • 株価の動き:特定の株価の日々の動きをモデル化するために、離散時間マルコフ連鎖を使用することができます。マルコフ連鎖の状態は、上昇、下降、変化なしなどのさまざまなレベルの値動きを表すことができます。過去の株価データから遷移確率を推定し、マルコフ連鎖を用いて、現在の値動きから翌日の株価の方向性に関する予測をおこなうことができます。
    • 交通パターン:特定の道路や高速道路における毎日の交通パターンをモデル化するために、離散時間マルコフ連鎖を使用することができます。マルコフ連鎖の状態は、軽、中、重などのさまざまなレベルの渋滞を表すことができます。過去の交通データから遷移確率を推定し、マルコフ連鎖を用いて、現在の渋滞の度合いから翌日の渋滞の度合いに関する予測をおこなうことができます。
  3. 連続時間マルコフ連鎖:状態間の遷移が離散的な時間ステップではなく、連続的に発生します。つまり、ある状態から別の状態に遷移する確率は、最後に遷移してからの経過時間に依存します。連続時間マルコフ連鎖は、特定の高速道路での交通量や化学工場での化学反応速度など、異なる時間スパンで連続的に変化するシステムをモデル化するのによく使われます。離散時間マルコフ連鎖と連続時間マルコフ連鎖の大きな違いの1つは、連続時間マルコフ連鎖の遷移確率は、単位時間当たりにある状態から別の状態に遷移する確率である遷移率によって特徴づけられることです。これらの遷移率は、特定の期間である状態から別の状態へ遷移する確率を計算するために使用されます。

  4. 隠れマルコフモデル:隠れマルコフモデル(HMM)は、マルコフ連鎖の一種で、システムの状態が直接観測できず、一連の観測から推測される統計モデルです。以下は、隠れマルコフモデルを用いて日常の出来事をモデル化する例です。

    • 音声認識:隠れマルコフモデルは、発話時に発生する音をモデル化し、話し言葉を認識するために使用することができます。この場合、HMMの状態は異なる音素(音声)を表し、観測値は話し言葉を表す音波の列となります。HMMは、話し言葉とそれに対応する音波の大規模なデータセットで学習させることができ、観測された音波から最も可能性の高い音素の並びを推測することで、新しく話された言葉を認識するのに使用することができます。
    • 手書き文字認識:隠れマルコフモデルは、手書き時におこなわれるペンのストロークのシーケンスをモデル化し、手書き文字を認識するのに使用することができます。この場合、HMMの状態は異なるペンストロークを表し、観測値は手書き文字の画像のシーケンスとなります。HMMは、手書き文字とそれに対応する画像の大規模なデータセットで学習させることができ、観測された画像から最も可能性の高いペンストロークの順序を推測することで、新しく手書きされた文字を認識するのに使用することができます。
    • 活動の認識:隠れマルコフモデルは、センサーの読み取り値やビデオフレームなどの一連の観測データに基づいて人間の行動を認識するのに使用することができます例えば、歩く、走る、跳ぶなどの動作を認識するためにHMMを使用することができます。
  5. マルコフスイッチングモデル:マルコフスイッチングモデル(MSM)は、マルコフ連鎖の一種で、ある条件に基づいてシステムの状態が時間と共に変化する、つまり「スイッチ」することができるモデルです。以下は、マルコフスイッチングモデルを用いて日常の出来事をモデル化する例です。

    • 消費者行動:消費者の購買行動をモデル化するために、マルコフスイッチングモデルを使用することができます。MSMの状態は、高頻度購入や低頻度購入など、異なるタイプの購買行動を表すことができます。状態間の移行は、所得の変化や新製品の導入など、一定の条件に基づいておこなわれることが考えられます。MSMは、現在の状態と状態間の遷移確率から、将来の購買行動を予測するのに使用できます。
    • 経済指標:GDPや失業率などの経済指標をモデル化するために、マルコフスイッチングモデルを使用することができます。MSMの状態は、景気拡大や景気後退といった異なる経済状態を表すことができ、状態間の遷移は、金融政策や景気循環の変化といった一定の条件に基づいておこなうことができます。MSMは、現在の状態と状態間の遷移確率から、将来の経済状況を予測するのに使用できます。
    • 交通パターン:特定の道路や高速道路の交通パターンをモデル化するために、マルコフスイッチングモデルを使用することができます。MSMの状態は、軽、中、重などの渋滞の度合いを表し、状態間の遷移は、時間帯や曜日などの特定の条件に基づいておこなうことが考えられます。MSMは、現在の状態と状態間の遷移確率に基づいて、将来の交通パターンを予測するのに使用できます。


どのような仮説であっても、その根底には必ず前提があり、その仮説は何らかの形で制限を受ける傾向があります。マルコフ連鎖も例外ではありません。以下はその前提の一部です。

  1. 定常性:マルコフ連鎖の主要な前提の1つは、状態間の遷移確率が時間的に一定であることです。この仮定は定常性と呼ばれます。遷移確率が時間的に一定でない場合、マルコフ連鎖モデルは正確でない可能性があります。

  2. マルコフ性:マルコフ連鎖のもう1つの前提は、システムの将来の進化は現在の状態と経過時間のみに依存し、現在の状態より過去の履歴には影響されないというものです。この仮定は、特に複雑な依存関係や長期記憶を持つデータセットでは、実際には必ずしも成立しないかもしれません。

  3. 有限の状態空間:マルコフ連鎖は通常、有限状態空間上で定義されます。つまり、システムが取り得る状態の数は有限です。状態数の多いデータセットや連続変数には適さない場合があります。

  4. 斉時性:マルコフ連鎖は通常、斉時的であると仮定されます。つまり、状態間の遷移確率は、遷移が起こる特定の時間に依存しないということです。遷移確率が遷移する時間に依存する場合、マルコフ連鎖モデルは正確でない可能性があります。

  5. エルゴード性:マルコフ連鎖は通常エルゴード的であると仮定されます。つまり、有限回のステップで他の状態から任意の状態に到達することが可能です。この仮定が満たされないと、マルコフ連鎖モデルは正確でない可能性があります。

一般に、マルコフ連鎖モデルは、依存関係が比較的単純で、状態や変数の数が少ないデータセットに最も適しています。データセットに複雑な依存関係がある場合や、状態や変数の数が多い場合は、他のモデル化技術がより適切な場合があります。


確率推定

マルコフ連鎖をモデル化した後は、各状態から遷移する確率を推定する必要があります。使える手法はいくつもあり、それを繰り返すことでマルコフ連鎖の範囲と可能性を知ることができるでしょう。マルコフ連鎖における状態間の遷移の確率推定法には、以下のようなものがあります。

  1. 最尤推定(MLE):最尤推定(MLE)では、観測されたデータに基づいて、ある事象または一連の事象の確率を推定することが目的です。マルコフ連鎖の文脈では、観測された遷移の集合に基づいて、ある状態から別の状態に遷移する確率を推定することになります。

    マルコフ連鎖のMLEを実装するためには、まず観測された遷移の集合を集める必要があります。これは、シミュレーションをおこなうか、実世界のデータを収集することによっておこなうことができます。観測された遷移が得られたら、それを使って遷移確率を推定することができます。

    遷移確率を推定するには以下の手順をおこなうことができます。

    • 遷移確率を格納する行列を定義します。この行列はnum_states x num_states次元を持ちます。ここで、num_statesはマルコフ連鎖の状態数です。
    • すべての確率を0に設定して行列を初期化します。これは、行列の全要素を反復する入れ子ループを使用しておこなうことができます。
    • 観測された遷移を反復処理して、遷移確率を更新します。状態iから状態jへの遷移が観測されるごとに、確率 transition_probs[i][j]を1ずつ増加させます。
    • 遷移確率の和が1になるように正規化します。これには、行列の各要素を対応する行の要素の合計で割ります。


    遷移確率が推定できたら、それを使ってある状態から別の状態に遷移する可能性を予測することができます。例えば、状態iから状態jに遷移する確率を予測したい場合、P(j | i) = transition_probs[i][j]という式を用いることができます。

    .
  2. ベイズ確率:この手法では、ベイズの定理を利用し、新しいデータに基づいて、モデルパラメータの確率分布を更新します。マルコフ連鎖を用いたベイズ推定をおこなうには、まずマルコフ連鎖の状態に関する事前分布を定義する必要があります。この事前分布は、連鎖の異なる状態の確率に関する最初の信念を表しています。そして、新しい情報が得られると、ベイズ更新を利用して、状態の確率に関する信念を更新することができます。例えば、3つの状態を持つマルコフ連鎖があるとします。A, B, Cの3つの状態に対する事前分布があり、これは次のように表されます。

    P(A) = 0.4 P(B) = 0.3 P(C) = 0.3

    つまり、最初は状態Aになる確率が40%、状態Bになる確率が30%、状態Cになる確率が30%だと考えられるということです。

    ここで、システムが状態Aから状態Bに遷移するのを観測したとします。この新しい情報を使って、ベイズ確率推定により、状態の確率に関する信念を更新することができます。そのためには、状態間の遷移確率を知る必要があります。ここで、遷移確率を次のように仮定してみましょう。

    P(A -> B) = 0.8 

    P(A -> C) = 0.2 

    P(B -> A) = 0.1 

    P(B -> B) = 0.7 

    P(B -> C) = 0.2 

    P(C -> A) = 0.2 

    P(C -> B) = 0.3 

    P(C -> C) = 0.5

    この遷移確率は、ある状態から別の状態に遷移する確率を示すものです。例えば、状態Aから状態Bに遷移する確率は0.8であり、状態Aから状態Cに遷移する確率は0.2です。

    この遷移確率を用いて、ベイズ確率推定により、状態の確率に関する信念を更新することができます。特に、システムが状態Aから状態Bに遷移したという新しい情報があれば、ベイズの法則を使って状態に関する事後分布を計算することができます。この事後分布は、受け取った新しい情報を考慮して、状態の確率に関する考えを更新したものです。

    例えば、ベイズの法則を用いると、状態Aにあることの事後確率は以下のように計算できます。

    P(A | A -> B) = P(A -> B | A) * P(A) / P(A -> B)

    事前分布の値と遷移確率を代入すると、次のようになります。

    P(A | A -> B) = (0.8 * 0.4) / (0.8 * 0.4 + 0.1 * 0.3 + 0.2 * 0.3) = 0.36

    同様に、状態Bと状態Cにある事後確率を次のように計算することができます。

    P(B | A -> B) = (0.1 * 0.3) / (0.8 * 0.4 + 0.1 * 0.3 + 0.2 * 0.3) = 0.09

    .
  3. EMアルゴリズム:マルコフ連鎖の確率推定にEM法を使うには、マルコフ連鎖の状態間の遷移を一定期間観察する必要があります。このデータから、EMアルゴリズムを使って、観測されたデータに基づいて推定値を繰り返し精緻化することで、遷移確率を推定することができます。EMアルゴリズムは、期待値ステップ(Eステップ)と最大化ステップ(Mステップ)の2つのステップを交互におこなうことで動作します。Eステップでは、パラメータの現在の推定値が与えられたときの完全データ対数尤度の期待値を推定します。Mステップでは、パラメータに関する完全データの対数尤度の期待値を最大化し、パラメータの更新推定値を得ることができます。パラメータの推定値が安定した値に収束するまで、このステップを繰り返します。例えば、3つの状態(A、B、C)を持つマルコフ連鎖を観測し、状態間の遷移確率を推定したい場合、EMアルゴリズムを使って、観測データに基づいて遷移確率の推定値を反復的に改良することができます。

    EMを確率推定に用いる主な利点は、不完全なデータやノイズの多いデータを扱うことができ、基礎となる分布が完全に知られていない場合でも統計モデルのパラメータを推定することができるということです。ただし、EMは初期化の影響を受けやすく、対数尤度関数のグローバルな最大値に収束するとは限りません。また、対数尤度関数とその勾配を繰り返し評価する必要があるため、計算量が多くなる可能性があります。

  4. パラメトリック推定:マルコフ連鎖の確率推定にパラメトリック法を使うには、マルコフ連鎖の状態間の遷移を一定期間観察する必要があります。このデータから、基礎となる分布が正規分布や二項分布など特定の分布に従うと仮定して、遷移確率にパラメトリックモデルを当てはめることができます。そして、このモデルを用いて、ある状態から別の状態に遷移する確率を推定します。例えば、3つの状態(A、B、C)を持つマルコフ連鎖を観測し、状態Aから状態Bへの遷移が全20回中10回起こることが分かった場合、データに二項モデルをあてはめ、それを使って状態Aから状態Bへの遷移確率を推定することができます。

    パラメトリック確率推定の主な利点は、基礎となる分布を仮定しないノンパラメトリック手法よりも精度が高くなることです。ただし、この方法では、基礎となる分布について仮定を立てる必要があり、それが必ずしも適切でない場合や、偏った推定値を導く可能性があります。さらに、パラメトリック手法はノンパラメトリック手法に比べ、仮定した分布からの逸脱に敏感なため、柔軟性や堅牢性に欠けることがあります。

  5. ノンパラメトリック推定:マルコフ連鎖の確率推定にノンパラメトリック法を使うには、マルコフ連鎖の状態間の遷移を一定期間観察する必要があります。このデータから、ある状態から別の状態に遷移する確率を、遷移の回数を数えて、遷移の総数で割ることで推定することができるのです。例えば、A、B、Cの3つの状態を持つマルコフ連鎖を観測し、状態Aから状態Bへの遷移が全20回中10回発生したとすると、状態Aから状態Bへの遷移確率は0.5と見積もることができます。

    この確率推定法は経験分布法と呼ばれ、マルコフ連鎖の遷移だけでなく、あらゆる事象の集合の確率を推定することができます。ノンパラメトリック確率推定の主な利点は、基礎となる分布に関する仮定を必要としないため、柔軟でロバストな確率推定が可能であることです。しかし、確率をより正確に推定するために基礎となる分布を仮定するパラメトリック手法に比べると、精度が落ちることがあります。

  6. ブートストラップ法:これは、マルコフ連鎖やその他の確率モデルにおける確率を推定するために使用できる一般的な手法です。基本的な考え方は、少数の観測値を用いてシステムの状態に関する確率分布を推定し、その分布を用いて多数の合成観測値を生成することです。そして、合成観測値を用いて、より正確に確率分布を推定し、目的の精度が得られるまで、このプロセスを繰り返すことができます。

    マルコフ連鎖の確率推定にブートストラップ法を使うには、まずマルコフ連鎖の初期状態とその状態が必要です。ベイズ法と同様に、ブートストラップ法は既存のマルコフ連鎖を更新・改善します。連鎖の各状態は他の状態に遷移する確率と関連しており、異なる状態の組の間を遷移する確率はシステムの履歴とは無関係です。最初のマルコフ連鎖ができたら、ブートストラップ法でその状態に対する確率分布を推定することができます。これをおこなうには、いくつかの初期状態構成や状態間の遷移の短いシーケンスなど、システムの少数の観測から始めることになります。そして、これらの観測結果を用いて、システムの状態に関する確率分布を推定することができます。

    例えば、A、B、Cの3つの状態を持つマルコフ連鎖があり、システムが状態Aから状態Bへ数回、状態Bから状態Cへ数回遷移するのを観測した場合、これらの観測結果を用いて状態Aから状態B、状態Bから状態Cへの遷移確率を推定することができます。

    システムの状態に関する確率分布を推定したら、それを使ってシステムの合成観測値を大量に生成することができます。これは、確率分布からランダムにサンプリングして、状態間の遷移をシミュレートすることで実現できます。そして、合成観測値を用いて、より正確に確率分布を推定し、目的の精度に達するまで、このプロセスを繰り返すことができます。

    ブートストラップ法は、マルコフ連鎖の確率を推定するのに有効な手法です。なぜなら、少数の観測値を用いて多数の合成観測値を生成することができ、推定値の精度を高めることができるからです。また、実装が比較的簡単で、様々な確率モデルに対応できます。ただし、ブートストラップ法で得られる推定値の精度は、初期観測値と基礎となる確率モデルの質に依存し、他の推定手法と比較して必ずしも正確ではないことには注意が必要です。

  7. ジャックナイフ法:この手法では、マルコフ連鎖のシミュレーションを複数回おこない、その都度、異なる状態または状態群を省いていきます。そして、それぞれのシミュレーションで発生した事象の確率を平均化することで、事象の発生確率を推定します。より詳しく説明すると次のようになります。
    • マルコフ連鎖を設定し、対象となる事象を定義します。例えば、連鎖内の特定の状態に到達することや、2つの特定の状態の間を遷移することが事象として考えられます。
    • マルコフ連鎖のシミュレーションを複数回おこない、その都度、異なる状態または状態群を省きます。これは、シミュレーションを実行する際に、除外された状態を考慮しないか、その遷移確率をゼロに設定することで実現できます。
    • 各シミュレーションについて、事象が発生する確率を計算します。これには、詳細なバランス分析をおこなうか、モンテカルロサンプリングや行列乗算などの手法を用います。
    • 各シミュレーションで発生した事象の確率を平均化し、完全なマルコフ連鎖で発生した事象の確率の推定値を得ることができます。

    マルコフ連鎖の確率推定にジャックナイフ法を用いることには、いくつかの利点があります。1つ目は、個々の状態が全体の確率に与える影響を考慮するため、事象の発生確率をより正確に推定できることです。2つ目は、導入が比較的簡単で、自動化も容易におこなえることです。ただし、ジャックナイフ法には制限もあります。制限の1つは、マルコフ連鎖のシミュレーションを複数回おこなう必要があり、大規模・複雑な連鎖では計算量が多くなることです。さらに、推定値の精度は、シミュレーションで除外する状態の数と選択に依存する可能性があります。

  8. 交差検証:この手法は、マルコフ連鎖の中で特定の事象が発生する確率を推定するために用いることができます。これは、データをいくつかのサブセットに分割し、それぞれをテストセットとして使用し、そのサブセットに対するモデルのパフォーマンスを評価するものです。交差検証による確率推定をマルコフ連鎖でおこなうには、まずマルコフ連鎖に望ましい状態や遷移を設定する必要があります。そして、データを所望の倍率に分割します。次に、それぞれのサブセットを反復処理してテストセットとして使用し、そのサブセットに対するモデルのパフォーマンスを評価します。これは、マルコフ連鎖を用いて、テストセット内で各事象が発生する確率を推定し、その推定値とテストセット内の実際の結果を比較するものです。

    最後に、すべてのサブセットのパフォーマンスを平均して、モデルのパフォーマンスの全体的な推定値を得ます。これは、モデルの性能を評価し、マルコフ連鎖のパラメータを微調整して精度を向上させるのに役立ちます。交差検証による確率推定をマルコフ連鎖でおこなうためには、データが独立的かつ同一に分布していること、つまり、データの各サブセットがデータセット全体を代表している必要があることに注意することが重要です。

これらの手法にはそれぞれ長所と短所があり、どの方法を選択するかは、データの具体的な特性や分析の目的によって決まります。


MQL5ウィザードによる実装

マルコフ連鎖を実装したシグナルクラスをコーディングするには、alglibフォルダ下のdataanalysis.mqhファイルにあるCMarkovCPDクラスを使用することにします。連鎖を離散時間連鎖としてモデル化することにします。この離散時間連鎖は、終値の直近5回分の変化という5つの状態を持ちます。そのため、エキスパートアドバイザー(EA)でテストまたは実行される時間枠が、離散時間単位を定義します。状態間の遷移の確率を推定するために、CMarkovCPDクラスは、モデルを訓練するためにトラック(学習データ)を追加する必要があります。追加されるトラックの数は、入力最適化パラメータ m_signal_tracksになります。このように、モードを初期化し、トラックを追加することになります。

      CMCPDState _s;
      CMatrixDouble _xy,_p;
      CMCPDReport _rep;
      int _k=m_signal_tracks;
      
      _xy.Resize(m_signal_tracks,__S_STATES);
      
      m_close.Refresh(-1);
      
      for(int t=0;t<m_signal_tracks;t++)
      {
         for(int s=0;s<__S_STATES;s++)
         {
            _xy[t].Set(s,GetState(Close(Index+t+s)-Close(Index+t+s+1),Close(Index+t+s+1)-Close(Index+t+s+2)));
         }
      }

終値データは1.0程度に正規化されています。終値の変化がマイナスの場合、入力データは1.0より小さくなり、逆にプラスの場合、入力は1.0より大きくなり、変化がなければちょうど1.0となります。この正規化は、以下に示すGetState関数によっておこなわれます。

//+------------------------------------------------------------------+
//| Normalizer.                                                      |
//+------------------------------------------------------------------+
double CSignalMC::GetState(double NewChange,double OldChange)
   {
      double _state=0.0;
      
      double _norm=fabs(NewChange)/fmax(m_symbol.Point(),fabs(NewChange)+fabs(OldChange));
      
      if(NewChange>0.0)
      {
         _state=_norm+1.0;
      }
      else if(NewChange<0.0)
      {
         _state=1.0-_norm;
      }
      
      return(_state);
   }

データを追加したら、CMCPDStateクラスのインスタンスを初期化する必要があります。これは、すべてのモデルデータを処理し、確率推定の計算に役立つオブジェクトです。次をおこないます。

      CPD.MCPDCreate(__S_STATES,_s);
      
      CPD.MCPDAddTrack(_s,_xy,_k);
      
      CPD.MCPDSetTikhonovRegularizer(_s,m_signal_regulizer);
      
      CPD.MCPDSolve(_s);
      
      CPD.MCPDResults(_s,_p,_rep);

m_signal_regulazier入力パラメータは、理想的には抽象的なdouble値ではなく、トラックデータの大きさを代表するdouble値であるべきです。つまり、'GetState関数から取得したトラックデータに比例しているはずです。理想的には0.5~0.0の範囲に最適化するとして、Tikhonovレギュライザーを使う場合は、最大のトラックデータの大きさを掛け合わせる必要があることになります。 

_p行列は、状態間の遷移の確率をすべて含む遷移行列です。シグナルクラスの全コードは記事の最後に添付しています。

2022年のEURJPYを日足で試運転してみました。以下はレポートの一部とそれに付随するエクイティカーブです。

report_1


curve_1



結論

マルコフ連鎖は、金融市場の挙動をモデル化するために用いることができる数学的ツールです。特に、現在の市場の状態から将来の市場の状態の確率を分析することができるため、トレーダーにとって有用です。トレーダーがどの取引をいつおこなうかについて、十分な情報を得た上で判断することができるようにする、取引において非常に有効な手段です。

金融市場でマルコフ連鎖を利用する主な利点の1つは、トレーダーが市場のトレンドの時間的変化を分析・予測することができることです。特に、トレンドの変化が激しく、市場の動きを予測することが難しい、変化の激しい市場においては、このことが重要です。マルコフ連鎖を利用することで、トレーダーは市場がとるであろう最も可能性の高い経路を特定し、その情報をもとに売買の意思決定をおこなうことができます。

マルコフ連鎖のもう1つの利点は、様々な取引に関連するリスクの分析に利用できることです。トレーダーは、さまざまな市場の状態の確率を分析することで、さまざまな取引に関連するリスクを判断し、成功する可能性が最も高い取引を選択することができます。これは、損失のリスクが高いボラティリティの高いマーケットで特に有効です。

結論として、マルコフ連鎖は、トレーダーが市場の挙動を分析・予測し、市場がとるであろう最も可能性の高い経路を特定し、さまざまな取引に伴うリスクを評価できるため、金融市場のトレーダーにとって不可欠なツールになっています。


MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/11930

添付されたファイル |
Signal_MCPD.mqh (8.06 KB)
Linux上のMetaTrader 5のC++マルチスレッドサポートを備えた概念実証DLLを開発する Linux上のMetaTrader 5のC++マルチスレッドサポートを備えた概念実証DLLを開発する
最終製品がWindowsとLinuxシステムの両方でシームレスに動作するMetaTrader 5プラットフォームの開発をLinuxシステムのみでおこなう方法のステップとワークフローを探索する旅を始めます。WineとMinGWについて学ぶことができます。これらはどちらも、クロスプラットフォーム開発を機能させるために不可欠なツールです。特に、MinGWのスレッド実装(POSIXおよびWin32)については、どれを使用するかを選択する際に考慮する必要があります。次に、概念実証のDLLを構築し、それをMQL5コードで使用して、最後に両方のスレッド実装のパフォーマンスを比較します。すべては読者の基盤が自力でさらに拡大するようにするためです。この記事を読めば、LinuxでMT関連のツールを快適に構築できるはずです。
MQL5の圏論(第2回) MQL5の圏論(第2回)
圏論は数学の一分野であり、多様な広がりを見せていますが、MQL5コミュニティではまだ比較的知られていません。この連載では、その概念のいくつかを紹介し、考察することで、コメントや議論を呼び起こし、トレーダーの戦略開発におけるこの注目すべき分野の利用を促進することを目的としたオープンなライブラリを確立することを目指しています。
行列ユーティリティ - 行列とベクトルの標準ライブラリの機能を拡張する 行列ユーティリティ - 行列とベクトルの標準ライブラリの機能を拡張する
行列は大規模な数学的演算を効率的に処理できるため、機械学習アルゴリズムや一般的なコンピュータの基盤となっています。標準ライブラリは必要なものをすべて備えていますが、ユーティリティファイルでライブラリにはまだないいくつかの関数を導入して、拡張する方法を見てみましょう。
ゲータ―オシレーター(Gator Oscillator)による取引システムの設計方法を学ぶ ゲータ―オシレーター(Gator Oscillator)による取引システムの設計方法を学ぶ
人気のあるテクニカル指標に基づいて取引システムを設計する方法を学ぶ本連載の新しい記事では、ゲータ―オシレーターテクニカル指標を取り上げ、簡単な戦略を通じて取引システムを作成する方法について学びます。