PYTHON 用幾何布朗運(yùn)動(dòng)模型和蒙特卡羅MONTE CARLO隨機(jī)過程模擬股票價(jià)格可視化分析耐克
原文鏈接:http://tecdat.cn/?p=27099
最近我們被客戶要求撰寫關(guān)于蒙特卡羅的研究報(bào)告,包括一些圖形和統(tǒng)計(jì)輸出。
金融資產(chǎn)/證券已使用多種技術(shù)進(jìn)行建模。該項(xiàng)目的主要目標(biāo)是使用幾何布朗運(yùn)動(dòng)模型和蒙特卡羅模擬來模擬股票價(jià)格。該模型基于受乘性噪聲影響的隨機(jī)(與確定性相反)變量
該項(xiàng)目分兩部分完成:
第一部分涉及為幾何布朗運(yùn)動(dòng)編寫代碼,并檢查和驗(yàn)證它是否工作。這是使用 Python 中的幾個(gè)函數(shù)完成的,并使用迭代設(shè)置將后續(xù)股票價(jià)格建模為馬爾可夫鏈,給定初始起始價(jià)格 S0。驗(yàn)證過程包括運(yùn)行多個(gè)模擬或隨機(jī)游走樣本,然后檢查結(jié)果分布,以查看股票價(jià)格、收益和波動(dòng)性是否滿足某些屬性和假設(shè)。
第二階段涉及探索,將模型實(shí)際應(yīng)用于實(shí)際股票價(jià)格,并使用耐克股票的真實(shí)股票數(shù)據(jù)進(jìn)行回測(cè)。模擬是通過獲取收益率 μ 和波動(dòng)率 σ 的樣本值并觀察股票價(jià)格演變的模擬數(shù)據(jù)和真實(shí)數(shù)據(jù)之間的相關(guān)程度來完成的。
模擬需要大約 10-15 分鐘才能完全運(yùn)行。請(qǐng)注意,對(duì)模擬結(jié)果的所有解釋都是通過解釋價(jià)格水平和收益率的結(jié)果分布的均值和方差等參數(shù)來完成的。
假設(shè)
此項(xiàng)目中使用了以下變量和符號(hào)列表:
S0 - 初始股票價(jià)格
St - 時(shí)間的股票價(jià)格,t
μ - 在特定時(shí)間段內(nèi)平均的股票收益(漂移)率
σ - 在特定時(shí)間段內(nèi)平均的股票波動(dòng)率(標(biāo)準(zhǔn)差)
dt - 模擬的時(shí)間步長(zhǎng),對(duì)應(yīng)于一天內(nèi)股票價(jià)格采樣的頻率
N - 模擬的總天數(shù)。
r - 無風(fēng)險(xiǎn)利率,任何人都可以借/貸
還對(duì)股票市場(chǎng)/價(jià)格做出了以下假設(shè)。雖然這些假設(shè)確實(shí)有助于大大簡(jiǎn)化模型,但它們非?,F(xiàn)實(shí),有助于在理想情況下制定模型。
股票價(jià)格遵循馬爾科夫過程,即是無記憶的,隨后的股票價(jià)格僅取決于當(dāng)前價(jià)值,而不取決于任何先前的價(jià)值。
與 N 相比,考慮的時(shí)間步長(zhǎng) dt 較短,即 Ndt>>1
市場(chǎng)完整高效,不存在套利機(jī)會(huì)。
沒有股息、交易成本或稅收考慮。
**
拓端
,贊9
**
拓端
,贊16
維納過程和幾何布朗運(yùn)動(dòng)
維納過程(也稱為布朗運(yùn)動(dòng))是一個(gè)具有連續(xù)變量和連續(xù)時(shí)間的馬爾可夫過程。對(duì)于隨機(jī)變量 z,它有兩個(gè)重要的性質(zhì):
所有的 Δz 都是統(tǒng)計(jì)獨(dú)立的。
dz = εdt
其中 ? 來自正態(tài)分布
通過將漂移項(xiàng) a(x,t)dt 添加到隨機(jī)過程 dz 上,可以將維納過程進(jìn)一步推廣到 Ito 過程。?
對(duì)于股票價(jià)格,上述方程是 Ito 過程,也稱為幾何布朗運(yùn)動(dòng),描述了隨時(shí)間的隨機(jī)變化。請(qǐng)注意,μ 和 σ 分別是瞬時(shí)漂移和標(biāo)準(zhǔn)偏差率。S 遵循一個(gè)受乘性噪聲影響的隨機(jī)過程。這里還需要注意的是,幾何布朗運(yùn)動(dòng)模型避免了負(fù)股票價(jià)格的問題。
為股票價(jià)格的解決方案建模
上述隨機(jī)微分方程 (SDE) 具有以下形式的解析解:
請(qǐng)注意,在上述等式中,常數(shù) μ 和 σ 分別對(duì)應(yīng)于股票價(jià)格的百分比漂移(收益)和百分比波動(dòng)(標(biāo)準(zhǔn)差)率。Wt 指的是由 dz=?dt 給出的維納過程,如上所述。該解方程用于以下列方式迭代計(jì)算每個(gè)時(shí)間步的 St:
這里,t 是計(jì)算的時(shí)間步長(zhǎng),每個(gè) St 僅取決于之前的起始價(jià)格 St?1,這是布朗運(yùn)動(dòng)模型所要求的,因?yàn)樗且粋€(gè)馬爾可夫過程。請(qǐng)注意,通過選擇一個(gè)小的時(shí)間步長(zhǎng),我們可以接近連續(xù)時(shí)間的極限。
因此,給定某個(gè)時(shí)間步長(zhǎng),隨后的每個(gè)股票價(jià)格 St 完全由三個(gè)參數(shù)描述:
初始“開始”價(jià)格,St?1
百分比收益(漂移)率,μ
波動(dòng)率或標(biāo)準(zhǔn)偏差率,σ
下面的代碼實(shí)現(xiàn)了上面描述的迭代過程。時(shí)間步長(zhǎng)由 dt 給出,對(duì)應(yīng)于對(duì)股票價(jià)格進(jìn)行采樣的頻率,N 是模擬運(yùn)行的總天數(shù)。
#幾何布朗運(yùn)動(dòng)模型#使用mu=收益率#sigma=波動(dòng)率#dt=時(shí)間步長(zhǎng)#Si=每個(gè)時(shí)間段的初始(開始)價(jià)格值#價(jià)格和收益的時(shí)間演變#使用布朗運(yùn)動(dòng)模型來生成N天(時(shí)間段)的價(jià)格列表def?gices(mu,?sigma,?dt,?Si,?N):????pirr?=?np.zeros(N)?#初始化一個(gè)長(zhǎng)度為N的向量來存儲(chǔ)價(jià)格值????pr_r[0]?=?Si?#存儲(chǔ)第一個(gè)價(jià)格值??????retrr?=?np.zeros(N)?#初始化向量來存儲(chǔ)返回值????????#還可以計(jì)算連續(xù)N之間的價(jià)格回報(bào)率????for?i?in?range?(1,N):????????#注意price[i-1]是每次迭代的Si????????pr_arr[i]?=?geoeti_bown(mu,?sigma,?dt,?price_arr[i-1])
運(yùn)行單個(gè)模擬/步行
這部分代碼只是調(diào)用上面編寫的函數(shù)并繪制結(jié)果。給出了收益率和波動(dòng)率、起始價(jià)格和時(shí)間步長(zhǎng)的樣本值。以下數(shù)字按出現(xiàn)順序顯示:
股票價(jià)格的演變,St 作為 N 的函數(shù)
股票價(jià)格水平的分布,繪制為直方圖。
收益和對(duì)數(shù)收益的分布,也繪制為直方圖。
在隨后的部分中進(jìn)行了多次模擬,以實(shí)際驗(yàn)證模型的正確性。
#運(yùn)行單個(gè)模擬以檢查功能#使用?mu、sigma?和?Si?的樣本值進(jìn)行測(cè)試#調(diào)用函數(shù)Slst,?RitRlolist?=?gpes(mu,?sigma,?dt,?Si,?N)#繪制結(jié)果plt.figure(figsize=(15,5))
#用于獲取mu_multiple和sigma_multiple#將價(jià)格數(shù)組作為輸入并返回?mu?和?sigmadef?v_tun(price_array):????mu_single?=?0????sgm_sigle?=?0????
????#計(jì)算模擬的平均收益率,mu和平均波動(dòng)率,sigma????musigle?=?np.mean(mu_temp)????sigmsile?=?np.std(mu_temp)
????#Monte?Carlo?模擬幾何布朗運(yùn)動(dòng)演化#運(yùn)行幾個(gè)模擬來生成幾個(gè)可能的價(jià)格演變數(shù)組#用它來計(jì)算平均波動(dòng)率和回報(bào)率def?gmlie(mu,?sigma,?dt,?Si,?N,?sim_count):????cacies?=?np.zeros(shape=(N,sim_count))?#創(chuàng)建一個(gè)數(shù)組來存儲(chǔ)模擬值????#對(duì)于?alc_res?數(shù)組,我們只關(guān)心值????#創(chuàng)建數(shù)組來存儲(chǔ)每個(gè)的mu和sigma的值????m_mutple?=?np.zeros(sim_count)????sigmmiple?=?np.zeros(sim_count)
????
????vl?=?np.linspace(0,N-1,N)
????#運(yùn)行模擬并繪制每個(gè)價(jià)格演變的結(jié)果????plt.figure(figsize=(20,20))
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
R語言幾何布朗運(yùn)動(dòng)GBM模擬股票價(jià)格優(yōu)化建立期權(quán)定價(jià)用概率加權(quán)收益曲線可視化
左右滑動(dòng)查看更多
01
02
03
04
檢查和測(cè)試多個(gè)模擬的代碼
上面的代碼包含一個(gè)函數(shù),可以為幾何布朗運(yùn)動(dòng)描述的隨機(jī)游走運(yùn)行多個(gè)模擬。還編寫了另一個(gè)計(jì)算給定輸入數(shù)組的平均收益和波動(dòng)率水平的函數(shù)。這兩個(gè)函數(shù)都用于生成幾個(gè)模擬/隨機(jī)游走,如上圖所示。
上圖顯示了在相同起始價(jià)格、S0=100 和收益率和波動(dòng)率、μ=0.2 和 σ=0.07 下運(yùn)行的 500 次模擬圖。使用的時(shí)間步長(zhǎng)為 dt=0.01,表示每天對(duì)股票價(jià)格進(jìn)行頻繁抽樣。每條線代表使用前面描述的幾何布朗運(yùn)動(dòng)模型建模的樣本隨機(jī)游走。然后通過繪制股票價(jià)格、收益和標(biāo)準(zhǔn)差的分布來分析使用這些模擬生成的數(shù)據(jù)。然后分析這些價(jià)格水平、收益和波動(dòng)率的分布,以檢查其正確性和一致性。
從下面的第一張圖中可以看出,價(jià)格水平遵循近似對(duì)數(shù)正態(tài)分布。這實(shí)際上是一個(gè)預(yù)期的結(jié)果。解,St 是一個(gè)對(duì)數(shù)正態(tài)分布的隨機(jī)變量,其期望值和方差由下式給出:
從下面的第一幅圖中可以看出,對(duì)于 sim_count = 500 次模擬,價(jià)格水平確實(shí)近似于對(duì)數(shù)正態(tài)分布,平均值約為 200。使用 tats.lmfit 函數(shù)測(cè)量的均值和方差也與以上定義的值在合理的誤差范圍內(nèi)。對(duì)于使用上面給出的參數(shù)的模擬運(yùn)行,它們被計(jì)算為:
下面的第二張圖顯示了上面運(yùn)行的模擬的收益率分布??梢院苋菀椎赜^察到,收益呈正態(tài)分布,平均值約為 0.15,這是模擬中 μ 的輸入值。這種收益率的正態(tài)分布也是布朗運(yùn)動(dòng)模型的預(yù)期結(jié)果。下面的第三張圖顯示了標(biāo)準(zhǔn)偏差率的分布,也可以觀察到其呈正態(tài)分布,平均值約為 0.07,這是模擬的 σ 輸入值。
因此,上述討論驗(yàn)證了幾何布朗運(yùn)動(dòng)編碼模型確實(shí)按預(yù)期工作,并生成與模型的屬性和假設(shè)相對(duì)應(yīng)的結(jié)果。自相似性也被證明適用于模型,其中不同的時(shí)間步長(zhǎng) dt 與調(diào)整后的 μ 和 σ 一起使用,以產(chǎn)生相似的價(jià)格水平和收益分布。這是模型的另一個(gè)預(yù)期結(jié)果,因?yàn)椴祭蔬\(yùn)動(dòng)在不同尺度上表現(xiàn)出分形行為。
#繪制價(jià)格水平和收益的分布以檢查代碼的有效性#價(jià)格水平應(yīng)根據(jù)幾何布朗運(yùn)動(dòng)模型呈對(duì)數(shù)正態(tài)分布#Retu?ate?和?Vlatiiy?應(yīng)該是正態(tài)分布的#Plot?價(jià)格水平plt.figure(figsize=(15,5))#與下面給出的均值和標(biāo)準(zhǔn)差的對(duì)數(shù)正態(tài)分布進(jìn)行比較logorman?=?Si*np.exp(mu*N*dt)logmvar?=?(Si**2)*np.exp(2*mu*N*dt)*(np.exp((sigma**2)*N*dt)-1)plt.plot(bns,lonm_dst,"g",lw=5)?#繪制預(yù)期的對(duì)數(shù)正態(tài)密度分布#繪制收益和波動(dòng)率分布plt.figure(figsize=(15,5))
print(lono_ean)print(np.sqrt(loomvr))
探索:使用真實(shí)股票數(shù)據(jù)測(cè)試模型
一旦模型被檢查為正常工作,它就會(huì)用真實(shí)的庫(kù)存數(shù)據(jù)進(jìn)行測(cè)試。耐克 (NKE) 2013-2015 年的股價(jià)被用來回測(cè)該模型。并且使用上述幾何布朗運(yùn)動(dòng)模型運(yùn)行 Monte Carlo 模擬。
以下值用于在兩年期間使用 NKE 的真實(shí)數(shù)據(jù)測(cè)試代碼。假設(shè)一年大約有 250 個(gè)工作日,N = 500 表示大約兩年的時(shí)間框架。通過將數(shù)據(jù)導(dǎo)入單獨(dú)的 .csv 文件并對(duì)股票價(jià)格的收益率和標(biāo)準(zhǔn)差進(jìn)行所需的計(jì)算來計(jì)算收益率和波動(dòng)率。
截至 2013 年 1 月 2 日,起始價(jià)格 S0 為 52.4。兩年期末的預(yù)期價(jià)格 St 預(yù)計(jì)在 98.6 左右。
兩年年化收益率為 μ=0.13,這是使用雅虎財(cái)經(jīng)歷史記錄生成的價(jià)格列表計(jì)算得出的。
兩年年化波動(dòng)率也從價(jià)格中獲得,σ=0.05。
以下代碼調(diào)用函數(shù)以通過幾何布朗運(yùn)動(dòng)模型生成隨機(jī)游走。
#使用這些價(jià)格計(jì)算回報(bào)率和波動(dòng)率。pprint(k.geical('2013-01-01',?'2015-01-01'))
#使用輸入?yún)?shù)的樣本值運(yùn)行多個(gè)模擬dt?=?0.01sim_count?=?500#調(diào)用函數(shù)并運(yùn)行模擬prie,?mu_arr,?sigrr?=?geiple(mu,?sgma,?dt,?Si,?N,?icont)
在?[29]?中:lorm_ean?=?Si*np.exp(mu*N*dt)
解釋模擬結(jié)果
從上圖中生成的隨機(jī)游走可以看出,我們?cè)谶@里使用的模型乍一看似乎產(chǎn)生了正確方向和近似幅度的價(jià)格演變。由于它是一個(gè)隨機(jī)游走模型,重要的是要注意,結(jié)果只能解釋為價(jià)格水平或整體收益分布,而不是單個(gè)模擬。下面的代碼和數(shù)字為價(jià)格水平和收益率和波動(dòng)率生成所需的分布圖。
首先需要注意的是,使用等式 E[St]=S0e(μN(yùn)t) 的對(duì)數(shù)正態(tài)分布價(jià)格水平的計(jì)算平均值為 100.374。這位于真實(shí)值 98.6 的 5% 誤差范圍內(nèi),是使用 500 次模擬生成的。
其次,可以看出幾何布朗運(yùn)動(dòng)的所有性質(zhì)都得到滿足——價(jià)格水平服從對(duì)數(shù)正態(tài)分布,收益率和波動(dòng)率正態(tài)分布,均值對(duì)應(yīng)于輸入?yún)?shù)值。
請(qǐng)注意,模擬還針對(duì)其他時(shí)間范圍和不同的股票價(jià)格運(yùn)行,平均而言,該模型顯示的值在圣路易斯真實(shí)價(jià)值的 10% 以內(nèi)。
#繪制價(jià)格水平的分布并返回以檢查真實(shí)數(shù)據(jù)的代碼#價(jià)格水平應(yīng)根據(jù)幾何布朗運(yùn)動(dòng)模型呈對(duì)數(shù)正態(tài)分布#Return?Rate?和?Volatility?應(yīng)該是正態(tài)分布的#Plot?價(jià)格水平plt.hist(prestiple,bins=100,normed=1,label="R")#與下面給出的均值和標(biāo)準(zhǔn)差的對(duì)數(shù)正態(tài)分布進(jìn)行比較lognorm_mean?=?Si*np.exp(mu*N*dt)lognorm_var?=?(Si**2)*np.exp(2*mu*N*dt)*(np.exp((sigma**2)*N*dt)-1)#繪制預(yù)期的對(duì)數(shù)正態(tài)密度分布#繪制收益和波動(dòng)率分布plt.hist(mu_arr,bins=100,normed=1,label="R")
評(píng)論和結(jié)論
從生成的模擬結(jié)果可以看出,幾何布朗運(yùn)動(dòng)模型可以很好地使用上面討論的隨機(jī)過程來模擬股票價(jià)格。該模型首先被檢查以滿足幾何布朗運(yùn)動(dòng)的特性,然后用真實(shí)的股票價(jià)格數(shù)據(jù)進(jìn)行回測(cè)。NKE 2013-2015 年的股票價(jià)格用于計(jì)算 μ 和 σ 的值,然后用于運(yùn)行該期間的模擬。股票價(jià)格的模擬結(jié)果和真實(shí)價(jià)值在 5% 的誤差范圍內(nèi)相似。
點(diǎn)擊文末?“閱讀原文”
獲取全文完整資料。
本文選自《PYTHON 用幾何布朗運(yùn)動(dòng)模型和蒙特卡羅MONTE CARLO隨機(jī)過程模擬股票價(jià)格可視化分析耐克NKE股價(jià)時(shí)間序列數(shù)據(jù)》。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
R語言做復(fù)雜金融產(chǎn)品的幾何布朗運(yùn)動(dòng)的模擬
MATLAB用COPULA模型進(jìn)行蒙特卡洛(MONTE CARLO)模擬和擬合股票收益數(shù)據(jù)分析
python中的copula:Frank、Clayton和Gumbel copula模型估計(jì)與可視化R語言中的copula GARCH模型擬合時(shí)間序列并模擬分析
matlab使用Copula仿真優(yōu)化市場(chǎng)風(fēng)險(xiǎn)數(shù)據(jù)VaR分析
R語言多元Copula GARCH 模型時(shí)間序列預(yù)測(cè)
R語言Copula函數(shù)股市相關(guān)性建模:模擬Random Walk(隨機(jī)游走)
R語言實(shí)現(xiàn) Copula 算法建模依賴性案例分析報(bào)告
R語言ARMA-GARCH-COPULA模型和金融時(shí)間序列案例
R語言基于copula的貝葉斯分層混合模型的診斷準(zhǔn)確性研究
R語言COPULA和金融時(shí)間序列案例
matlab使用Copula仿真優(yōu)化市場(chǎng)風(fēng)險(xiǎn)數(shù)據(jù)VaR分析
matlab使用Copula仿真優(yōu)化市場(chǎng)風(fēng)險(xiǎn)
R語言多元CopulaGARCH模型時(shí)間序列預(yù)測(cè)
R語言Copula的貝葉斯非參數(shù)MCMC估計(jì)
R語言COPULAS和金融時(shí)間序列R語言乘法GARCH模型對(duì)高頻交易數(shù)據(jù)進(jìn)行波動(dòng)性預(yù)測(cè)
R語言GARCH-DCC模型和DCC(MVT)建模估計(jì)
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模擬進(jìn)行股價(jià)預(yù)測(cè)
R語言時(shí)間序列GARCH模型分析股市波動(dòng)率
R語言ARMA-EGARCH模型、集成預(yù)測(cè)算法對(duì)SPX實(shí)際波動(dòng)率進(jìn)行預(yù)測(cè)
matlab實(shí)現(xiàn)MCMC的馬爾可夫轉(zhuǎn)換ARMA - GARCH模型估計(jì)
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模擬進(jìn)行股價(jià)預(yù)測(cè)
使用R語言對(duì)S&P500股票指數(shù)進(jìn)行ARIMA + GARCH交易策略
R語言用多元ARMA,GARCH ,EWMA, ETS,隨機(jī)波動(dòng)率SV模型對(duì)金融時(shí)間序列數(shù)據(jù)建模
R語言股票市場(chǎng)指數(shù):ARMA-GARCH模型和對(duì)數(shù)收益率數(shù)據(jù)探索性分析
R語言多元Copula GARCH 模型時(shí)間序列預(yù)測(cè)
R語言使用多元AR-GARCH模型衡量市場(chǎng)風(fēng)險(xiǎn)
R語言中的時(shí)間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價(jià)格
R語言用Garch模型和回歸模型對(duì)股票價(jià)格分析
GARCH(1,1),MA以及歷史模擬法的VaR比較
matlab估計(jì)arma garch 條件均值和方差模型
R語言ARMA-GARCH-COPULA模型和金融時(shí)間序列案例