幾何ブラウン運動

幾何ブラウン運動は、対数 \(\ln S_t\) がドリフト付きブラウン運動に従う連続時間の確率過程である。

ブラック・ショールズ・モデルにおける危険資産の価格過程のモデル化に用いられるのが一般的だが、価格が負の値をとらない(非負性)という性質を持つため、Vasicek モデル等で課題となる「負の金利」を回避する目的で、瞬間金利のモデルとして用いられることもある。

GBM モデルでは、資産価格 \(S_t\) を以下の確率微分方程式で記述する。

\[ dS_t = \mu S_t dt + \sigma S_t dW_t \]

ここで、\(\mu\) は期待収益率(ドリフト)、\(\sigma\) はボラティリティ、\(W_t\) は標準ウィーナー過程を表す。 この式は、微小時間における価格の変化量 \(dS_t\) が、その時の価格水準 \(S_t\) に比例することを意味している。

関数 \(f(S_t) = \ln S_t\) に対して伊藤の公式を適用することで、幾何ブラウン運動モデルに従う資産価格の対数価格 \(\ln S_t\) に関する次の式を得る。

\[ d(\ln S_t) = \left( \mu - \frac{1}{2}\sigma^2 \right) dt + \sigma dW_t \]

この変換で得られた式はドリフト付きのウィーナー過程である。

初期値を \(S_0\) とするとき、解は次のように表せる。

\[ S_t = S_0 \exp \left( \left( \mu-\frac{1}{2} \sigma^2 \right)t+\sigma W_t \right) \]

対数価格に関する確率微分方程式を時間刻み \(\Delta t\) で離散化することで、以下の時系列モデルを得る。

\[ \ln S_{t+\Delta t}-\ln S_t=\ln \left( \frac{S_{t+\Delta t}}{S_t} \right) = \left( \mu - \frac{1}{2}\sigma^2 \right) \Delta t + \sigma \sqrt{\Delta t}\; \epsilon_t \]

このモデルでは、各微小時間の対数収益率は、それぞれ一定の平均と分散を持つ独立な正規分布に従う。 つまり、離散化された GBM モデルは、対数価格に対して定数項付きの単位根過程を仮定することに他ならない。

library(ggplot2)
theme_set(theme_bw())

set.seed(42)

years <- 10
N <- 252 * years
dt <- years / N
time <- seq(0, years, by = dt)

S0 <- 100
mu <- 0.05
sigma <- 0.2
m <- 100

df <- list()
for (i in seq_len(m)) {
  drift <- (mu - sigma ** 2 / 2) * dt
  diffusion <- sigma * sqrt(dt) * rnorm(N)
  dlnS <- drift + diffusion
  path <- S0 * exp(cumsum(c(0, dlnS)))
  df[[length(df) + 1]] <-
    data.frame(id = i, time = time, path = path)
}
df <- do.call(rbind, df)

ggplot(df, aes(x = time, y = path, group = id, alpha = id)) +
  geom_line() +
  scale_color_continuous() +
  labs(title = "Discretized Geometric Brownian Motion",
       x = "Time (Years)", y = "Price") +
  theme(legend.position = "none")

価格過程 \(S_t\) が幾何ブラウン運動でモデル化される場合、各時点における対数価格が正規分布に従うことから、元の価格は対数正規分布に従う。 そのことは、数値シミュレーションの結果からも以下のように確認できる。

snapshots <- df$time[N %/% 1:6]
df_snapshots <- df[df$time %in% snapshots, ]
ggplot() +
  geom_density(
    aes(path, group = time, fill = time),
    data = df_snapshots,
    alpha = 0.5,
    ) +
  lims(x = c(0, NA)) +
  labs(subtitle = "Realized Distribution of the Price",
       x = "Price", y = "Density")