見出し画像

ベイズ統計をFX自動売買ツールに取り入れるためのサンプルコード

この記事の最後では、MCMC(マルコフ連鎖モンテカルロ法)とベイズ推定を用いて、確率的に有利なエントリーポイントを見つけ、テクニカル指標(RSIとボリンジャーバンド)を基に短期取引を行うFX自動売買戦略のサンプルコードを掲載しています。

そのため、まずは「ベイズ統計とは何か」「どのように活用されているか」といった一般的な内容から始め、FX取引に応用するための考え方を順を追って解説します。

例えば、野球の投球戦略決定(特定の状況で、ストレートを投げるべきかスライダーを投げるべきか)にベイズ統計が使われるシミュレーションを通じて、ベイズ統計が意思決定に役立つ方法を説明しイメージを具体化してから、FX取引の戦略決定(特定の状況で、買いポジションを取るべきか否か)の話に発展させます。

最後には、Python-EAを使用し、FX自動売買ツールにベイズ統計を活用したロジックを組み込む具体的な手法(コード全文)をご紹介していますので、ぜひ最後までご覧ください。


ベイズ統計とは

ベイズ統計は、事前の知識や経験から得られた「事前確率」を活用して、新しい情報が得られたときに確率を更新する手法です。この手法では、ベイズの定理を基礎にして、データや証拠が新しく得られるたびにその確率を再計算し、判断や予測の精度を高めます。
実際の活用例をいくつか簡単に紹介します。

コロナ検査の真陽性率

新型コロナウイルスの検査において、検査結果が陽性であっても必ずしも感染しているとは限りません。この場合、ベイズ統計を用いて「真陽性率」(検査が陽性だった場合に実際に感染している確率)を求めます。ここでは、検査の感度(実際に感染している人を陽性と判断する確率)、特異度(感染していない人を陰性と判断する確率)、および感染率といった「事前確率」を用います。これにより、特定の状況下で陽性結果の信頼性を高め、無駄な隔離や不安を避けられます。

以下の記事でより詳しく解説しています。ぜひあわせてご覧ください。

野球の投球戦略決定

野球では、ピッチャーが投げる球の種類やコースの選択が勝負を左右します。ここで、バッターの過去の傾向や試合状況といった「事前情報」を基に、次の投球がどのくらいの確率でヒットされるかなどを予測するのにベイズ統計が用いられます。ピッチャーは、新しい試合データをもとにバッターの反応を分析し、次の球の戦略を動的に調整できます。こうした確率の更新がリアルタイムで行われるため、ピッチャーの投球パターンや配球をより効率的に管理できます。

医療診断や病気予測

医療分野では、患者の症状や年齢、生活習慣といった情報に基づき、病気の可能性を予測するためにベイズ統計が使用されます。例えば、心臓病のリスク予測では、患者の家族歴や血液検査のデータなどを基にして、特定の検査結果が出た場合の病気の確率を算出します。新しい症状や検査結果が追加されるごとに予測が更新され、より正確な診断が可能となります。

自動運転技術

自動運転車は、ベイズ統計を活用して周囲の状況をリアルタイムで解析し、危険のある物体(車両や歩行者など)の動きを予測します。これには、周辺の物体の位置や速度、方向の「事前情報」としてのデータをもとにし、新しいセンサー情報が得られるたびに予測を更新することで、運転の安全性を確保しています。

ベイズ統計の重要なポイントは、初めに設定した「事前確率」が新しいデータによってアップデートされていくことで、次第に精度が増していく点です。この性質を活かし、データに基づいた柔軟な判断が求められるさまざまな分野で広く応用されています。

野球の投球戦略決定の具体例

さらに、野球の戦略決定におけるベイズ統計の活用を、投球戦略の最適化という観点から、実際に近い複雑な数値例を使ってシミュレーションしてみます。

シナリオ設定

  • 対戦打者:中村選手(右打者、パワーヒッター)

  • 投手:田中投手(右投げ、ストレートとスライダーが持ち球)

  • 試合状況

    • 9回裏、2アウト、ランナー二塁

    • スコアは3対2で自チームがリード

    • カウントは2ボール2ストライク

目的

この状況で、田中投手が次に投げるべき球種(ストレートまたはスライダー)を、試合状況を考慮に入れてベイズ統計を用いて最適化します。

既知のデータ

1. 中村選手の打率(2ストライク時)

  • ストレートに対する打率:.250

  • スライダーに対する打率:.150

2. 田中投手のストライク率(2ストライク時)

  • ストレートのストライク率:75%

  • スライダーのストライク率:60%

3. 試合状況の影響

  • 投手の球種選択傾向

    • リードしている僅差の場面では、投手は制球の良い球種を選ぶ傾向がある。

    • ストレートはストライク率が高く、四球のリスクが低い。

  • 打者の傾向

    • ランナー二塁の場面では、打者はヒット長打を狙いやすく、変化球に対してミスショットをする可能性が高まる。

ベイズ統計の適用

目的変数

  • 次の球で打者をアウトにできる確率

仮説

  • H:ストレートを投げた場合にアウトにできる確率

  • H':スライダーを投げた場合にアウトにできる確率


1. 事前確率の設定(P(H), P(H'))

試合状況を考慮して、田中投手が各球種を投げる確率を設定します。

  • ストレートを投げる確率(P(H))0.7

    • リードしている場面で、制球の良いストレートを選ぶ傾向を反映。

  • スライダーを投げる確率(P(H'))0.3

    • P(H') = 1 - P(H)

2. 尤度の計算(P(E|H), P(E|H'))

試合状況が打者の打率に与える影響を考慮します。

  • ストレートのアウト率(P(E|H))

    • 打率が.250なので、アウト率は1 - 0.250 = 0.750

    • しかし、プレッシャーのかかる場面で打者のパフォーマンスが低下すると仮定し、アウト率を5%増加させます。

    • 修正後のアウト率:0.750 × 1.05 = 0.7875

  • スライダーのアウト率(P(E|H'))

    • 打率が.150なので、アウト率は1 - 0.150 = 0.850

    • 打者が変化球に弱くなると仮定し、アウト率を10%増加させます。

    • 修正後のアウト率:0.850 × 1.10 = 0.935

3. ベイズの定理の適用

ベイズの定理を使って、球種ごとに打者をアウトにできる事後確率を計算します。

ベイズの定理

ストレートの場合
P(E∣H) = 0.7875, P(H) = 0.7
P(E∣H) × P(H) = 0.7875 × 0.7 = 0.55125

スライダーの場合
 P(E∣H') = 0.935, P(H') = 0.3
 P(E∣H') × P(H') = 0.935 × 0.3 = 0.2805

事後確率の計算
P(H∣E) = 0.55125 / (0.55125 + 0.2805) = 0.55125 / 0.83175 ≈ 0.6629

P(H'∣E) = 0.2805 / (0.55125 + 0.2805) = 0.2805 / 0.83175 ≈ 0.3371

結論

  • ストレートでアウトにできる確率:約66.3%

  • スライダーでアウトにできる確率:約33.7%

この結果から、ストレートを投げる方が打者をアウトにできる確率が高いと判断されます。


実装コード

# 必要なライブラリのインポート
import numpy as np

# パラメータの設定

# 事前確率(球種の選択傾向を反映)
P_H = 0.7       # ストレートを投げる事前確率
P_H_prime = 0.3 # スライダーを投げる事前確率(1 - P_H)

# 尤度(打率に基づくアウト率を試合状況で調整)

# ストレートのアウト率
base_out_rate_fastball = 1 - 0.250           # 中村選手のストレートに対する打率を使用
adjusted_out_rate_fastball = base_out_rate_fastball * 1.05 # プレッシャーで5%増加
P_E_given_H = adjusted_out_rate_fastball     # ストレートでアウトにできる確率

# スライダーのアウト率
base_out_rate_slider = 1 - 0.150             # 中村選手のスライダーに対する打率を使用
adjusted_out_rate_slider = base_out_rate_slider * 1.10 # プレッシャーで10%増加
P_E_given_H_prime = adjusted_out_rate_slider # スライダーでアウトにできる確率

# ベイズの定理を用いた事後確率の計算

# ストレートを投げる場合の事後確率計算
numerator_fastball = P_E_given_H * P_H
numerator_slider = P_E_given_H_prime * P_H_prime
denominator = numerator_fastball + numerator_slider

P_H_given_E = numerator_fastball / denominator
P_H_prime_given_E = numerator_slider / denominator

# 結果の表示
print(f"ストレートでアウトにできる事後確率:約{P_H_given_E:.2%}")
print(f"スライダーでアウトにできる事後確率:約{P_H_prime_given_E:.2%}")

# 判断
if P_H_given_E > P_H_prime_given_E:
    print("この結果から、ストレートを投げる方が打者をアウトにできる確率が高いと判断されます。")
else:
    print("この結果から、スライダーを投げる方が打者をアウトにできる確率が高いと判断されます。")

コードの解説

  1. 事前確率の設定

    • ストレートを投げる確率 P_H = 0.7 と、スライダーを投げる確率 P_H_prime = 0.3 を設定します。

  2. 尤度の計算

    • ストレートのアウト率(P(E|H))は、中村選手のストレートに対する打率(.250)から導かれるアウト率 0.750 に5%増加させて0.7875とします。

    • スライダーのアウト率(P(E|H'))は、中村選手のスライダーに対する打率(.150)から導かれるアウト率 0.850 に10%増加させて0.935とします。

  3. ベイズの定理による事後確率の計算

    • ストレートの場合の事後確率 P(H|E) とスライダーの場合の事後確率 P(H'|E) を計算します。

  4. 結果の表示と判断

ストレートでアウトにできる事後確率:約66.29%
スライダーでアウトにできる事後確率:約33.71%
この結果から、ストレートを投げる方が打者をアウトにできる確率が高いと判断されます。

まとめ

試合状況を考慮に入れることで、投球戦略の最適化がより現実的になります。このシナリオでは、ストレートを投げる方が打者をアウトにできる確率が高いと判断されました。これは、リードしている場面で制球の良いストレートを選ぶことが合理的であることを示しています。
パラメータ部分を実際の状況に置き換えることで、様々な場面で適用することが可能になります。

補足

このシミュレーションでは、簡略化のためにいくつかの仮定を置いています。実際の分析では、以下のような追加の要素も考慮することが可能でしょう。

  • 投手の疲労度:球速や制球力への影響

  • 打者の最近の調子:直近の試合でのパフォーマンス

  • 天候条件:風向きや湿度が打球の飛距離に与える影響

  • 心理的要素:プレッシャーや対戦相手との相性

これらの要素をすべて組み込んだより複雑なモデルを作成し、ベイズ推論を用いてより最適な戦略を導き出すことも考えられます。

FX取引におけるベイズ統計の活用

さて、先ほどの野球の例から派生してイメージしやすいように、文脈や段落構成をなるべく合わせる形で、題材をFX取引に置き換えて考えてみます。

シナリオ設定

  • 通貨ペア:USD/JPY(ドル円)

  • 市場状況

    • 米国の経済指標発表直後でボラティリティが高い

    • 経済指標の内容がポジティブで、米ドルに対してやや上昇のバイアスがある

    • 15分足のボリンジャーバンドの下限に接触

    • 相対力指数(RSI)が30で、売られ過ぎの状態


目的

この状況で、次の15分間でUSD/JPYが上昇する確率をベイズ統計を用いて推定し、ロング(買い)ポジションを取るべきかどうかの判断を行います。


既知のデータ

1. USD/JPYの過去の動向

  • ボリンジャーバンド下限接触時の上昇確率:70%

  • RSIが30以下のときの上昇確率:65%

2. 経済指標の影響

  • 今回の経済指標がポジティブな内容であり、上昇のバイアスがかかっていると仮定します。

  • 経済指標のポジティブな影響を踏まえ、事前確率を上昇方向に調整します。


ベイズ統計の適用

目的変数

  • 次の15分間でUSD/JPYが上昇する確率

仮説

  • H:次の15分間でUSD/JPYが上昇する確率

  • H':次の15分間でUSD/JPYが下降する確率


1. 事前確率の設定(P(H), P(H'))

経済指標がポジティブで、上昇方向へのバイアスがかかっているため、事前確率を以下のように設定します。

  • 上昇の事前確率 P(H):55%(0.55)

  • 下降の事前確率 P(H'):45%(0.45)

2. 尤度の計算(P(E|H), P(E|H'))

市場状況に基づき、上昇の条件付き確率(P(E|H))と下降の条件付き確率(P(E|H'))を以下の条件に基づいて計算します。

  • ボリンジャーバンド下限接触時の上昇確率:70%

  • RSIが30以下のときの上昇確率:65%

これらの条件が重なる場合、上昇の確率がさらに高まると考えられるため、重複を避けるために両者の平均値を使用します。

  • 上昇の条件付き確率 P(E|H)

    • P(E∣H) = (0.70+0.65) / 2 = 0.675

  • 下降の条件付き確率 P(E|H')

    • P(E∣H') = 1 − P(E∣H) = 1 − 0.675 = 0.325


3. ベイズの定理の適用

ベイズの定理

上昇の場合
P(E∣H) = 0.675, P(H) = 0.55
P(E∣H) × P(H) = 0.675 × 0.55 = 0.37125

下降の場合
P(E∣H') = 0.325, P(H') = 0.45
P(E∣H') × P(H') = 0.325 × 0.45 = 0.14625

事後確率の計算
P(H∣E) = 0.37125 / (0.37125 + 0.14625) = 0.37125 / 0.5175 ≈ 0.7175
P(H'∣E) = 1−P(H∣E) = 1−0.7175 = 0.2825


結論

事後確率の結果は次の通りです:

  • 上昇の事後確率 P(H|E):約71.75%

  • 下降の事後確率 P(H'|E):約28.25%

この結果から、上昇の確率が71.75% と高いため、次の15分間でUSD/JPYが上昇する可能性が比較的高く、ロング(買い)ポジションを取ることが有利と判断されます。


実装コード

# 必要なライブラリのインポート
import numpy as np

# シナリオに基づいたパラメータ設定

# 事前確率(経済指標のポジティブな影響を反映)
P_H = 0.55       # 上昇の事前確率(55%)
P_H_prime = 0.45 # 下降の事前確率(45%)

# 尤度の計算(ボリンジャーバンドとRSIの影響を反映)

# 上昇の条件付き確率 P(E|H)(ボリンジャーバンド下限接触およびRSI30以下の影響を反映)
# ボリンジャーバンド下限での上昇確率:70%、RSIが30以下のときの上昇確率:65%
P_E_given_H = (0.70 + 0.65) / 2  # 上昇の条件付き確率(重複を避けるため平均を使用)

# 下降の条件付き確率 P(E|H') は 1 - P(E|H) として計算
P_E_given_H_prime = 1 - P_E_given_H

# ベイズの定理を用いた事後確率の計算

# 上昇を選んだ場合の事後確率計算
numerator_up = P_E_given_H * P_H
numerator_down = P_E_given_H_prime * P_H_prime
denominator = numerator_up + numerator_down

P_H_given_E = numerator_up / denominator
P_H_prime_given_E = numerator_down / denominator

# 結果の表示
print(f"上昇の事後確率 P(H|E):約{P_H_given_E:.2%}")
print(f"下降の事後確率 P(H'|E):約{P_H_prime_given_E:.2%}")

# 判断
if P_H_given_E > P_H_prime_given_E:
    print("この結果から、上昇の確率が高いため、ロング(買い)ポジションを取るのが有利と判断されます。")
else:
    print("この結果から、下降の確率が高いため、ポジションを取らないか、ショートポジションを検討するのが有利と判断されます。")

コードの解説

  1. 事前確率の設定

    • 経済指標がポジティブであるため、上昇の事前確率 P_H = 0.55、下降の事前確率 P_H_prime = 0.45 に設定しています。

  2. 尤度の計算

    • 上昇の条件付き確率 P(E|H) は、ボリンジャーバンド下限接触時の上昇確率(70%)とRSIが30以下のときの上昇確率(65%)の平均で計算し、0.675とします。

    • 下降の条件付き確率 P(E|H') は、上昇の条件付き確率の補数として 1 - P(E|H) = 0.325 で計算します。

  3. ベイズの定理を用いた事後確率の計算

    • ベイズの定理を用いて、上昇と下降のそれぞれの事後確率を計算します。

  4. 結果の表示と判断

上昇の事後確率 P(H|E):約71.75%
下降の事後確率 P(H'|E):約28.25%
この結果から、上昇の確率が高いため、ロング(買い)ポジションを取るのが有利と判断されます。

まとめ

  • 事前確率の設定:米国の経済指標発表がポジティブな内容であったため、上昇の事前確率をやや高めの55%に設定しました。

  • 条件付き確率の計算:ボリンジャーバンドの下限接触とRSIが30以下の状態から、上昇の条件付き確率を0.675としました。

  • 事後確率の結果:事後確率が71.75%と高く、上昇の可能性が強いため、買いポジションを取るのが有利と判断されます。

MCMC(マルコフ連鎖モンテカルロ法)

続いて、MCMC(マルコフ連鎖モンテカルロ法)を使ってこのベイズ推論をさらに進化させる方法について説明します。MCMCを導入することで、複雑な確率分布からより精度の高いサンプリングが可能になり、上昇確率や下降確率の事後分布をより正確に推定できます。これにより、より多くの要因や不確実性を考慮し、トレード判断の精度を上げることが可能になるはずです。

まずは、MCMCを使わない場合のベイズ推論と、MCMCを使った場合の違いや利点を具体的に説明します。

1. ベイズ推論の基本アプローチ

通常のベイズ推論では、事前確率と尤度(観測データからの情報)を組み合わせて、事後確率を計算します。しかし、事後分布が単純な形でない場合(例えば、複雑な関数や高次元のデータが絡む場合)、正確な事後分布の計算が非常に難しくなります。特に、FX取引のように様々な市場要因が絡み合う複雑なモデルでは、計算が現実的に不可能なこともあります。

2. MCMCを使わないベイズ推論の制約

MCMCを使わずにベイズ推論を行う場合、以下の制約があります。

  • シンプルな事後分布に限定される:通常の計算方法では、事後分布が単純な形(例えば正規分布や一様分布)であることが前提となりがちです。しかし、複数の要因が絡むと、事後分布が複雑になり、計算が困難になります。

  • 事前確率と尤度を簡略化する必要がある:複雑な条件を無理に簡略化する必要があるため、FX取引のような動的で多要因のモデルでは正確な確率が得られない場合があります。

  • 不確実性の評価が難しい:単純なベイズ推論では事後分布の「平均値」を計算することは可能ですが、「信頼区間」や「不確実性の幅」を適切に評価することが困難です。特に、価格の上下が不安定な環境では、信頼区間が分からないとリスク管理が難しくなります。


3. MCMCを使うメリット

MCMCを使うことで、複雑な事後分布のサンプリングが可能になり、以下のような利点が得られます。

A. 複雑な分布でも精度の高い推定が可能

MCMCは、事後分布がどんな形状であっても、その分布からランダムにサンプルを取る方法です。サンプルを多数取得して事後分布を近似するため、通常のベイズ推論では扱えない複雑な分布でも精度の高い推定が可能です。これにより、複数の市場要因が絡むFXのようなモデルでも、実際の市場状況に即した推論が可能になります。

B. 信頼区間や不確実性の幅を評価できる

MCMCは事後分布の形状全体をサンプリングできるため、分布の平均値だけでなく、信頼区間(例えば95%区間)や不確実性の幅を正確に評価できます。これにより、FX取引でのリスク管理がしやすくなります。例えば、上昇確率の95%信頼区間が60%から75%なら、リスクが比較的低いと判断しやすくなります。

C. 複数の要因を同時に考慮できる

MCMCを使うことで、ボリンジャーバンド、RSI、ボラティリティ、経済指標の発表タイミングなど、複数の要因を同時に組み合わせた複雑なモデルを構築できます。MCMCが各要因の影響を反映させたサンプリングを行うため、通常のベイズ推論よりも多くの情報に基づいた確率を算出でき、より現実的なトレード判断を下すことが可能です。

D. 動的な市場環境に対応できる

FX市場は刻々と変動しますが、MCMCはその場のデータに基づき、新しい条件での分布をサンプリングして更新するのが得意です。たとえば、市場のボラティリティが急上昇した場合も、MCMCがその条件下での事後分布をサンプリングし、短期的なトレンドの変化に即応できます。これにより、静的な前提に基づく従来のベイズ推論よりも柔軟な取引判断が可能です。

MCMCを用いたFX取引戦略

それでは、シナリオの前提も少し複雑にした上で、MCMC(マルコフ連鎖モンテカルロ法)を使ったシミュレーションに進化させてみます。

シナリオ設定

通貨ペア:USD/JPY

市場状況

  • 米国の経済指標発表直後でボラティリティが高く、ポジティブな内容が発表されたことから、米ドルに対して上昇のバイアスがかかっている。

  • ボラティリティは過去1週間の平均値を超えており、経済指標の信頼度に不確実性があるため、短期的な変動の幅が増大する傾向にある。

  • 15分足のボリンジャーバンドの下限に接触し、相対力指数(RSI)は30で、売られ過ぎの状態。

目的

この状況で、次の15分間でUSD/JPYが上昇する確率をベイズ統計とMCMCサンプリングを用いて推定し、ロング(買い)ポジションを取るべきかどうかを判断します。


既知のデータ

  1. USD/JPYの過去の動向

    • ボリンジャーバンド下限接触時の上昇確率:70%(±5%の範囲で変動)

    • RSIが30以下のときの上昇確率:65%(±10%の範囲で変動)

  2. 経済指標の影響と不確実性

    • 経済指標の内容がポジティブであるため、上昇方向へのバイアスがかかっている。ただし、指標の内容に対する信頼度に幅があり、通常の影響よりも±15%の変動が想定される。

    • 上昇確率への事前バイアスを50%から65%の範囲で設定。


ベイズ統計の適用

目的変数

次の15分間でUSD/JPYが上昇する確率

仮説

  • H:次の15分間でUSD/JPYが上昇する確率

  • H':次の15分間でUSD/JPYが下降する確率

  1. 事前確率の設定(P(H), P(H'))

    • 経済指標の内容がポジティブで、上昇方向へのバイアスがかかっているため、上昇の事前確率を50%から65%の範囲でベータ分布に基づきランダムに設定します。ベータ分布は観測データを追加するごとに容易に更新でき、ベイズ推定に適しています。

  2. 尤度の計算(P(E|H), P(E|H'))

    • 市場状況に基づき、ボリンジャーバンドとRSIの影響を考慮しますが、ボラティリティが高いため、条件付き確率の計算にも±範囲の不確実性を加味します。

      • ボリンジャーバンド下限接触時の上昇確率:70% ± 5%

      • RSIが30以下のときの上昇確率:65% ± 10%

    • これらの条件が重なる場合、上昇の確率を条件付き確率の範囲で変動させ、MCMCサンプリングで各サンプリングごとに条件付き確率のランダムな変動を考慮します。

実装コード

# 必要なライブラリのインポート
import numpy as np
import pymc as pm

# 事前分布の設定(上昇バイアスに幅を持たせて設定)
alpha_prior = 5  # 上昇確率にバイアスがあるため、ベータ分布のalphaを高めに設定
beta_prior = 3   # 下降バイアスの低さを反映し、betaを小さく設定

# ボリンジャーバンドとRSIの影響の幅を反映(確率の幅の設定)
mean_bollinger_prob = 0.70
bollinger_variance = 0.05
mean_rsi_prob = 0.65
rsi_variance = 0.10

# MCMCによるベイズ推定の実行
with pm.Model() as model:
    # 上昇確率の事前分布(ベータ分布)
    theta = pm.Beta('theta', alpha=alpha_prior, beta=beta_prior)
    
    # 尤度の設定:ボリンジャーバンドとRSIの影響を条件付き確率として設定
    P_E_given_H = pm.Normal('P_E_given_H', mu=mean_bollinger_prob, sigma=bollinger_variance)
    P_E_given_H_prime = pm.Normal('P_E_given_H_prime', mu=mean_rsi_prob, sigma=rsi_variance)
    
    # 条件付き確率に基づく観測モデル
    likelihood_up = pm.Bernoulli('likelihood_up', p=theta * P_E_given_H, observed=1)
    likelihood_down = pm.Bernoulli('likelihood_down', p=(1 - theta) * P_E_given_H_prime, observed=0)
    
    # MCMCサンプリングの実行
    trace = pm.sample(1000, tune=500, cores=1, random_seed=42)

# 事後分布の解析と結果の表示
posterior_samples = trace.posterior['theta'].values.flatten()
mean_posterior = np.mean(posterior_samples)
cred_interval = pm.hdi(posterior_samples, hdi_prob=0.95)

print(f"上昇の事後確率(平均): 約{mean_posterior:.2%}")
print(f"95%信用区間: [{cred_interval[0]:.2%}, {cred_interval[1]:.2%}]")

# 判断
if mean_posterior > 0.5:
    print("この結果から、上昇の確率が高いため、ロング(買い)ポジションを取るのが有利と判断されます。")
else:
    print("この結果から、下降の確率が高いため、ポジションを取らないか、ショートポジションを検討するのが有利と判断されます。")

コードの解説

  1. 事前分布の設定

    • 上昇確率の事前分布はベータ分布(pm.Beta)で、パラメータαを5、βを3として、上昇にバイアスがかかるようにしています。

  2. 条件付き確率の設定

    • ボリンジャーバンド下限接触時の上昇確率(平均0.70、標準偏差0.05)とRSIが30以下の影響(平均0.65、標準偏差0.10)に基づき、条件付き確率を正規分布(pm.Normal)でモデル化しています。

  3. 観測モデル

    • 上昇と下降のそれぞれの観測を、ベルヌーイ分布(pm.Bernoulli)でモデル化しています。USD/JPYの価格が「上昇する」か「上昇しない」の二つの結果に注目しているため、二値の結果を扱えるベルヌーイ分布を使用することで、上昇確率(成功確率)を適切にモデル化できるからです。

  4. MCMCサンプリングの実行

    • pm.sample()でMCMCサンプリングを実行し、1000個のサンプルを取得します。

  5. 結果の解析と表示

    • サンプリング結果の事後分布から、平均上昇確率と95%信用区間を計算し、結果を表示します。

上昇の事後確率(平均): 約68.63%
95%信用区間: [39.95%, 92.59%]
この結果から、上昇の確率が高いため、ロング(買い)ポジションを取るのが有利と判断されます。

結果の分析と解説

上昇の事後確率(平均):68.63%

  • 上昇の事後確率が68.63%と高く、シナリオに基づく推測として「上昇の可能性が高い」と判断するに足る結果です。このため、買いポジションを取ることが有利と考えられます。

  • 経済指標発表のポジティブな影響やボリンジャーバンド下限接触、RSIの低水準を反映し、上昇バイアスがかかっています。

95%信用区間:[39.95%, 92.59%]

  • 95%信用区間が39.95%から92.59%と広めであることが特徴です。つまり、上昇確率の平均は高いものの、範囲の広がりからも分かるように、予測にはある程度の不確実性が含まれていることが示唆されます。

信用区間が広い理由としては、設定された事前分布と尤度(ボリンジャーバンドやRSIの影響に変動幅を持たせている点)から、サンプリング結果が異なる値を探索しやすくなっていることが考えられます。こうした設定により、結果は平均値付近(68.63%)を中心に収束するものの、サンプリングの分散が生まれていることが反映されています。

95%信用区間の下限が39.95%であること

95%信用区間の下限が39.95%と、50%を下回っている点は特に注意すべきです。これは、上昇確率が一定の範囲で揺らぐ可能性があることを示しています。具体的には、15分後のUSD/JPYの上昇確率が高い平均値68.63%の周りにばらついているものの、低い確率(39.95%)に達する可能性もあるため、必ずしも確実な「上昇」ではないことが示唆されます。

結果の再現性

上記の結果は、同じ設定で実行し直しても常に同じ結果となるとは限りません。その理由は以下の通りです。

1. MCMCサンプリングによるランダム性

  • MCMCサンプリングでは、確率分布に基づきランダムにサンプルを生成します。これにより、同じモデルとデータを使用しても、サンプリングごとにわずかな差が生じます。設定した反復回数(1000回)によっては、結果に多少のばらつきが出ることがあります。

2. 初期値のランダム性

  • MCMCサンプリングは、通常ランダムな初期値から開始するため、サンプルが収束するまでの経路が毎回わずかに異なります。これも、結果が完全に同じにはならない理由の一つです。

3. モデルの不確実性設定

  • 尤度関数(条件付き確率)や事前分布に不確実性の範囲を設定しているため、その幅が広いほどサンプリング結果にばらつきが生じやすくなります。このシナリオでは、ボリンジャーバンドやRSIに±の範囲を設定しているため、結果の変動が大きくなることがあります。


結論の詳細

買いポジションを取る根拠

  • 平均値68.63%は上昇の可能性が高いことを示しており、ポジティブな経済指標やボリンジャーバンド、RSIなどの状況が上昇に向かっている点から、買いポジションを取るのが合理的と判断されます。

リスク管理の重要性

  • ただし、信用区間の下限が39.95%であることから、逆に価格が上昇しない可能性も一定の確率で存在します。このため、不確実性を考慮したリスク管理が重要です。

    • ストップロスの設定:ポジションが予想に反して損失を出し始めた場合に備え、適切な価格でストップロスを設定することが有効です。

    • ポジションサイズの調整:取引量を調整して、仮に価格が予想通りに動かない場合でもリスクを限定するようにします。

信用区間の解釈

  • 95%信用区間は、上昇確率が68.63%でありながら、将来の価格動向に揺らぎが存在することを表しているため、価格が必ず上昇するわけではないことを意味します。信用区間の下限が50%を下回っているため、この結果に基づいて取引を行う場合、通常よりも慎重なリスク管理が求められます。

最終判断

  • 上昇確率の平均が高いため、ポジションを取るのが合理的ですが、価格が期待通りに動かない可能性もあるため、リスク管理に特に注意してトレードを行うことが推奨されます。この結果から、慎重な戦略が必要とされる場面であると言えるでしょう。

MCMC×ベイズ推定×Python-EA

さて、ここまでの具体例で、ベイズ推定のロジック実装の基本形はある程度見えてきました。あとはより具体的な実装です。これまで検討したようなロジックを、FX自動売買ツールにどのように組み込んだら良いかという話に進みます。

先ほどの例では、Pythonのライブラリであるpymcを用いてMCMCのロジックを実装しました。それはMetaTrader5(MT5)のEA等で直接実装するのは難しそうなので、PythonによるFX自動売買ツールに組み込むことを検討してみます。

以下の記事では、PythonスクリプトをMT5のチャート上で直接実行する方法をご紹介しています。

本記事では、Pythonスクリプト部分を、MCMCとベイズ推定を用いた自動売買ロジックに置き換えることで実現する方法を採用します。

なお、以下の記事では、MQL5とPythonを連携してMCMCとベイズ推定を用いたEA(MCMC-EA)を作成する方法をご紹介しています。ぜひこちらもあわせてご覧ください。

有料部分の内容

以下のような内容を実装したコード全文を掲載しています。

1. インプット設定

まず、取引通貨ペア(USD/JPYなど)、取引に使用するロット数などのユーザーが事前に指定するパラメータを設定します。また、MCMCの事前確率の設定として、ベイズ推定で使用するベータ分布のパラメータ alpha_prior と beta_prior も指定します。これにより、上昇と下降のバイアスを調整し、テクニカル指標の影響度もユーザーの設定に基づいて反映されます。ボリンジャーバンドとRSIの影響度(上昇確率と不確実性の設定)もここで指定します。


2. テクニカル指標の計算

次に、取引の判断基準として用いるテクニカル指標を計算するための関数を定義しています。具体的には、相対力指数(RSI)とボリンジャーバンドが計算されます。RSIは、売られ過ぎや買われ過ぎの状況を数値化するために使用され、30以下で「売られ過ぎ」、70以上で「買われ過ぎ」と判断します。ボリンジャーバンドは、移動平均に標準偏差を使ったバンドで、価格の振れ幅を可視化します。標準偏差に基づく上下限と中央値を計算し、価格がバンドの外に達した際に取引の判断材料として活用されます。


3. テクニカル指標の取得

取引判断を行うために、MetaTrader5から指定された時間枠の価格データを取得し、テクニカル指標を計算する関数を定義しています。この関数は、指定された期間のデータをMetaTrader5から取得し、RSIとボリンジャーバンドの計算を行います。取得したテクニカル指標の値は後の取引判断に使われるため、関数の最後にRSI、ボリンジャーバンドの上限および下限の値を返します。


4. MCMCの実行による売買フラグの計算

ベイズ推定を用いて売買判断のための事後確率を計算する部分です。ここでは、確率分布をベータ分布、正規分布、ベルヌーイ分布でモデル化します。まず、売買の傾向を反映するためのベータ分布を設定し、ボリンジャーバンドとRSIの影響を正規分布で表し、それぞれのテクニカル指標が持つ不確実性を考慮します。最後に、事後確率をサンプリングするためにMCMCが実行され、サンプリング結果をもとに上昇または下降の確率が算出されます。この確率を用いて、売買のフラグが設定されます。


5. 売買判断とエントリー、クローズロジック

サンプリングの結果を基に、売買フラグに基づいた実際の取引判断が行われます。まず、売買フラグの設定では、サンプリングで得られた事後確率の平均が60%以上なら買い、40%以下なら売りと判断し、さらに価格がボリンジャーバンドの下限・上限に達しているか、RSIが「売られ過ぎ」や「買われ過ぎ」の範囲にあるかを確認します。条件を満たすと売買フラグが立ち、エントリーが実行されます。エントリー後は15分が経過するまでポジションを保持し、経過後に自動でクローズされます。クローズの際は、保有していたポジションの逆方向の注文を発注することで、利益確定または損失確定が行われます。


全体の概要

このコードは、MCMCとベイズ推定を用いて確率的に有利なエントリーポイントを見つけ、テクニカル指標(RSIとボリンジャーバンド)を基に短期取引を行うシステムです。取引条件をユーザーが事前に設定し、事後確率の計算により売買の傾向を判断して、自動的にエントリーとクローズが行われます。つまり、売買判断から取引注文まで実践的な内容も含めて全て組み込んでいます。

注意点

以下にコード全文を掲載していますが、注意点です。

  • 実際に稼働させるためには、以下の記事で解説しているような事前設定(Pythonの環境設定やMT5のインストールなど)が必要です。

  • 記事執筆時点より後の環境変化等で想定通りに稼働しない可能性がございます。動作保証等はいたしかねますのでご了承ください。

  • リアル口座にアクセスして取引を行うことも可能なコードになっておりますが、必ずデモ口座で事前に稼働確認をしていただくことを推奨いたします。

  • 当記事で解説しているロジック通りの動作を保証するものではございません。あくまでFX自動売買ツール開発のためのサンプルコードとしてご活用ください。

Python-EAの実装コード

まずは主要な部分を抜粋してコードの概要を説明します。最後にコード全文を掲載しています。

ここから先は

9,178字

¥ 1,000

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

よろしければ応援お願いします。いただいたチップは今後の記事の執筆に活用させていただきます。