ベイズ推論を用いた株式市場の分析とポートフォリオ最適化

1. ベイズ法の概要

ベイズ法は、データサイエンティストのツールキットにおいて、予測、分類、迷惑メール検出、ランキング、推論など、多様なタスクに適用できる重要な手法です。しかし、ベイズ統計や推論に関する文献の大半は数学的な詳細に重点を置いており、実際的な工学的考慮事項は軽視されがちです。従来のベイズ推論の解説では、まず確率論の章が2〜3章続き、その後でようやくベイズ推論の概念が導入されます。ほとんどのベイズモデルは数学的に扱いが難しいため、読者は単純で人工的な例題しか目にすることができず、「それがどうした」という印象を持ちやすいのが現状です。

近年、計算能力の向上により、確率的プログラミングという代替アプローチを用いたベイズ推論が可能になりました。このアプローチはより実践的で、ステップごとに数学的な介入を必要とせず、複雑な解析を回避しながら小さな中間ステップを積み重ねて進めることができます。一方、従来の数学的解析のアプローチは大きな飛躍を伴い、目標から逸脱することも少なくありません。また、数学的な基礎が不十分な人にとっては、従来のアプローチで求められる解析を実行すること自体が不可能です。

2. 株式市場におけるベイズ分析

2.1 事後分布に基づく共分散行列の算出

株式市場の分析では、MCMCサンプルから事後分布を平均することで共分散行列の事後期待値を算出できます。以下に具体的なコードを示します。

inv_cov_samples = mcmc.trace("inv_cov_matrix")[:]
mean_covariance_matrix = np.linalg.inv(inv_cov_samples.mean(axis=0))

2.2 共分散行列から相関行列への変換

銘柄間の関係性をより分析しやすくするため、共分散行列を相関行列に変換します。

def cov2corr(A):
    """
    共分散行列を相関行列に変換する
    """
    d = np.sqrt(A.diagonal())
    A = ((A.T/d).T)/d
    return A

2.3 可視化による分析

相関行列と日次収益率の分散を可視化することで、株式データを直感的に分析できます。

plt.subplot(1,2,1)
plt.imshow(cov2corr(mean_covariance_matrix), interpolation="none",
           cmap = plt.cm.hot)
plt.xticks(np.arange(4), stock_returns.keys())
plt.yticks(np.arange(4), stock_returns.keys())
plt.colorbar(orientation="vertical")
plt.title("(事後平均) 相関行列")

plt.subplot(1,2,2)
plt.bar(np.arange(4), np.sqrt(np.diag(mean_covariance_matrix)),
        color="#348ABD", alpha=0.7)
plt.xticks(np.arange(4) + 0.5, stock_returns.keys());
plt.title("(事後平均) 日次収益率の分散")
plt.xlabel('値')
plt.ylabel('密度')
plt.tight_layout();

図6.5.7から、テスラ(TSLA)は平均以上のボラティリティを持つ可能性が高いことがわかります。相関行列を見ると、銘柄間に強い相関は見られませんが、グーグル(GOOG)とアマゾン(AMZN)にはある程度の相関(約0.30)が存在するようです。

2.4 平均-分散最適化

ベイズ分析で得られた結果は平均-分散最適化に応用できます。頻度論的な点推定をそのまま最適化器に使用するのは避けるべきです。この最適化手法は、高いリターンと高い分散のトレードオフを調整します。最適なウェイト \(w_{opt}\) は以下の関数を最大化することで得られます。

\[ w_{opt} = \max_{w} \left\{ \frac{1}{N} \sum_{i=0}^{N} \mu_{i}^{T} w - \frac{\lambda}{2} w^{T} \Sigma_{i} w \right\} \]

ここで、\(\mu_{i}\) と \(\Sigma_{i}\) は、\(i\) 番目の事後サンプルにおける平均収益率と共分散行列です。これは損失関数最適化の一例でもあります。

3. Wishart分布を使用する際のテクニック

前述の例ではWishart分布は良好に動作しましたが、実際にはそうでない場合も多いです。\(N \times N\) の共分散行列を推定するには、\(\frac{1}{2}N(N-1)\) 個の未知数を推定する必要があります。これは \(N\) が中程度でも大きな数値になります。例えば \(N=23\) の場合、MCMCシミュレーションでは少なくとも \(23 \times 11 = 253\) 個もの追加の未知数を推定する必要があり、これはMCMCにとって250次元以上の空間を探索することを意味し、非常に困難な課題となります。以下にWishart分布を使用する際の主なテクニックをまとめます。

  1. 共役性を利用する:適用可能な場合、共役性を利用することで計算を簡略化できます。
  2. 適切な初期値を使用する:データの標本共分散行列は良い初期値となります。これは経験ベイズではなく、MCMCの開始点を修正するだけです。数値的不安定性により行列が非対称になる可能性があるため、標本共分散行列の浮動小数点の精度を数桁切り詰めて使用するのが安全です。
  3. 事前知識を提供する:可能な限り事前分布の形でドメイン知識を与えます。ただし、\(\frac{1}{2}N(N-1)\) 個すべての未知数に対して個別に事前分布を設定することは現実的ではありません。その場合はテクニック4を参照してください。
  4. 経験ベイズを使用する:標本共分散行列を事前分布のパラメータとして利用します。
  5. 大規模なNへの対処:Nが非常に大きい場合、上記の方法では対応できないことがあります。その場合、すべての相関関係を本当に気にする必要があるのか、あるいは相関関係をそれほど重視すべきなのかを再考する必要があります。金融の分野では、非公式な優先順位を設定できます。最も重要なのは \(\mu\) の良好な推定、次に共分散行列の対角成分(分散)、最も重要度が低いのはその他の相関関係です。

これらのテクニックを以下の表にまとめます。

番号内容
1共役性を利用する(適用可能な場合)
2データの標本共分散行列を初期値として使用し、精度を切り詰める
3可能な限り事前知識を提供する
4経験ベイズ:標本共分散行列を事前分布のパラメータとして利用
5大規模N:すべての相関を本当に必要か再考する

4. 確率的プログラミング言語PyMCの選択

本書でPyMCを採用した理由は二つあります。第一に、PyMCに関する包括的なサンプルや解説資料が不足しており、公式ドキュメントは読者がベイズ推論や確率的プログラミングの事前知識を持っていることを前提としているためです。本書が様々なレベルの読者にPyMCへの関心を促すことを期待しています。第二に、Pythonの科学技術計算スタックの発展と普及に伴い、PyMCは近い将来、その中核的なコンポーネントになると考えられます。

PyMCはNumPyと(オプションで)SciPyに依存しています。読者の環境を制限しないために、本書の例はPyMC、NumPy、SciPy、matplotlibのみに依存しています。

5. 学習の流れ

ベイズ法の学習は以下の順序で進めることを推奨します。

  1. 第1章:ベイズ推論を紹介し、他の推論手法と比較しながら、最初のベイズモデルを構築・訓練します。
  2. 第2章:PyMCを用いたモデル構築に焦点を当て、豊富な例を用いて解説します。
  3. 第3章:計算推論の背後にある強力なアルゴリズムであるマルコフ連鎖モンテカルロ(MCMC)法を導入し、ベイズモデルのデバッグ手法を紹介します。
  4. 第4章:推論におけるサンプルサイズの問題を再考し、その重要性を解説します。
  5. 第5章:損失関数の強力な概念を導入し、推論を現実世界の問題に結びつける方法を示します。
  6. 第6章:ベイズ事前分布を見直し、適切な事前分布を選択するためのヒューリスティックを提供します。
  7. 第7章:A/Bテストへのベイズ推論の応用を探求します。

使用されるすべてのデータセットは こちら から入手可能です。

6. A/Bテストにおけるベイズ法の応用

6.1 コンバージョンテストの振り返り

A/Bテストにおけるコンバージョンテストでは、伝統的に頻度論的手法が用いられてきましたが、ベイズ法はより直感的で柔軟なソリューションを提供します。ベイズ法では、単なる統計的有意性の結果ではなく、あるバリアントが別のバリアントよりも優れている確率を直接計算できます。

6.2 線形損失関数の追加

A/Bテストでは、線形損失関数を追加することで、異なるバリアントの優劣をより適切に評価できます。期待収益などの要素を考慮することで、各バリアントの価値をより包括的に評価することが可能になります。

6.2.1 期待収益の分析

期待収益の分析は、ベイズA/Bテストにおける重要な要素です。各バリアントのコンバージョン率と収益に基づいて、期待収益を計算できます。例えば、バリアントAのコンバージョン率を \(p_A\)、コンバージョンあたりの収益を \(r_A\)、バリアントBのコンバージョン率を \(p_B\)、コンバージョンあたりの収益を \(r_B\) とすると、バリアントAの期待収益は \(E_A = p_A \times r_A\)、バリアントBの期待収益は \(E_B = p_B \times r_B\) となります。\(E_A\) と \(E_B\) を比較することで、どちらのバリアントが有利かを判断できます。

6.2.2 A/B実験への拡張

期待収益分析をA/B実験に拡張するには、ベイズ法を用いて各バリアントのコンバージョン率と収益に関する推定を更新します。実験データが蓄積されるにつれて、各バリアントの性能をより正確に評価できるようになります。

6.3 コンバージョン率を超えて:t検定

A/Bテストでは、コンバージョン率だけでなく、ユーザーの平均購入金額などの他の指標にも注目できます。t検定は、2つのサンプルの平均値に有意差があるかどうかを比較するために一般的に使用される統計手法です。ベイズフレームワークでは、ベイズt検定を用いることで、より柔軟にデータを扱い、より有意義な結果を得ることができます。

6.3.1 t検定の設定

ベイズt検定を実行するには、適切な事前分布を設定する必要があります。例えば、2つのサンプルの平均や分散に対して、これらのパラメータに関する事前の信念を反映する事前分布を選択します。その後、観測データに基づいてベイズの定理を用いて、これらのパラメータの事後分布を更新します。

6.4 成長率の推定

A/Bテストでは、あるバリアントが別のバリアントと比較してどの程度成長するかを推定したいことがよくあります。ベイズ法を用いると、成長率の事後分布を得ることができ、成長の確率や信頼区間を計算できます。

6.4.1 点推定の作成

成長率をより直感的に理解するために、点推定を作成できます。例えば、事後分布の平均値や中央値を点推定値として選択できます。同時に、推定の不確実性を反映するために、点推定の信頼区間を計算することも重要です。

ベイズA/Bテストの手順を以下の表にまとめます。

ステップ内容
1コンバージョンテストの振り返り:テストの目標と指標を明確にする
2線形損失関数の追加:期待収益を考慮する
3コンバージョン率を超えて:t検定を用いて他の指標を比較する
4成長率の推定:点推定と信頼区間を作成する

7. まとめと展望

7.1 ベイズ法の利点

ベイズ法は、株式市場分析やA/Bテストなどの分野で独自の利点を発揮します。株式市場分析では、銘柄間の相関関係やボラティリティをより深く理解し、平均-分散最適化を通じてリターンとリスクのバランスを取ることができます。A/Bテストでは、あるバリアントが別のバリアントよりも優れている確率といった直感的な結果を提供し、異なる指標や損失関数を柔軟に扱うことができます。

7.2 学習の提案

ベイズ法を学びたい読者は、前述の学習の流れに従って進めることをお勧めします。基礎的なベイズ推論の概念から始め、PyMCを使ったモデル構築やMCMCアルゴリズムを用いた計算推論のスキルを段階的に習得してください。同時に、実際の例やデータセットを通じて実践することを重視し、ベイズ法への理解を深めてください。

7.3 今後の発展

データサイエンスと機械学習の継続的な発展に伴い、ベイズ法はさらに多くの分野で応用されることが期待されます。例えば、深層学習においては、モデルの不確実性を扱い、ロバスト性を向上させるためにベイズ法が利用できます。将来的には、ベイズ法と他の技術との組み合わせにより、より複雑な問題に対する効果的なソリューションが提供されるでしょう。

タグ: ベイズ推論 株式市場分析 ポートフォリオ最適化 MCMC Wishart分布

6月10日 20:25 投稿