Неделя 4. Винеровский процесс

Author

Carlos Buitrago

Show Python code
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
rng = np.random.default_rng(2026)
plt.rcParams.update({'figure.figsize': (10, 4.5), 'axes.grid': True, 'grid.alpha': .25})
def brownian_paths(T=1., steps=2000, paths=8, seed=42):
    rg=np.random.default_rng(seed)
    dt=T/steps
    increments=rg.normal(0,np.sqrt(dt),size=(paths,steps))
    W=np.column_stack([np.zeros(paths),np.cumsum(increments,axis=1)])
    return np.linspace(0,T,steps+1),W

1 1. Определение и существование

ImportantОпределение 1.1

Процесс \((W_t)_{t\ge0}\) называется винеровским, если:

  1. \(W_0=0\) почти наверное;
  2. приращения на непересекающихся временных интервалах независимы;
  3. для \(0\le s<t\) выполняется \(W_t-W_s\sim\mathcal N(0,t-s)\).

Отсюда \(W_t\sim\mathcal N(0,t)\), \(\mathbb E W_t=0\), \(\operatorname{Var}(W_t)=t\). Приращения стационарны: их распределение зависит только от длины интервала.

1.1 Существование: согласованность приращений

Характеристическая функция нормального приращения: \[\varphi_{s,t}(u)=\exp\left(-\frac{u^2(t-s)}2\right).\] Для \(s<r<t\): \[\varphi_{s,t}(u)=\varphi_{s,r}(u)\varphi_{r,t}(u).\] Это согласованность с суммой независимых приращений. Вместе с теоремой существования процессов с независимыми приращениями она обеспечивает существование процесса с заданными конечномерными распределениями. Позже теорема Колмогорова даст непрерывную модификацию.

1.2 Конструкция на сетке

Для \(t_k=k\Delta t\) берём независимые \(Z_k\sim\mathcal N(0,1)\) и полагаем \[W_{t_0}=0,\qquad W_{t_k}=\sum_{j=1}^k\sqrt{\Delta t}\,Z_j.\] Линейная интерполяция служит численной аппроксимацией, не точной траекторией между узлами.

Show Python code
t,W=brownian_paths(T=2,steps=2500,paths=12)
fig,ax=plt.subplots()
ax.plot(t,W.T,alpha=.8,lw=1)
ax.plot(t,np.sqrt(t)*2,'k--',lw=1,label=r'$\pm2\sqrt{t}$')
ax.plot(t,-np.sqrt(t)*2,'k--',lw=1)
ax.set(xlabel='Время t',ylabel=r'$W_t$',title='12 независимых траекторий броуновского движения')
ax.legend();plt.show()

2 2. Эквивалентное гауссовское определение

TipТеорема 1.1

Процесс \(W\) является винеровским в смысле определения выше тогда и только тогда, когда он гауссовский и \[\mathbb EW_t=0,\qquad \operatorname{Cov}(W_s,W_t)=\min(s,t).\]

Доказательство \(\Rightarrow\). Для \(s\le t\) имеем \(W_t=W_s+(W_t-W_s)\). Независимость приращений даёт \[\operatorname{Cov}(W_s,W_t)=\operatorname{Var}(W_s)=s.\] При \(0\le t_1<\dots<t_n\) вектор приращений \[\eta=(W_{t_1},W_{t_2}-W_{t_1},\ldots,W_{t_n}-W_{t_{n-1}})\] имеет независимые нормальные координаты, следовательно гауссовский. Вектор значений \((W_{t_1},\dots,W_{t_n})\) — его линейное преобразование и тоже гауссовский.

Доказательство \(\Leftarrow\). Сначала ядро \(K(s,t)=\min(s,t)\) неотрицательно определено, поскольку \[\min(s,t)=\int_0^\infty\mathbf1_{[0,s]}(u)\mathbf1_{[0,t]}(u)\,du\] и для любых \(a_i\in\mathbb R\), \(t_i\ge0\): \[\sum_{i,j}a_ia_jK(t_i,t_j)=\int_0^\infty\left(\sum_i a_i\mathbf1_{[0,t_i]}(u)\right)^2du\ge0.\] По теореме существования гауссовского процесса такой процесс существует. У него \(\operatorname{Var}(W_0)=0\), поэтому \(W_0=0\) п.н. Разность \(W_t-W_s\) нормальна, центрирована и имеет дисперсию \[t+s-2\min(s,t)=t-s\quad(s\le t).\] Приращения на непересекающихся интервалах некоррелированы (раскрыть четыре ковариации); поскольку их совместный вектор гауссовский, они независимы. \(\square\)

Некоррелированность не влечёт независимости для произвольных случайных величин. Именно совместная гауссовость позволяет заключить независимость из нулевой ковариации.

2.1 Матрица ковариаций и её геометрия

Для \(0<t_1<\cdots<t_n\): \[\Sigma_{ij}=\min(t_i,t_j),\qquad \Sigma=L\operatorname{diag}(\Delta t_1,\ldots,\Delta t_n)L^\top,\] где \(L\) — нижнетреугольная матрица из единиц, \(\Delta t_i=t_i-t_{i-1}\) и \(t_0=0\). Это также даёт простой алгоритм точной симуляции конечномерного распределения.

Show Python code
times=np.linspace(.05,2,70)
K=np.minimum.outer(times,times)
fig,ax=plt.subplots(figsize=(7,5))
im=ax.imshow(K,origin='lower',extent=[times[0],times[-1],times[0],times[-1]],aspect='equal',cmap='viridis')
fig.colorbar(im,ax=ax,label='min(s,t)')
ax.set(xlabel='t',ylabel='s',title='Ковариационное ядро винеровского процесса');plt.show()
print('Минимальное собственное значение:',np.linalg.eigvalsh(K).min())

Минимальное собственное значение: 0.0070687563313333295
Show Python code
# Эмпирическая проверка ковариаций и независимости приращений
N=18000;dt=.2
inc=rng.normal(0,np.sqrt(dt),size=(N,6))
values=np.cumsum(inc,axis=1)
emp=np.cov(values,rowvar=False)
times=dt*np.arange(1,7)
print('Максимальная ошибка ковариации:',np.max(np.abs(emp-np.minimum.outer(times,times))))
fig,axs=plt.subplots(1,2,figsize=(11,4))
axs[0].imshow(emp,origin='lower');axs[0].set_title('Эмпирическая ковариация')
axs[1].imshow(np.corrcoef(inc,rowvar=False),origin='lower',vmin=-1,vmax=1,cmap='coolwarm');axs[1].set_title('Корреляции приращений')
plt.show()
Максимальная ошибка ковариации: 0.021064404173230078

3 3. Непрерывные модификации

Определение 1.2. Процесс \(Y\) называется модификацией \(X\), если для каждого фиксированного \(t\): \[\mathbb P(X_t=Y_t)=1.\] Важно: событие вероятности 1 может зависеть от \(t\). Это слабее неразличимости: \(\mathbb P(\forall t\ X_t=Y_t)=1\).

TipТеорема 1.2 (Колмогорова о непрерывной модификации)

Если для \(t,s\in[a,b]\) существуют \(C,\alpha,\varepsilon>0\) такие, что \[\mathbb E|X_t-X_s|^\alpha\le C|t-s|^{1+\varepsilon},\] то существует модификация с непрерывными траекториями. Более того, можно выбрать траектории локально гёльдеровыми любого порядка \(\gamma<\varepsilon/\alpha\).

Следствие 1.1. Винеровский процесс имеет непрерывную модификацию.

Доказательство. Для \(Z\sim\mathcal N(0,1)\): \(\mathbb EZ^4=3\), поэтому \[\mathbb E|W_t-W_s|^4=3|t-s|^2.\] Подходит \(\alpha=4\), \(\varepsilon=1\), \(C=3\). На каждом \([n,n+1]\) выбираем непрерывную модификацию. В соседних концах они совпадают п.н.; пересечение счётного числа этих событий имеет вероятность 1. Склеиваем траектории, а на исключительном нулевом событии задаём нулевую траекторию. Получаем непрерывную модификацию на \([0,\infty)\).

NoteУсиление: гёльдерова регулярность

Для любого \(p>2\): \[\mathbb E|W_t-W_s|^p=\mathbb E|Z|^p\,|t-s|^{p/2}.\] Колмогоров даёт показатель \(\gamma<\frac12-\frac1p\). Устремляя \(p\to\infty\) по счётной последовательности, получаем: траектории локально гёльдеровы любого порядка \(\gamma<1/2\). При \(\gamma\ge1/2\) такого свойства почти наверное нет.

Почему нужно \(\varepsilon>0\)? Для пуассоновского процесса интенсивности \(\lambda\): \[\mathbb E|N_t-N_s|=\lambda|t-s|,\] но на любом интервале положительной длины скачок случается с положительной вероятностью. Непрерывной модификации у него нет: непрерывная модификация и исходный процесс совпали бы п.н. во всех рациональных временах, что несовместимо со скачками.

Дополнение для центрированного гауссовского процесса. Достаточно оценки \(\mathbb E|X_t-X_s|^\alpha\le C|t-s|^\delta\) для любых \(\alpha,\delta>0\): гауссовость позволяет перейти к сколь угодно высоким моментам и применить теорему Колмогорова.

Show Python code
# Сравнение непрерывной аппроксимации и скачкообразного процесса
T=3;t,W=brownian_paths(T,3000,1,seed=17)
rg=np.random.default_rng(17); jumps=rg.poisson(2*T);jump_times=np.sort(rg.uniform(0,T,jumps))
fig,ax=plt.subplots()
ax.plot(t,W[0],label='Броуновское движение')
ax.step(np.r_[0,jump_times,T],np.r_[0,np.arange(1,jumps+1),jumps],where='post',label='Пуассоновский процесс')
ax.set(xlabel='t',title='Непрерывные траектории и скачки');ax.legend();plt.show()

4 4. Недифференцируемость траекторий

ImportantТеорема 1.3 (Пэли—Зигмунд—Винер)

Почти наверное траектория стандартного броуновского движения нигде не дифференцируема на \([0,\infty)\) (в нуле — справа).

Интуиция: на масштабе \(h\) типичное приращение имеет порядок \(\sqrt h\), поэтому отношение \[\frac{W_{t+h}-W_t}{h}\ \overset{d}=\ \frac{Z}{\sqrt h}\] не стабилизируется при \(h\downarrow0\). Это объясняет отсутствие производной в фиксированной точке; утверждение «нигде» существенно сильнее и требует отдельного доказательства.

Дополнительный факт: квадратичная вариация. Для равномерного разбиения \([0,T]\): \[Q_n=\sum_{k=1}^n(W_{kT/n}-W_{(k-1)T/n})^2\xrightarrow{L^2}T.\] Действительно, \(\mathbb EQ_n=T\) и \(\operatorname{Var}(Q_n)=2T^2/n\). При вложенных двоичных разбиениях сходимость также почти наверное. Это ключевой мотив исчисления Ито.

Show Python code
# Наклоны секущих при измельчении масштаба
rg=np.random.default_rng(18)
levels=np.arange(2,15)
slopes=[]
for k in levels:
    h=2.**(-k)
    slopes.append(rg.normal(scale=np.sqrt(h))/h) # распределение наклона в фиксированной точке
fig,ax=plt.subplots()
ax.plot(levels,slopes,'o-',label='Один наклон на каждом масштабе')
ax.plot(levels,2**(levels/2),'k--',label=r'Типичный масштаб $h^{-1/2}$')
ax.plot(levels,-2**(levels/2),'k--')
ax.set(xlabel=r'$k$, где $h=2^{-k}$',ylabel='Наклон',title='Разностные отношения становятся всё более изменчивыми')
ax.legend();plt.show()

Show Python code
# Квадратичная вариация на вложенных сетках
T=1;N=2**15
_,paths=brownian_paths(T,N,paths=5,seed=31)
ns=2**np.arange(3,16)
q=[]
for n0 in ns:
    d=np.diff(paths[:,::N//n0],axis=1)
    q.append(np.sum(d*d,axis=1))
q=np.asarray(q)
fig,ax=plt.subplots()
for i in range(q.shape[1]):ax.plot(ns,q[:,i],marker='.',alpha=.8)
ax.axhline(T,color='k',ls='--',label='T=1')
ax.set(xscale='log',xlabel='Число шагов',ylabel='Сумма квадратов приращений',title='Квадратичная вариация стремится к T')
ax.legend();plt.show()

5 5. Закон повторного логарифма (ЗПЛ)

TipТеорема 1.4 (глобальный ЗПЛ)

Для непрерывной версии винеровского процесса почти наверное \[\limsup_{t\to\infty}\frac{W_t}{\sqrt{2t\ln\ln t}}=1,\qquad \liminf_{t\to\infty}\frac{W_t}{\sqrt{2t\ln\ln t}}=-1.\] Знаменатель определён при \(t>e\).

Доказательство второй формулы. Процесс \(-W\) тоже винеровский; применим первую формулу к \(-W\).

Геометрический смысл. Для любого \(\varepsilon>0\) почти наверное существует случайное \(T_\varepsilon\), после которого \[|W_t|\le(1+\varepsilon)\sqrt{2t\ln\ln t}.\] Но при этом траектория бесконечно часто достигает уровней выше \((1-\varepsilon)\sqrt{2t\ln\ln t}\) и ниже \(-(1-\varepsilon)\sqrt{2t\ln\ln t}\).

WarningВажное ограничение симуляций

\(\ln\ln t\) растёт чрезвычайно медленно. На конечном графике нельзя «проверить» предельный ЗПЛ: видимая траектория может долго не достигать нормированного уровня 1.

Show Python code
# Глобальный ЗПЛ на длинном временном горизонте (одна реализация)
T=30000;steps=100000
t,W=brownian_paths(T,steps,paths=1,seed=51)
mask=t>np.e**2
b=np.sqrt(2*t[mask]*np.log(np.log(t[mask])))
fig,ax=plt.subplots(figsize=(11,4.5))
ax.plot(t[mask],W[0,mask],lw=.75,label=r'$W_t$')
ax.plot(t[mask],b,'r--',lw=1,label=r'$\pm\sqrt{2t\ln\ln t}$')
ax.plot(t[mask],-b,'r--',lw=1)
ax.set(xlabel='t',ylabel='Значение',title='Глобальный ЗПЛ: медленно растущая граница');ax.legend();plt.show()
fig,ax=plt.subplots()
ax.plot(t[mask],W[0,mask]/b,lw=.8)
ax.axhline(1,color='r',ls='--');ax.axhline(-1,color='r',ls='--')
ax.set(xlabel='t',ylabel='Нормированное значение',title='Нормировка из закона повторного логарифма');plt.show()

6 6. Локальный ЗПЛ и обращение времени

TipСледствие 1.3 (локальный ЗПЛ)

Почти наверное \[\limsup_{t\downarrow0}\frac{W_t}{\sqrt{2t\ln\ln(1/t)}}=1,\qquad \liminf_{t\downarrow0}\frac{W_t}{\sqrt{2t\ln\ln(1/t)}}=-1.\] Здесь берём достаточно малые \(t\), например \(0<t<e^{-1}\).

Доказательство через обращение времени. Определим \[B_0=0,\qquad B_t=tW_{1/t},\quad t>0.\] Это центрированный гауссовский процесс и для \(s,t>0\) \[\operatorname{Cov}(B_s,B_t)=st\min(1/s,1/t)=\min(s,t).\] Также \(\operatorname{Cov}(B_0,B_t)=0\). По теореме 1.1 \(B\) — винеровский процесс по конечномерным распределениям; выбираем непрерывную версию. Полагая \(u=1/t\) и используя глобальный ЗПЛ для \(B\), получаем \[\frac{W_t}{\sqrt{2t\ln\ln(1/t)}}=\frac{B_{1/t}}{\sqrt{2(1/t)\ln\ln(1/t)}}.\] При \(t\downarrow0\) правая часть имеет limsup 1 и liminf \(-1\). \(\square\)

Следствие (дополнение). В нуле производная не существует даже справа: \(|W_t|/t\) испытывает сколь угодно большие осцилляции. По стационарности приращений это также верно в каждой фиксированной точке; теорема 1.3 утверждает одновременно для всех точек.

Show Python code
# Локальный ЗПЛ: масштабирование у нуля; корректная совместная симуляция
# Сначала симулируем W на мелкой равномерной сетке, затем рассматриваем t>0.
T=.1;steps=120000
t,W=brownian_paths(T,steps,paths=1,seed=19)
mask=(t>0)&(t<.09)
u=t[mask];b=np.sqrt(2*u*np.log(np.log(1/u)))
fig,ax=plt.subplots(figsize=(10,4.5))
ax.plot(u,W[0,mask],lw=.8,label=r'$W_t$')
ax.plot(u,b,'r--',lw=1,label='Локальные границы ЗПЛ')
ax.plot(u,-b,'r--',lw=1)
ax.set(xscale='log',xlabel='t (логарифмическая шкала)',title='Броуновская траектория вблизи нуля')
ax.legend();plt.show()

7 7. Дополнительные фундаментальные свойства

Эти факты добавлены сверх конспекта и полезны для дальнейших тем курса.

7.1 Масштабная инвариантность

Для \(c>0\) процесс \(\widetilde W_t=c^{-1/2}W_{ct}\) — снова винеровский. Проверка: гауссовость сохраняется, а ковариация равна \(c^{-1}\min(cs,ct)=\min(s,t)\).

7.2 Марковское свойство и мартингал

Для \(s<t\): \(W_t=W_s+(W_t-W_s)\), причём новое приращение независимо от прошлого \(\mathcal F_s\). Поэтому \[\mathbb E[W_t\mid\mathcal F_s]=W_s,\qquad W_t\mid\mathcal F_s\sim\mathcal N(W_s,t-s).\] Кроме того, \(W_t^2-t\) — мартингал, так как \[\mathbb E[W_t^2\mid\mathcal F_s]=W_s^2+(t-s).\]

7.3 Принцип отражения и максимум

Для \(a>0\) и \(T>0\): \[\mathbb P\left(\max_{0\le t\le T}W_t\ge a\right)=2\mathbb P(W_T\ge a)=2\left(1-\Phi\left(\frac a{\sqrt T}\right)\right).\] Следовательно \(\max_{t\le T}W_t\overset d=|W_T|\). Для времени первого достижения \(\tau_a=\inf\{t\ge0:W_t=a\}\): \[\mathbb P(\tau_a\le T)=2\left(1-\Phi\left(\frac a{\sqrt T}\right)\right).\]

7.4 Броуновский мост

Процесс \(B_t=W_t-tW_1\) на \([0,1]\) имеет \(B_0=B_1=0\) и \[\operatorname{Cov}(B_s,B_t)=\min(s,t)-st.\] Это гауссовский процесс, возникающий как броуновское движение, условленное на \(W_1=0\) (в смысле условного распределения).

Show Python code
# Броуновские мосты
T=1;t,W=brownian_paths(T,1600,paths=12,seed=67)
B=W-t[None,:]*W[:,-1,None]
fig,ax=plt.subplots()
ax.plot(t,B.T,alpha=.8,lw=1)
ax.axhline(0,color='k',lw=.6)
ax.set(xlabel='t',ylabel=r'$B_t$',title='Броуновский мост: обе конечные точки закреплены');plt.show()