GitModel|Task04|随机模拟
目錄
- 動手學隨機模擬
- 1. 如何通過隨機模擬估計看漲期權的報酬分布
- 1.1 金融知識:股票與看漲期權
- 1.2 問題分析與確定建模思路
- 1.3 如何模擬股票價格:布朗運動
- 1.4 如何更真實地模擬股票價格:幾何布朗運動
- 1.5 估計看漲期權的報酬分布
- 1.6 隨機模擬的幾個關鍵點
- 2.隨機模擬的關鍵:隨機數生成
- 2.1 隨機數生成的基礎:均勻分布的隨機數
- 構造滿足某個離散分布的隨機數
- 2.2 分布函數生成隨機數(逆變換)
- 2.3 拒絕采樣生成隨機數
- 2.4 MCMC(蒙特卡洛馬爾可夫)生成隨機數
動手學隨機模擬
1. 如何通過隨機模擬估計看漲期權的報酬分布
關鍵字:隨機模擬,看漲期權,報酬分布
1.1 金融知識:股票與看漲期權
- 權利金
- 行權價格
- 行權
- 買進看漲期權
- 期權的標的資產
期權買方享有權利而不用承擔義務
購買了看漲期權,收益上不封頂,虧損最多就是合約金(權利金)
一般來說,權利金的數額是遠遠低于標的資產(股票)本身的資產價格。換句話來說,期權是有杠桿的,現在你用2元的本金撬動了幾十元的收益,這是個十分關鍵的地方
1.2 問題分析與確定建模思路
看漲期權能得到報酬的關鍵點就是標的資產的價格,對于看漲期權來說,標的資產的價格越高,我們獲得報酬相應的也會越高。
問題的關鍵是:
- (1)在某個時刻如何估計股票的價格分布
- (2)在某個時刻結合行權價格與股票的價格分布,模擬看漲期權的報酬分布
股票價格是一個隨機過程,而看漲期權的價格(也是衍生品的價格)是隨機過程的函數
估計股票價格=>使用隨機過程近似股票價格這個隨機過程
我們發現曲線有如下特點:
- (1)股票價格走勢具有強烈的隨機性;
- (2)股票價格的曲線是一條"不平滑"的曲線,與我們前面學習的可微分的曲線不太一樣。
可以嘗試使用物理中的布朗運動去近似股票價格的無規律波動,數學上對布朗運動的描述發展相比于物理上的布朗運動要慢一些
1.3 如何模擬股票價格:布朗運動
設有一個粒子在直線上隨機游動, 該粒子在每個單位時間內等可能地向左或向右移動一個單位長度,觀察這個例子的軌跡圖
# 獲取隨機游動的位置 def get_particle_pos(n_times):position_ls = [0]for i in range(n_times-1):left_or_right = np.random.rand()if left_or_right >= 0.5:position_ls.append(1.0)else:position_ls.append(-1.0)position_ls = np.cumsum(position_ls)return position_lsn_times = 10000 position_arr = get_particle_pos(n_times = n_times) plt.figure(figsize=(8, 6)) plt.plot(np.arange(n_times), position_arr, lw=2, alpha=0.8) plt.xlabel("step") plt.ylabel("position") plt.title("隨機游動的位置") plt.show()我們將粒子的隨機游動與股價走勢放在一起對比一下:
plt.figure(figsize=(16, 6)) plt.subplot(1,2,1) plt.plot(np.arange(n_times), position_arr, lw=2, alpha=0.8) plt.xlabel("step") plt.ylabel("position") plt.title("隨機游動的位置") plt.subplot(1,2,2) plt.plot(gsyh['date'], gsyh['close'], lw=2, alpha=0.8) plt.xlabel("date") plt.ylabel("Price") plt.title("工商銀行價格走勢圖") plt.show()
通過對比一維布朗運動走勢和股票價格的走勢可以發現,這兩者在形狀上非常相似
布朗運動詳細定義
隨機過程 {X(t),t?0}\{X(t), t \geqslant 0\}{X(t),t?0} 如果滿足:
(1) X(0)=0X(0)=0X(0)=0;
(2) {X(t),t?0}\{X(t), t \geqslant 0\}{X(t),t?0} 有平穩獨立增量;
(3) 對每個 t>0,X(t)t>0, X(t)t>0,X(t) 服從正態分布 N(0,σ2t)N\left(0, \sigma^{2} t\right)N(0,σ2t),
則稱 {X(t),t?0}\{X(t), t \geqslant 0\}{X(t),t?0} 為 Brown 運動, 也稱為 Wiener 過程, 常記為 {B(t),t?0}\{B(t), t \geqslant 0\}{B(t),t?0} 或 {W(t),t?0}\{W(t), t \geqslant 0\}{W(t),t?0} 。
如果 σ=1\sigma=1σ=1, 我們稱為標準 Brown 運動; 如果 σ≠1\sigma \neq 1σ=1, 則可考慮 {X(t)/σ,t?0}\{X(t) / \sigma, t \geqslant 0\}{X(t)/σ,t?0}, 它是標準 Brown 運動。
我們可以驗證一維布朗運動(隨機游走)的定義(3),即:均值函數和方差函數分別為:0與σ2t\sigma^2 tσ2t以及每個時刻的位置分布為正態分布。
plt.figure(figsize=(16, 6)) plt.subplot(1,2,1) ## 模擬10000次隨機漫步 simulate_time = 10000 n_times = 100 result_ls = [] for i in range(simulate_time):position_arr = get_particle_pos(n_times=n_times)plt.plot(np.arange(n_times), position_arr, lw=2, alpha=0.8)result_ls.append(position_arr.tolist()) pos_mean = np.mean(result_ls, axis=0) pos_var = np.var(result_ls, axis=0) plt.plot(np.arange(n_times), pos_mean, lw=4, alpha=0.8, c='red', label='mean_func') plt.plot(np.arange(n_times), pos_var, lw=4, alpha=0.8, c='blue', label='var_func') plt.xlabel("step") plt.ylabel("position") plt.title("隨機游動的位置") plt.legend() plt.subplot(1,2,2) ## 選取index=60的位置分布 pos_60 = np.array(result_ls)[:, 60] plt.hist(pos_60, bins=100, density=1) plt.title("index=60的位置分布") plt.show()隨機游動的均值函數為0, 方差函數是一個關于時間ttt的直線函數,index為60的位置分布也符合正態分布,以上都是布朗運動的表現。
plt.figure(figsize=(12, 8)) simulate_times = 12 n_times = 10000 for i in range(simulate_times):position_arr = get_particle_pos(n_times=n_times)plt.plot(np.arange(n_times), position_arr, lw=2, alpha=0.75) plt.axhline(y=0, lw=6) plt.plot(np.arange(n_times), np.sqrt(np.arange(n_times)), lw=6, c='red', alpha=0.8, label=r'$t=pos^2$') plt.plot(np.arange(n_times), -np.sqrt(np.arange(n_times)), lw=6, c='red', alpha=0.8) plt.legend() plt.xlabel("t") plt.ylabel("position") plt.show()- (1)布朗運動的軌跡線會頻繁穿越pos=0pos = 0pos=0的水平線
我們把0基準線看成是股票的開盤價,頻繁穿越0基準線意味著股價很大概率會在開盤價上下波動,而不是始終維持在開盤價的上方或者下方。這一點的性質在很多股票投資的實踐經驗都有印證 - (2)在任意時刻 ttt, 樣本軌跡的位置 B(t)B(t)B(t) 不會偏離正負一個標準差太遠:我們在布朗運動的定義中的(3)可以知道,對每個 t>0,X(t)t>0, X(t)t>0,X(t) 服從正態分布 N(0,σ2t)N\left(0, \sigma^{2} t\right)N(0,σ2t),一個標準差即σt\sigma \sqrt{t}σt?,上圖中的紅色曲線可以包含絕大多數的樣本軌跡。這點可以說明,隨著交易時間ttt的推移,ttt時刻的股票價格始終不會偏離開盤價(0基準線)±t×\pm \sqrt{t} \times±t?× 價格波動的標準差,就算偏離也不會太遠(除了小概率事件)。
缺點
布朗運動可以是負數,因為布朗運動的樣本軌跡會頻繁穿越0基準線。然而,股票價格卻肯定不會是負數,這是布朗運動的理論與現實的矛盾。為了解決這個問題,我們可以改進布朗運動描述股票價格走勢,使用幾何布朗運動描述股票價格。
1.4 如何更真實地模擬股票價格:幾何布朗運動
為了解決使用布朗運動描述股票價格走勢會出現負數的問題,我們嘗試給布朗運動加上一個僅和時間 ttt 有關的漂移項 μt\mu tμt, 以及一個尺度參數 σ\sigmaσ,這樣就可以得到帶漂移項的布朗運動:
因為 X(t)X(t)X(t) 與 B(t)B(t)B(t) 的取值隨著時間 ttt 的變化也可以是負數, 但是股票的價格顯然不能是負數,這種辦法并沒有解決實際問題。
我們假設使用S(t)S(t)S(t)表示股票價格而X(t)X(t)X(t)是股票價格的自然對數,即:X(t)=ln(S(t))X(t) = ln(S(t))X(t)=ln(S(t))。因此,帶漂移項的布朗運動就變成了:
X(t)=ln(S(t))=μt+σB(t)X(t) = ln(S(t)) = \mu t+\sigma B(t) X(t)=ln(S(t))=μt+σB(t)
我們對X(t)=ln(S(t))=μt+σB(t)X(t) = ln(S(t)) = \mu t+\sigma B(t)X(t)=ln(S(t))=μt+σB(t)進行微分(簡單的對數函數求導),即:
dS(t)S(t)=μdt+σdB(t)\frac{d S(t)}{S(t)}=\mu d t+\sigma d B(t) S(t)dS(t)?=μdt+σdB(t)
dS(t)/S(t)d S(t) / S(t)dS(t)/S(t) 就 是這段間隔內的收益率
化簡上述的式子dS(t)S(t)=μdt+σdB(t)\frac{d S(t)}{S(t)}=\mu d t+\sigma d B(t)S(t)dS(t)?=μdt+σdB(t)得到:
dS(t)=μS(t)dt+σS(t)dB(t)d S(t)=\mu S(t) d t+\sigma S(t) d B(t) dS(t)=μS(t)dt+σS(t)dB(t)
式子:dS(t)=μS(t)dt+σS(t)dB(t)d S(t)=\mu S(t) d t+\sigma S(t) d B(t)dS(t)=μS(t)dt+σS(t)dB(t)是一個微分方程,這個微分方程是帶有隨機性的微分方程,簡稱"隨機微分方程"。因此,滿足上述隨機微分方程dS(t)=μS(t)dt+σS(t)dB(t)d S(t)=\mu S(t) d t+\sigma S(t) d B(t)dS(t)=μS(t)dt+σS(t)dB(t)的股價 S(t)S(t)S(t) 是一個幾何布朗運動。
我們可以使用歐拉離散化可以得到離散時間模型:
St=St?Δte(μ?12σ2)Δt+σεtΔtS_{t}=S_{t-\Delta t} e^{\left(\mu-\frac{1}{2} \sigma^{2}\right) \Delta t+\sigma \varepsilon_{t} \sqrt{\Delta t}} St?=St?Δt?e(μ?21?σ2)Δt+σεt?Δt?
離散時間模型的參數含義:
- StS_{t}St? : 證券在t時刻的價格;
- St?Δt\mathrm{S}_{\mathrm{t}-\Delta \mathrm{t}}St?Δt? : 證券在t ?Δt-\Delta \mathrm{t}?Δt 時刻的價格;
- μ\muμ :證券收益率的期望值;
- σ\sigmaσ :證券收益率的波動率;
- εt\varepsilon_{t}εt? : 服從正態分布(期望為 0 , 方差為 1 )
接下來,我們模擬證券初始價格為10(日收益率均值漂移項為0.005,波動率為0.25),模擬天數為300天,次數為5000次的幾何布朗運動價格。
# 我們模擬證券初始價格為10(日收益率均值漂移項為0.005,波動率為0.25),模擬天數為300天,次數為5000次的幾何布朗運動價格 S0 = 10 # 初始價格 n_days = 300 # 模擬天數 mu = 0.005 sigma = 0.25 delta_t = 1/n_days n_times = 5000 # 模擬次數 price_arr = np.zeros((n_times, n_days)) # n_times*n_days個價格 price_arr[: , 0] = S0 # 初始價格 for t in range(1, n_days):price_arr[:, t] = price_arr[:, t-1]*np.exp((mu-0.5*np.square(sigma))*delta_t+sigma*np.random.standard_normal(n_times)*np.sqrt(delta_t)) # 分別繪制一條軌跡和所有軌跡 plt.figure(figsize=(16, 6)) plt.subplot(1,2,1) plt.plot(np.arange(n_days), price_arr[0, :], lw=2, alpha=0.75) plt.xlabel("t") plt.ylabel("Price") plt.title("1條股價樣本軌跡") plt.subplot(1,2,2) for i in range(n_times):plt.plot(np.arange(n_days), price_arr[i, :], lw=2, alpha=0.75) plt.xlabel("t") plt.ylabel("Price") plt.title("5000條股價樣本軌跡") plt.show() # 繪制某一天的價格分布 plt.figure(figsize=(8, 6)) plt.hist(price_arr[60, :], bins=50, density=True) plt.xlabel("price") plt.title("index=60的價格分布") plt.show()以上的案例給定了離散時間模型的參數值,這是一種只會存在于習題中的情況,因為當我們想模擬一只具體的股票時,這些參數信息不會一下子彈到我們腦邊,我們需要根據實際數據估計其中的參數值。估計方法如下(不給證明了):
μ=E[ln?(St+ΔtSt)]/Δtσ2=var?[ln?(St+ΔtSt)]/Δt\begin{aligned} \mu &=E\left[\ln \left(\frac{S_{t+\Delta t}}{S_{t}}\right)\right] / \Delta t \\ \sigma^{2} &=\operatorname{var}\left[\ln \left(\frac{S_{t+\Delta t}}{S_{t}}\right)\right] / \Delta t \end{aligned} μσ2?=E[ln(St?St+Δt??)]/Δt=var[ln(St?St+Δt??)]/Δt?
可以從上述模擬中得到第300天的模擬價格分布,即:
import seaborn as sns palette = plt.get_cmap('tab20c') price_300 = price_arr[299, :] plt.figure(figsize=(8,6)) sns.histplot(price_300, kde = True, stat='probability', bins = 20, shrink = 1, color = palette.colors[0], edgecolor = palette.colors[-1]) plt.xlabel("Price") plt.show()小節:我們通過帶漂移項的布朗運動X(t)=μt+σB(t)X(t)=\mu t+\sigma B(t)X(t)=μt+σB(t)可以知道,X(t)X(t)X(t) 的期望為 E[X(t)]=μtE[X(t)]=\mu tE[X(t)]=μt,即t時刻的價格期望為μt\mu tμt。這是個十分有趣的結論,因為假如μ>0\mu > 0μ>0,那么t時刻的價格期望也會大于0。因此如果我們堅信股市長期來看是一個向上的牛市(雖然很緩慢),那么我們就應該接受短期波動而堅持長期持股,就像巴菲特的價值投資一樣。
1.5 估計看漲期權的報酬分布
現在我們假設行權價格是4.7元,我們來分析報酬在第300天的時候的報酬分布情況(忽略權利金、遠期利率和股息):
當股票價格大于行權價格,那么我將獲利;
當股票價格小于行權價格,那么我將虧損;
1.6 隨機模擬的幾個關鍵點
我們可以將隨機模擬分解為以下步驟:
- (1)確定事件的過程(仿真);
- (2)在事件中添加合適的分布的隨機數(隨機模擬);(關鍵)
- (3)得到模擬的結論;
采樣算法:(拒絕采樣、MCMC采樣)
(因為要從某個分布中采樣,采樣的樣本就是所謂的隨機數)
2.隨機模擬的關鍵:隨機數生成
- 計算機生成隨機數的基礎算法:均勻分布采樣
- 分布函數采樣
- 拒絕采樣
- MCMC采樣
2.1 隨機數生成的基礎:均勻分布的隨機數
偽隨機數生成的方法有很多, 比較簡單的一種方式比如:
xn+1=(axn+c)modm\mathrm{x}_{\mathrm{n}+1}=(\mathrm{ax_n} +\mathrm{c}) \bmod \mathrm{m} xn+1?=(axn?+c)modm
其中, XXX 為偽隨機序列,
- m,m>0m, m>0m,m>0, 模數, 也是生成序列的最大周期
- a,0<a<ma, 0<a<ma,0<a<m, 乘數
- c,0≤c<mc, 0 \leq c<mc,0≤c<m, 增量
- X0,0≤X0<mX_{0}, 0 \leq X_{0}<mX0?,0≤X0?<m, 種子點 (起始值)
Xn/n\mathrm{X}_{\mathrm{n}} / nXn?/n 近似服從 (0,1)(0,1)(0,1) 上的均勻分布。
這種方法叫線性同余法,使用線性同余法時需要特別小心參數設置,否則生成的隨機數將會十分糟糕。下面通過一組實驗看看不同的參數設置下生成的隨機數序列:
# 線性同余法 def get_uniform_sample(a, c, m, x0, n_times):uniform_ls = []for i in range(n_times):uniform_sample = (a*x0+c) % muniform_ls.append(uniform_sample)x0 = uniform_samplereturn uniform_lsn_times = 10 # 實驗次數 ## 第一組實驗: a, c, m, x0 = 11, 0, 8, 1 uniform_ls = get_uniform_sample(a, c, m, x0, n_times) print("第一次實驗:") print("a = %d, c = %d, m = %d, x0 = %d:\n" % (a, c, m, x0)) print(uniform_ls) print("============================") ## 第二組實驗: a, c, m, x0 = 25214903917, 11, 2**48, 1 # 這也是java.util.Random中的默認參數設置 uniform_ls = get_uniform_sample(a, c, m, x0, n_times) print("第二次實驗:") print("a = %d, c = %d, m = %d, x0 = %d:\n" % (a, c, m, x0)) print(uniform_ls)構造滿足某個離散分布的隨機數
上面的線性同余法是構造均勻分布的隨機數,如果我們需要構造滿足某個離散分布的隨機數,如:x=1,2,3,4x = 1, 2, 3, 4x=1,2,3,4分別滿足概率[0.1,0.3,0.5,0.1][0.1, 0.3, 0.5, 0.1][0.1,0.3,0.5,0.1]這個離散分布的隨機數。其實這個問題的解決方法并不難,需要用到均勻分布的隨機數:
- 生成一個[0,1][0,1][0,1]的均勻分布的隨機數xxx;
- 如果xxx在[0,0.1)[0, 0.1)[0,0.1),那么x=1x = 1x=1, 如果xxx在[0.1,0.4)[0.1, 0.4)[0.1,0.4),那么x=2x = 2x=2,如果xxx在[0.4,0.9)[0.4, 0.9)[0.4,0.9),那么x=3x = 3x=3,如果xxx在[0.9,1)[0.9, 1)[0.9,1),那么x=4x = 4x=4。
- 重復以上步驟n_times次就能獲得n_times個符合離散分布的隨機數
2.2 分布函數生成隨機數(逆變換)
通過使用均勻分布的隨機數構造別的分布的隨機數呢?答案是肯定的,這個方法叫逆變換法。
逆變換法的理論依據是:假設 X\mathrm{X}X 是一個連續型隨機變量,它的累積分布函數為 FX(x)F_{X}(x)FX?(x) ; 現在,定義隨機變量 Y=FX(X)Y=F_{X}(X)Y=FX?(X) 。那么, YYY 服從 (0,1)(0,1)(0,1) 上的均勻分布,即
P(Y≤y)=y,0<y<1.?P(Y \leq y)=y, 0<y<1 \text {. } P(Y≤y)=y,0<y<1.?
換句話說,任意分布的分布函數值服從(0,1)(0,1)(0,1)上的均勻分布
接下來,我們嘗試使用逆變換法通過均勻分布的隨機數構造指數分布的隨機數:
-
指數分布的概率密度函數為 fX(x)=f_{X}(x)=fX?(x)= λe?λx,x>0\lambda e^{-\lambda x}, x>0λe?λx,x>0 ,它的累積分布函數為
FX(x)=1?e?λx,x≥0\mathrm{F}_{X}(x)=1-e^{-\lambda x}, \quad \mathrm{x} \geq 0 FX?(x)=1?e?λx,x≥0 -
產生 (0,1)(0,1)(0,1) 均勻分布的隨機數 VVV(當作是指數分布的分布函數值)
-
令 Y=?1λlog?(V)Y=-\frac{1}{\lambda} \log (V)Y=?λ1?log(V)(將滿足均勻分布的分布函數進行逆變換),YYY 即為服從指數分布的隨機數
2.3 拒絕采樣生成隨機數
逆變換法需要求分布函數和逆變換
拒絕采樣開始采用蒙特卡洛的思想構造隨機數,我們先來看看下圖:
- p(x)p(x)p(x)是我們需要采樣的分布,有時候十分復雜,這里的p(x)=0.3e?(x?0.3)2+0.7e?(x?2.0)20.3p(x) = 0.3 e^{-(x - 0.3)^2} + 0.7e^{-\frac{(x - 2.0)^2}{0.3}}p(x)=0.3e?(x?0.3)2+0.7e?0.3(x?2.0)2?,其中0≤x≤40 \le x \le 40≤x≤4
- q(x)q(x)q(x)是我們的構造的分布,這里我們假設為[0, 4]的均勻分布
由于p(x)p(x)p(x)太復雜,我們無法直接采樣,因此我們借助輔助的分布q(x)q(x)q(x),這個輔助的分布滿足一個特點:q(x)q(x)q(x)乘一個常數MMM后的Mq(x)Mq(x)Mq(x)曲線能完全包住我們想要采樣的分布p(x)p(x)p(x)。
拒絕采樣的過程如下:
- 通過輔助分布q(x)q(x)q(x)采樣z0z_0z0?,輔助分布可以選擇常見的均勻分布或者正態分布;
- 計算u0=p(z0)u_0 = p(z_0)u0?=p(z0?)(圖中紅色的點);
- 在區間(0,Mq(z0)](0, Mq(z_0)](0,Mq(z0?)]范圍的均勻分布隨機采樣kkk,即在紅色的直線范圍按均勻分布采樣kkk;
- 判斷kkk的大小,
如果k<u0k<u_0k<u0?(即kkk位于u0u_0u0?下方),則接受z0z_0z0?是來自分布p(x)p(x)p(x)的隨機數;
反之,如果k≥u0k \ge u_0k≥u0?(即kkk位于u0u_0u0?上方),則拒絕z0z_0z0?是來自分布p(x)p(x)p(x)的隨機數。 - 重復以上過程,知道采樣個數為size為止。
2.4 MCMC(蒙特卡洛馬爾可夫)生成隨機數
我們在馬爾可夫鏈中又一個重要的結論:只要轉移概率矩陣合適,不管初始分布如何都會收斂到同一個平穩分布。
如果我們能找到一個轉移概率矩陣,這個矩陣得到的平穩分布剛好就是我們想要采樣的分布,那么我們可以讓平穩后的狀態就是我們所需要的采樣樣本,因為這些狀態都是由平穩分布得到的。
已知條件是平穩分布(我們需要采樣的分布),想要求一個轉移概率矩陣
隨便找一個轉移概率矩陣QQQ,π(i)Q(i,j)≠π(j)Q(j,i)\pi(i) Q(i, j) \neq \pi(j) Q(j, i)π(i)Q(i,j)=π(j)Q(j,i)。如果想讓平穩條件成立,可以引入α(i,j)\alpha(i, j)α(i,j),則:
π(i)Q(i,j)α(i,j)=π(j)Q(j,i)α(j,i)\pi(i) Q(i, j) \alpha(i, j)=\pi(j) Q(j, i) \alpha(j, i) π(i)Q(i,j)α(i,j)=π(j)Q(j,i)α(j,i)
最簡單的α(i,j)\alpha(i, j)α(i,j)與α(j,i)\alpha(j, i)α(j,i)是:
α(i,j)=π(j)Q(j,i)α(j,i)=π(i)Q(i,j)\begin{aligned} &\alpha(i, j)=\pi(j) Q(j, i) \\ &\alpha(j, i)=\pi(i) Q(i, j) \end{aligned} ?α(i,j)=π(j)Q(j,i)α(j,i)=π(i)Q(i,j)?
α(i,j)\alpha(i, j)α(i,j) 我們有一般稱之為接受率,α(i,j)\alpha(i, j)α(i,j)取值在 [0,1][0,1][0,1] 之間, 可以理解為一個概率值(可以從均勻分布中采樣)。
最后,我們總結下MCMC采樣的過程:
- 輸入任意的轉移概率矩陣Q(i,j)Q(i,j)Q(i,j),假設n1n_1n1?次轉移后能夠到達平穩,需要采n2n_2n2?個樣本。因此采樣算法從n1n_1n1?次后才真正進行,目的是放棄平穩前的采樣值,因為只有平穩后的分布才是我們的目標采樣分布,如果采用了平穩前的樣本,這些樣本的分布將不是我們的目標分布。
- 隨機產生一個初始值x0x_0x0?
- for t=0t=0t=0 to n1+n2?1n_{1}+n_{2}-1n1?+n2??1 :
- 從條件概率分布 Q(x∣xt)Q\left(x \mid x_{t}\right)Q(x∣xt?) 中采樣得到樣本 x?x_{*}x??
- 從均勻分布采樣 u~uniform[0,1]u \sim uniform[0,1]u~uniform[0,1]
- 如果 u<α(xt,x?)=π(x?)Q(x?,xt)u<\alpha\left(x_{t}, x_{*}\right)=\pi\left(x_{*}\right) Q\left(x_{*}, x_{t}\right)u<α(xt?,x??)=π(x??)Q(x??,xt?) ,則接受轉移 xt→x?x_{t} \rightarrow x_{*}xt?→x?? ,即 xt+1=x?x_{t+1}=x_{*}xt+1?=x??
- 否則不接受轉移,即 xt+1=xtx_{t+1}=x_{t}xt+1?=xt? - 樣本集 (xn1,xn1+1,…,xn1+n2?1)\left(x_{n_{1}}, x_{n_{1}+1}, \ldots, x_{n_{1}+n_{2}-1}\right)(xn1??,xn1?+1?,…,xn1?+n2??1?) (注意不能取前n1n_1n1?個樣本)即為我們需要的平穩分布對應的隨機樣本。
exp
現在,我們使用MCMC采樣來對p(x)=0.3e?(x?0.3)2+0.7e?(x?2.0)20.3p(x) = 0.3 e^{-(x - 0.3)^2} + 0.7e^{-\frac{(x - 2.0)^2}{0.3}}p(x)=0.3e?(x?0.3)2+0.7e?0.3(x?2.0)2?,其中0≤x≤40 \le x \le 40≤x≤4進行隨機采樣:
- 假設Q(i,j)Q(i,j)Q(i,j)為$\mu ,,,\sigma$的正態分布
- 初始樣本x0=0x_0 = 0x0?=0
總結
以上是生活随笔為你收集整理的GitModel|Task04|随机模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Java实现Comet风格的Web应
- 下一篇: 基带信号、载波、带通信号