GitModel|Task04|随机模拟
目錄
- 動(dòng)手學(xué)隨機(jī)模擬
- 1. 如何通過隨機(jī)模擬估計(jì)看漲期權(quán)的報(bào)酬分布
- 1.1 金融知識(shí):股票與看漲期權(quán)
- 1.2 問題分析與確定建模思路
- 1.3 如何模擬股票價(jià)格:布朗運(yùn)動(dòng)
- 1.4 如何更真實(shí)地模擬股票價(jià)格:幾何布朗運(yùn)動(dòng)
- 1.5 估計(jì)看漲期權(quán)的報(bào)酬分布
- 1.6 隨機(jī)模擬的幾個(gè)關(guān)鍵點(diǎn)
- 2.隨機(jī)模擬的關(guān)鍵:隨機(jī)數(shù)生成
- 2.1 隨機(jī)數(shù)生成的基礎(chǔ):均勻分布的隨機(jī)數(shù)
- 構(gòu)造滿足某個(gè)離散分布的隨機(jī)數(shù)
- 2.2 分布函數(shù)生成隨機(jī)數(shù)(逆變換)
- 2.3 拒絕采樣生成隨機(jī)數(shù)
- 2.4 MCMC(蒙特卡洛馬爾可夫)生成隨機(jī)數(shù)
動(dòng)手學(xué)隨機(jī)模擬
1. 如何通過隨機(jī)模擬估計(jì)看漲期權(quán)的報(bào)酬分布
關(guān)鍵字:隨機(jī)模擬,看漲期權(quán),報(bào)酬分布
1.1 金融知識(shí):股票與看漲期權(quán)
- 權(quán)利金
- 行權(quán)價(jià)格
- 行權(quán)
- 買進(jìn)看漲期權(quán)
- 期權(quán)的標(biāo)的資產(chǎn)
期權(quán)買方享有權(quán)利而不用承擔(dān)義務(wù)
購(gòu)買了看漲期權(quán),收益上不封頂,虧損最多就是合約金(權(quán)利金)
一般來說,權(quán)利金的數(shù)額是遠(yuǎn)遠(yuǎn)低于標(biāo)的資產(chǎn)(股票)本身的資產(chǎn)價(jià)格。換句話來說,期權(quán)是有杠桿的,現(xiàn)在你用2元的本金撬動(dòng)了幾十元的收益,這是個(gè)十分關(guān)鍵的地方
1.2 問題分析與確定建模思路
看漲期權(quán)能得到報(bào)酬的關(guān)鍵點(diǎn)就是標(biāo)的資產(chǎn)的價(jià)格,對(duì)于看漲期權(quán)來說,標(biāo)的資產(chǎn)的價(jià)格越高,我們獲得報(bào)酬相應(yīng)的也會(huì)越高。
問題的關(guān)鍵是:
- (1)在某個(gè)時(shí)刻如何估計(jì)股票的價(jià)格分布
- (2)在某個(gè)時(shí)刻結(jié)合行權(quán)價(jià)格與股票的價(jià)格分布,模擬看漲期權(quán)的報(bào)酬分布
股票價(jià)格是一個(gè)隨機(jī)過程,而看漲期權(quán)的價(jià)格(也是衍生品的價(jià)格)是隨機(jī)過程的函數(shù)
估計(jì)股票價(jià)格=>使用隨機(jī)過程近似股票價(jià)格這個(gè)隨機(jī)過程
我們發(fā)現(xiàn)曲線有如下特點(diǎn):
- (1)股票價(jià)格走勢(shì)具有強(qiáng)烈的隨機(jī)性;
- (2)股票價(jià)格的曲線是一條"不平滑"的曲線,與我們前面學(xué)習(xí)的可微分的曲線不太一樣。
可以嘗試使用物理中的布朗運(yùn)動(dòng)去近似股票價(jià)格的無規(guī)律波動(dòng),數(shù)學(xué)上對(duì)布朗運(yùn)動(dòng)的描述發(fā)展相比于物理上的布朗運(yùn)動(dòng)要慢一些
1.3 如何模擬股票價(jià)格:布朗運(yùn)動(dòng)
設(shè)有一個(gè)粒子在直線上隨機(jī)游動(dòng), 該粒子在每個(gè)單位時(shí)間內(nèi)等可能地向左或向右移動(dòng)一個(gè)單位長(zhǎng)度,觀察這個(gè)例子的軌跡圖
# 獲取隨機(jī)游動(dòng)的位置 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("隨機(jī)游動(dòng)的位置") plt.show()我們將粒子的隨機(jī)游動(dòng)與股價(jià)走勢(shì)放在一起對(duì)比一下:
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("隨機(jī)游動(dòng)的位置") plt.subplot(1,2,2) plt.plot(gsyh['date'], gsyh['close'], lw=2, alpha=0.8) plt.xlabel("date") plt.ylabel("Price") plt.title("工商銀行價(jià)格走勢(shì)圖") plt.show()
通過對(duì)比一維布朗運(yùn)動(dòng)走勢(shì)和股票價(jià)格的走勢(shì)可以發(fā)現(xiàn),這兩者在形狀上非常相似
布朗運(yùn)動(dòng)詳細(xì)定義
隨機(jī)過程 {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} 有平穩(wěn)獨(dú)立增量;
(3) 對(duì)每個(gè) t>0,X(t)t>0, X(t)t>0,X(t) 服從正態(tài)分布 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 運(yùn)動(dòng), 也稱為 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, 我們稱為標(biāo)準(zhǔn) Brown 運(yùn)動(dòng); 如果 σ≠1\sigma \neq 1σ=1, 則可考慮 {X(t)/σ,t?0}\{X(t) / \sigma, t \geqslant 0\}{X(t)/σ,t?0}, 它是標(biāo)準(zhǔn) Brown 運(yùn)動(dòng)。
我們可以驗(yàn)證一維布朗運(yùn)動(dòng)(隨機(jī)游走)的定義(3),即:均值函數(shù)和方差函數(shù)分別為:0與σ2t\sigma^2 tσ2t以及每個(gè)時(shí)刻的位置分布為正態(tài)分布。
plt.figure(figsize=(16, 6)) plt.subplot(1,2,1) ## 模擬10000次隨機(jī)漫步 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("隨機(jī)游動(dòng)的位置") 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()隨機(jī)游動(dòng)的均值函數(shù)為0, 方差函數(shù)是一個(gè)關(guān)于時(shí)間ttt的直線函數(shù),index為60的位置分布也符合正態(tài)分布,以上都是布朗運(yùn)動(dòng)的表現(xiàn)。
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)布朗運(yùn)動(dòng)的軌跡線會(huì)頻繁穿越pos=0pos = 0pos=0的水平線
我們把0基準(zhǔn)線看成是股票的開盤價(jià),頻繁穿越0基準(zhǔn)線意味著股價(jià)很大概率會(huì)在開盤價(jià)上下波動(dòng),而不是始終維持在開盤價(jià)的上方或者下方。這一點(diǎn)的性質(zhì)在很多股票投資的實(shí)踐經(jīng)驗(yàn)都有印證 - (2)在任意時(shí)刻 ttt, 樣本軌跡的位置 B(t)B(t)B(t) 不會(huì)偏離正負(fù)一個(gè)標(biāo)準(zhǔn)差太遠(yuǎn):我們?cè)诓祭蔬\(yùn)動(dòng)的定義中的(3)可以知道,對(duì)每個(gè) t>0,X(t)t>0, X(t)t>0,X(t) 服從正態(tài)分布 N(0,σ2t)N\left(0, \sigma^{2} t\right)N(0,σ2t),一個(gè)標(biāo)準(zhǔn)差即σt\sigma \sqrt{t}σt?,上圖中的紅色曲線可以包含絕大多數(shù)的樣本軌跡。這點(diǎn)可以說明,隨著交易時(shí)間ttt的推移,ttt時(shí)刻的股票價(jià)格始終不會(huì)偏離開盤價(jià)(0基準(zhǔn)線)±t×\pm \sqrt{t} \times±t?× 價(jià)格波動(dòng)的標(biāo)準(zhǔn)差,就算偏離也不會(huì)太遠(yuǎn)(除了小概率事件)。
缺點(diǎn)
布朗運(yùn)動(dòng)可以是負(fù)數(shù),因?yàn)椴祭蔬\(yùn)動(dòng)的樣本軌跡會(huì)頻繁穿越0基準(zhǔn)線。然而,股票價(jià)格卻肯定不會(huì)是負(fù)數(shù),這是布朗運(yùn)動(dòng)的理論與現(xiàn)實(shí)的矛盾。為了解決這個(gè)問題,我們可以改進(jìn)布朗運(yùn)動(dòng)描述股票價(jià)格走勢(shì),使用幾何布朗運(yùn)動(dòng)描述股票價(jià)格。
1.4 如何更真實(shí)地模擬股票價(jià)格:幾何布朗運(yùn)動(dòng)
為了解決使用布朗運(yùn)動(dòng)描述股票價(jià)格走勢(shì)會(huì)出現(xiàn)負(fù)數(shù)的問題,我們嘗試給布朗運(yùn)動(dòng)加上一個(gè)僅和時(shí)間 ttt 有關(guān)的漂移項(xiàng) μt\mu tμt, 以及一個(gè)尺度參數(shù) σ\sigmaσ,這樣就可以得到帶漂移項(xiàng)的布朗運(yùn)動(dòng):
因?yàn)?X(t)X(t)X(t) 與 B(t)B(t)B(t) 的取值隨著時(shí)間 ttt 的變化也可以是負(fù)數(shù), 但是股票的價(jià)格顯然不能是負(fù)數(shù),這種辦法并沒有解決實(shí)際問題。
我們假設(shè)使用S(t)S(t)S(t)表示股票價(jià)格而X(t)X(t)X(t)是股票價(jià)格的自然對(duì)數(shù),即:X(t)=ln(S(t))X(t) = ln(S(t))X(t)=ln(S(t))。因此,帶漂移項(xiàng)的布朗運(yùn)動(dòng)就變成了:
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)
我們對(duì)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)進(jìn)行微分(簡(jiǎn)單的對(duì)數(shù)函數(shù)求導(dǎo)),即:
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) 就 是這段間隔內(nèi)的收益率
化簡(jiǎn)上述的式子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)是一個(gè)微分方程,這個(gè)微分方程是帶有隨機(jī)性的微分方程,簡(jiǎn)稱"隨機(jī)微分方程"。因此,滿足上述隨機(jī)微分方程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)的股價(jià) S(t)S(t)S(t) 是一個(gè)幾何布朗運(yùn)動(dòng)。
我們可以使用歐拉離散化可以得到離散時(shí)間模型:
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?
離散時(shí)間模型的參數(shù)含義:
- StS_{t}St? : 證券在t時(shí)刻的價(jià)格;
- St?Δt\mathrm{S}_{\mathrm{t}-\Delta \mathrm{t}}St?Δt? : 證券在t ?Δt-\Delta \mathrm{t}?Δt 時(shí)刻的價(jià)格;
- μ\muμ :證券收益率的期望值;
- σ\sigmaσ :證券收益率的波動(dòng)率;
- εt\varepsilon_{t}εt? : 服從正態(tài)分布(期望為 0 , 方差為 1 )
接下來,我們模擬證券初始價(jià)格為10(日收益率均值漂移項(xiàng)為0.005,波動(dòng)率為0.25),模擬天數(shù)為300天,次數(shù)為5000次的幾何布朗運(yùn)動(dòng)價(jià)格。
# 我們模擬證券初始價(jià)格為10(日收益率均值漂移項(xiàng)為0.005,波動(dòng)率為0.25),模擬天數(shù)為300天,次數(shù)為5000次的幾何布朗運(yùn)動(dòng)價(jià)格 S0 = 10 # 初始價(jià)格 n_days = 300 # 模擬天數(shù) mu = 0.005 sigma = 0.25 delta_t = 1/n_days n_times = 5000 # 模擬次數(shù) price_arr = np.zeros((n_times, n_days)) # n_times*n_days個(gè)價(jià)格 price_arr[: , 0] = S0 # 初始價(jià)格 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條股價(jià)樣本軌跡") 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條股價(jià)樣本軌跡") plt.show() # 繪制某一天的價(jià)格分布 plt.figure(figsize=(8, 6)) plt.hist(price_arr[60, :], bins=50, density=True) plt.xlabel("price") plt.title("index=60的價(jià)格分布") plt.show()以上的案例給定了離散時(shí)間模型的參數(shù)值,這是一種只會(huì)存在于習(xí)題中的情況,因?yàn)楫?dāng)我們想模擬一只具體的股票時(shí),這些參數(shù)信息不會(huì)一下子彈到我們腦邊,我們需要根據(jù)實(shí)際數(shù)據(jù)估計(jì)其中的參數(shù)值。估計(jì)方法如下(不給證明了):
μ=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天的模擬價(jià)格分布,即:
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()小節(jié):我們通過帶漂移項(xiàng)的布朗運(yùn)動(dòng)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時(shí)刻的價(jià)格期望為μt\mu tμt。這是個(gè)十分有趣的結(jié)論,因?yàn)榧偃?span id="ze8trgl8bvbq" class="katex--inline">μ>0\mu > 0μ>0,那么t時(shí)刻的價(jià)格期望也會(huì)大于0。因此如果我們堅(jiān)信股市長(zhǎng)期來看是一個(gè)向上的牛市(雖然很緩慢),那么我們就應(yīng)該接受短期波動(dòng)而堅(jiān)持長(zhǎng)期持股,就像巴菲特的價(jià)值投資一樣。
1.5 估計(jì)看漲期權(quán)的報(bào)酬分布
現(xiàn)在我們假設(shè)行權(quán)價(jià)格是4.7元,我們來分析報(bào)酬在第300天的時(shí)候的報(bào)酬分布情況(忽略權(quán)利金、遠(yuǎn)期利率和股息):
當(dāng)股票價(jià)格大于行權(quán)價(jià)格,那么我將獲利;
當(dāng)股票價(jià)格小于行權(quán)價(jià)格,那么我將虧損;
1.6 隨機(jī)模擬的幾個(gè)關(guān)鍵點(diǎn)
我們可以將隨機(jī)模擬分解為以下步驟:
- (1)確定事件的過程(仿真);
- (2)在事件中添加合適的分布的隨機(jī)數(shù)(隨機(jī)模擬);(關(guān)鍵)
- (3)得到模擬的結(jié)論;
采樣算法:(拒絕采樣、MCMC采樣)
(因?yàn)橐獜哪硞€(gè)分布中采樣,采樣的樣本就是所謂的隨機(jī)數(shù))
2.隨機(jī)模擬的關(guān)鍵:隨機(jī)數(shù)生成
- 計(jì)算機(jī)生成隨機(jī)數(shù)的基礎(chǔ)算法:均勻分布采樣
- 分布函數(shù)采樣
- 拒絕采樣
- MCMC采樣
2.1 隨機(jī)數(shù)生成的基礎(chǔ):均勻分布的隨機(jī)數(shù)
偽隨機(jī)數(shù)生成的方法有很多, 比較簡(jiǎn)單的一種方式比如:
xn+1=(axn+c)modm\mathrm{x}_{\mathrm{n}+1}=(\mathrm{ax_n} +\mathrm{c}) \bmod \mathrm{m} xn+1?=(axn?+c)modm
其中, XXX 為偽隨機(jī)序列,
- m,m>0m, m>0m,m>0, 模數(shù), 也是生成序列的最大周期
- a,0<a<ma, 0<a<ma,0<a<m, 乘數(shù)
- c,0≤c<mc, 0 \leq c<mc,0≤c<m, 增量
- X0,0≤X0<mX_{0}, 0 \leq X_{0}<mX0?,0≤X0?<m, 種子點(diǎn) (起始值)
Xn/n\mathrm{X}_{\mathrm{n}} / nXn?/n 近似服從 (0,1)(0,1)(0,1) 上的均勻分布。
這種方法叫線性同余法,使用線性同余法時(shí)需要特別小心參數(shù)設(shè)置,否則生成的隨機(jī)數(shù)將會(huì)十分糟糕。下面通過一組實(shí)驗(yàn)看看不同的參數(shù)設(shè)置下生成的隨機(jī)數(shù)序列:
# 線性同余法 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 # 實(shí)驗(yàn)次數(shù) ## 第一組實(shí)驗(yàn): a, c, m, x0 = 11, 0, 8, 1 uniform_ls = get_uniform_sample(a, c, m, x0, n_times) print("第一次實(shí)驗(yàn):") print("a = %d, c = %d, m = %d, x0 = %d:\n" % (a, c, m, x0)) print(uniform_ls) print("============================") ## 第二組實(shí)驗(yàn): a, c, m, x0 = 25214903917, 11, 2**48, 1 # 這也是java.util.Random中的默認(rèn)參數(shù)設(shè)置 uniform_ls = get_uniform_sample(a, c, m, x0, n_times) print("第二次實(shí)驗(yàn):") print("a = %d, c = %d, m = %d, x0 = %d:\n" % (a, c, m, x0)) print(uniform_ls)構(gòu)造滿足某個(gè)離散分布的隨機(jī)數(shù)
上面的線性同余法是構(gòu)造均勻分布的隨機(jī)數(shù),如果我們需要構(gòu)造滿足某個(gè)離散分布的隨機(jī)數(shù),如: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]這個(gè)離散分布的隨機(jī)數(shù)。其實(shí)這個(gè)問題的解決方法并不難,需要用到均勻分布的隨機(jī)數(shù):
- 生成一個(gè)[0,1][0,1][0,1]的均勻分布的隨機(jī)數(shù)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。
- 重復(fù)以上步驟n_times次就能獲得n_times個(gè)符合離散分布的隨機(jī)數(shù)
2.2 分布函數(shù)生成隨機(jī)數(shù)(逆變換)
通過使用均勻分布的隨機(jī)數(shù)構(gòu)造別的分布的隨機(jī)數(shù)呢?答案是肯定的,這個(gè)方法叫逆變換法。
逆變換法的理論依據(jù)是:假設(shè) X\mathrm{X}X 是一個(gè)連續(xù)型隨機(jī)變量,它的累積分布函數(shù)為 FX(x)F_{X}(x)FX?(x) ; 現(xiàn)在,定義隨機(jī)變量 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.?
換句話說,任意分布的分布函數(shù)值服從(0,1)(0,1)(0,1)上的均勻分布
接下來,我們嘗試使用逆變換法通過均勻分布的隨機(jī)數(shù)構(gòu)造指數(shù)分布的隨機(jī)數(shù):
-
指數(shù)分布的概率密度函數(shù)為 fX(x)=f_{X}(x)=fX?(x)= λe?λx,x>0\lambda e^{-\lambda x}, x>0λe?λx,x>0 ,它的累積分布函數(shù)為
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 -
產(chǎn)生 (0,1)(0,1)(0,1) 均勻分布的隨機(jī)數(shù) VVV(當(dāng)作是指數(shù)分布的分布函數(shù)值)
-
令 Y=?1λlog?(V)Y=-\frac{1}{\lambda} \log (V)Y=?λ1?log(V)(將滿足均勻分布的分布函數(shù)進(jìn)行逆變換),YYY 即為服從指數(shù)分布的隨機(jī)數(shù)
2.3 拒絕采樣生成隨機(jī)數(shù)
逆變換法需要求分布函數(shù)和逆變換
拒絕采樣開始采用蒙特卡洛的思想構(gòu)造隨機(jī)數(shù),我們先來看看下圖:
- p(x)p(x)p(x)是我們需要采樣的分布,有時(shí)候十分復(fù)雜,這里的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)是我們的構(gòu)造的分布,這里我們假設(shè)為[0, 4]的均勻分布
由于p(x)p(x)p(x)太復(fù)雜,我們無法直接采樣,因此我們借助輔助的分布q(x)q(x)q(x),這個(gè)輔助的分布滿足一個(gè)特點(diǎn):q(x)q(x)q(x)乘一個(gè)常數(shù)MMM后的Mq(x)Mq(x)Mq(x)曲線能完全包住我們想要采樣的分布p(x)p(x)p(x)。
拒絕采樣的過程如下:
- 通過輔助分布q(x)q(x)q(x)采樣z0z_0z0?,輔助分布可以選擇常見的均勻分布或者正態(tài)分布;
- 計(jì)算u0=p(z0)u_0 = p(z_0)u0?=p(z0?)(圖中紅色的點(diǎn));
- 在區(qū)間(0,Mq(z0)](0, Mq(z_0)](0,Mq(z0?)]范圍的均勻分布隨機(jī)采樣kkk,即在紅色的直線范圍按均勻分布采樣kkk;
- 判斷kkk的大小,
如果k<u0k<u_0k<u0?(即kkk位于u0u_0u0?下方),則接受z0z_0z0?是來自分布p(x)p(x)p(x)的隨機(jī)數(shù);
反之,如果k≥u0k \ge u_0k≥u0?(即kkk位于u0u_0u0?上方),則拒絕z0z_0z0?是來自分布p(x)p(x)p(x)的隨機(jī)數(shù)。 - 重復(fù)以上過程,知道采樣個(gè)數(shù)為size為止。
2.4 MCMC(蒙特卡洛馬爾可夫)生成隨機(jī)數(shù)
我們?cè)隈R爾可夫鏈中又一個(gè)重要的結(jié)論:只要轉(zhuǎn)移概率矩陣合適,不管初始分布如何都會(huì)收斂到同一個(gè)平穩(wěn)分布。
如果我們能找到一個(gè)轉(zhuǎn)移概率矩陣,這個(gè)矩陣得到的平穩(wěn)分布剛好就是我們想要采樣的分布,那么我們可以讓平穩(wěn)后的狀態(tài)就是我們所需要的采樣樣本,因?yàn)檫@些狀態(tài)都是由平穩(wěn)分布得到的。
已知條件是平穩(wěn)分布(我們需要采樣的分布),想要求一個(gè)轉(zhuǎn)移概率矩陣
隨便找一個(gè)轉(zhuǎn)移概率矩陣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)。如果想讓平穩(wěn)條件成立,可以引入α(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)
最簡(jiǎn)單的α(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] 之間, 可以理解為一個(gè)概率值(可以從均勻分布中采樣)。
最后,我們總結(jié)下MCMC采樣的過程:
- 輸入任意的轉(zhuǎn)移概率矩陣Q(i,j)Q(i,j)Q(i,j),假設(shè)n1n_1n1?次轉(zhuǎn)移后能夠到達(dá)平穩(wěn),需要采n2n_2n2?個(gè)樣本。因此采樣算法從n1n_1n1?次后才真正進(jìn)行,目的是放棄平穩(wěn)前的采樣值,因?yàn)橹挥衅椒€(wěn)后的分布才是我們的目標(biāo)采樣分布,如果采用了平穩(wěn)前的樣本,這些樣本的分布將不是我們的目標(biāo)分布。
- 隨機(jī)產(chǎn)生一個(gè)初始值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?) ,則接受轉(zhuǎn)移 xt→x?x_{t} \rightarrow x_{*}xt?→x?? ,即 xt+1=x?x_{t+1}=x_{*}xt+1?=x??
- 否則不接受轉(zhuǎn)移,即 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?個(gè)樣本)即為我們需要的平穩(wěn)分布對(duì)應(yīng)的隨機(jī)樣本。
exp
現(xiàn)在,我們使用MCMC采樣來對(duì)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進(jìn)行隨機(jī)采樣:
- 假設(shè)Q(i,j)Q(i,j)Q(i,j)為$\mu ,,,\sigma$的正態(tài)分布
- 初始樣本x0=0x_0 = 0x0?=0
總結(jié)
以上是生活随笔為你收集整理的GitModel|Task04|随机模拟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Java实现Comet风格的Web应
- 下一篇: 基带信号、载波、带通信号