0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[株価推定]ハイブリッド推定を使った株価モンテカルロ・シミュレーション

Last updated at Posted at 2025-08-28

1. 概要

本コードでは、株価データを取得し、そのリターンを基に モンテカルロシミュレーション を行い、将来の株価レンジを予測します。
特徴は「ハイブリッド推定」アプローチを採用し、ボラティリティと平均リターンを異なる期間で計算している点です。

2. ライブラリとデータ準備

lib.py
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
import japanize_matplotlib  # グラフを日本語表示対応

yfinance : Yahoo Financeから株価データを取得

getdata.py
matplotlib : 結果をヒストグラムで可視化

japanize_matplotlib : タイトルなどを日本語対応にする

取得銘柄は "JMIA"期間は2024-01-01  2025-08-28

data = yf.download(ticker, start=start, end=end)
prices = data["Close"]
returns = prices.pct_change().dropna()

prices : 終値データ

returns : 日次リターン

3. ハイブリッド推定関数

hybrid_param.py
def hybrid_params(returns, vol_window=21, mean_window=252):
    vol = returns[-vol_window:].std()
    mu  = returns[-mean_window:].mean()
    return mu, vol

mu(期待リターン)

直近 mean_window 日の平均リターンを採用

vol(ボラティリティ)

直近 vol_window 日の標準偏差を採用

👉 これにより、

トレンド(リターン)は長期の安定性を反映

ボラティリティは直近の市況を反映
する「ハイブリッド」な推定が可能になります。

4. モンテカルロシミュレーション

montecarlo.py
def monte_carlo(prices, mu, vol, horizon=1, n_sims=10000):
    S0 = prices.iloc[-1]  # 現在株価
    sims = np.zeros(n_sims)
    
    for i in range(n_sims):
        rand_returns = np.random.normal(mu, vol, horizon)
        sims[i] = S0 * np.prod(1 + rand_returns)
        
    return sims

np.random.normal(mu, vol, horizon)
→ 期間 horizon の乱数リターンを生成

np.prod(1 + rand_returns)
→ 複利効果を加味して株価をシミュレート

n_sims=10000
→ 1万回繰り返して確率分布を構築

5. シナリオ設定と実行

senario.py
scenarios = {"1d": 1, "1w": 5, "1m": 21}

翌日(1d)

翌週(1w = 5営業日)

翌月(1m = 21営業日)

それぞれについて1万回シミュレーション。

simulate.py
for label, horizon in scenarios.items():
    sims = monte_carlo(prices, mu, vol, horizon, n_sims=n_sims)
    results[label] = sims
    plt.hist(sims, bins=50, alpha=0.6, label=label)

ヒストグラムで確率分布を可視化。

6. 結果の可視化と統計値

plot.py
plt.axvline(prices.iloc[-1].squeeze(), color="black", linestyle="--", label="現在価格")
plt.legend()
plt.title(f"{ticker} Monte Carloシミュレーション")

出力例:

平均価格

中央値

下位25%水準

上位75%水準

print.py
print(f"現在価格    : {prices.iloc[-1].squeeze():.2f}")
for label, sims in results.items():
    print(f"\n--- {label} ---")
    print(f"平均価格    : {np.mean(sims):.2f}")
    print(f"中央値      : {np.median(sims):.2f}")
    print(f"下位25%水準  : {np.percentile(sims, 25):.2f}")
    print(f"上位75%水準 : {np.percentile(sims, 75):.2f}")

7. まとめ

📊 短期的な株価予測レンジを確率的に示せる

⚖️ ハイブリッド推定で「直近のボラティリティ」と「中長期の平均リターン」を同時に反映

🔮 投資判断における「期待値とリスクのバランス」を定量的に評価可能

8.出力例

極端な例 ボラ5日 平均リターン5日

mu, vol = hybrid_params(returns, vol_window=5, mean_window=5)

現在価格 : 9.18

--- 1d ---
平均価格 : 9.63
中央値 : 9.63
下位25%水準 : 9.36
上位75%水準 : 9.90

--- 1w ---
平均価格 : 11.64
中央値 : 11.59
下位25%水準 : 10.89
上位75%水準 : 12.32

--- 1m ---
平均価格 : 24.82
中央値 : 24.41
下位25%水準 : 21.44
上位75%水準 : 27.71
MC_jmia_senario.png

標準的なパラメーター例 ボラ18日(今月) 平均リターン63日(3か月)

mu, vol = hybrid_params(returns, vol_window=18, mean_window=63)

現在価格 : 9.18

--- 1d ---
平均価格 : 9.35
中央値 : 9.36
下位25%水準 : 8.86
上位75%水準 : 9.85

--- 1w ---
平均価格 : 10.06
中央値 : 9.93
下位25%水準 : 8.82
上位75%水準 : 11.18

--- 1m ---
平均価格 : 13.35
中央値 : 12.50
下位25%水準 : 9.85
上位75%水準 : 15.93

MC_jmia_senario2.png

ハイブリッド推定を使った株価モンテカルロシミュレーション(理論)

ハイブリッド推定を使った株価モンテカルロシミュレーション

1. 背景と目的

株価シミュレーションにおいて、リターン分布の期待値(μ)とボラティリティ(σ)の推定方法は結果に大きな影響を与える。
従来は「直近のデータ全体から単一の推定値を計算」するが、短期予測においては直近のボラティリティを重視しつつ、リターンの期待値は長期平均で平滑化する方が妥当な場合がある。

本研究ノートでは、
μ: 半年間の平均リターン
σ: 直近1か月のボラティリティ
を組み合わせる「ハイブリッド推定」を導入し、これを基にモンテカルロ法を用いて価格分布を生成する。

2. 理論モデル

2.1 幾何ブラウン運動 (GBM)

株価
𝑆𝑡は次の確率微分方程式に従うと仮定する。

dS_t​=μS_t​dt+σS_t​dW_t​

離散化すると:

S_t+Δt​=S_t ​exp((μ−\frac{1}{2}​σ^2)Δt+σΔtZ)

ここで

Z∼N(0,1)

2.2 ハイブリッド推定

リターンの期待値推定:上の例ではN=3month

\bar{μ}​=\frac{1}{N}\sum_{i=1}^{N} ​r_i​....(N=6months) 

ボラティリティ推定:上の例ではM=1month

\bar{σ}=\frac{1}{M−1}\sum_{​j=1}^{M​}(r_j​−\bar{r}_{1M}​)^2....​(M=1month)

つまり、μは長期の滑らかな傾向、σは短期の急激な変動を反映する。

3. 実装(Python)

app.py
import numpy as np
import yfinance as yf

def hybrid_mu_sigma(prices):
    returns = np.log(prices / prices.shift(1)).dropna()
    mu = returns[-126:].mean() * 252      # 半年の期待リターン(営業日換算)
    sigma = returns[-21:].std() * np.sqrt(252)  # 1か月のボラティリティ
    return mu, sigma

def monte_carlo(prices, mu, sigma, horizon, n_sims=10000):
    last_price = prices.iloc[-1]
    dt = horizon
    rand = np.random.randn(n_sims)
    sims = last_price * np.exp((mu - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*rand)
    return sims

4. 実験

上記の通り

シミュレーション結果は分布ヒストグラムとして可視化し、現在価格を黒線で表示。

5. 結果(例)

μ(半年間平均): 年率 +7.2%

σ(1か月): 年率 19.8%

→ 直近のボラティリティを反映するため、急変動局面では広い分布が得られる一方で、期待値は平滑化され、外れ値に引きずられにくい。

6. 考察

短期予測においては、過去半年のトレンドが持続する仮定を反映しつつ、直近のリスクを強調できる。

配当落ちなどによる価格ギャップは、ボラティリティ推定に影響を与えるため、調整が必要。

今後は**確率分布の歪み(スキュー・クラッシュリスク)**を加味する必要あり。

7. まとめ

ハイブリッド推定は、従来手法よりも直感的に投資家の意思決定に近いリスク・リターン評価を可能にする。

特に「不安定な相場」で有効。

実運用への応用に際しては、配当落ち調整・金利環境の反映が課題。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?