Python 用幾何布朗運(yùn)動(dòng)模型和蒙特卡羅Monte Carlo隨機(jī)過程模擬股票價(jià)格可視化分析耐克
原文鏈接:http://tecdat.cn/?p=27099?
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
介紹
金融資產(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)行回測。模擬是通過獲取收益率 μ 和波動(dòng)率 σ 的樣本值并觀察股票價(jià)格演變的模擬數(shù)據(jù)和真實(shí)數(shù)據(jù)之間的相關(guān)程度來完成的。
模擬需要大約 10-15 分鐘才能完全運(yùn)行。請注意,對模擬結(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í)間步長,對應(yīng)于一天內(nèi)股票價(jià)格采樣的頻率
N - 模擬的總天數(shù)。
r - 無風(fēng)險(xiǎn)利率,任何人都可以借/貸
還對股票市場/價(jià)格做出了以下假設(shè)。雖然這些假設(shè)確實(shí)有助于大大簡化模型,但它們非?,F(xiàn)實(shí),有助于在理想情況下制定模型。
股票價(jià)格遵循馬爾科夫過程,即是無記憶的,隨后的股票價(jià)格僅取決于當(dāng)前價(jià)值,而不取決于任何先前的價(jià)值。
與 N 相比,考慮的時(shí)間步長 dt 較短,即 Ndt>>1
市場完整高效,不存在套利機(jī)會(huì)。
沒有股息、交易成本或稅收考慮。
維納過程和幾何布朗運(yùn)動(dòng)
維納過程(也稱為布朗運(yùn)動(dòng))是一個(gè)具有連續(xù)變量和連續(xù)時(shí)間的馬爾可夫過程。對于隨機(jī)變量 z,它有兩個(gè)重要的性質(zhì):
所有的 Δz 都是統(tǒng)計(jì)獨(dú)立的。
dz = εdt
其中 ? 來自正態(tài)分布

通過將漂移項(xiàng) a(x,t)dt 添加到隨機(jī)過程 dz 上,可以將維納過程進(jìn)一步推廣到 Ito 過程。?

對于股票價(jià)格,上述方程是 Ito 過程,也稱為幾何布朗運(yùn)動(dòng),描述了隨時(shí)間的隨機(jī)變化。請注意,μ 和 σ 分別是瞬時(shí)漂移和標(biāo)準(zhǔn)偏差率。S 遵循一個(gè)受乘性噪聲影響的隨機(jī)過程。這里還需要注意的是,幾何布朗運(yùn)動(dòng)模型避免了負(fù)股票價(jià)格的問題。
為股票價(jià)格的解決方案建模
上述隨機(jī)微分方程 (SDE) 具有以下形式的解析解:

請注意,在上述等式中,常數(shù) μ 和 σ 分別對應(yīng)于股票價(jià)格的百分比漂移(收益)和百分比波動(dòng)(標(biāo)準(zhǔn)差)率。Wt 指的是由 dz=?dt 給出的維納過程,如上所述。該解方程用于以下列方式迭代計(jì)算每個(gè)時(shí)間步的 St:

這里,t 是計(jì)算的時(shí)間步長,每個(gè) St 僅取決于之前的起始價(jià)格 St?1,這是布朗運(yùn)動(dòng)模型所要求的,因?yàn)樗且粋€(gè)馬爾可夫過程。請注意,通過選擇一個(gè)小的時(shí)間步長,我們可以接近連續(xù)時(shí)間的極限。
因此,給定某個(gè)時(shí)間步長,隨后的每個(gè)股票價(jià)格 St 完全由三個(gè)參數(shù)描述:
初始“開始”價(jià)格,St?1
百分比收益(漂移)率,μ
波動(dòng)率或標(biāo)準(zhǔn)偏差率,σ
下面的代碼實(shí)現(xiàn)了上面描述的迭代過程。時(shí)間步長由 dt 給出,對應(yīng)于對股票價(jià)格進(jìn)行采樣的頻率,N 是模擬運(yùn)行的總天數(shù)。
#幾何布朗運(yùn)動(dòng)模型
#使用mu=收益率
#sigma=波動(dòng)率
#dt=時(shí)間步長
#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è)長度為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í)間步長的樣本值。以下數(shù)字按出現(xiàn)順序顯示:
股票價(jià)格的演變,St 作為 N 的函數(shù)
股票價(jià)格水平的分布,繪制為直方圖。
收益和對數(shù)收益的分布,也繪制為直方圖。
在隨后的部分中進(jìn)行了多次模擬,以實(shí)際驗(yàn)證模型的正確性。
#運(yùn)行單個(gè)模擬以檢查功能
#使用 mu、sigma 和 Si 的樣本值進(jìn)行測試
#調(diào)用函數(shù)
Slst, RitRlolist = gpes(mu, sigma, dt, Si, N)
#繪制結(jié)果
plt.figure(figsize=(15,5))

?


#用于獲取mu_multiple和sigma_multiple
#將價(jià)格數(shù)組作為輸入并返回 mu 和 sigma
def 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ǔ)模擬值
#對于 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))
檢查和測試多個(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í)間步長為 dt=0.01,表示每天對股票價(jià)格進(jìn)行頻繁抽樣。每條線代表使用前面描述的幾何布朗運(yùn)動(dòng)模型建模的樣本隨機(jī)游走。然后通過繪制股票價(jià)格、收益和標(biāo)準(zhǔn)差的分布來分析使用這些模擬生成的數(shù)據(jù)。然后分析這些價(jià)格水平、收益和波動(dòng)率的分布,以檢查其正確性和一致性。
從下面的第一張圖中可以看出,價(jià)格水平遵循近似對數(shù)正態(tài)分布。這實(shí)際上是一個(gè)預(yù)期的結(jié)果。解,St 是一個(gè)對數(shù)正態(tài)分布的隨機(jī)變量,其期望值和方差由下式給出:

從下面的第一幅圖中可以看出,對于 sim_count = 500 次模擬,價(jià)格水平確實(shí)近似于對數(shù)正態(tài)分布,平均值約為 200。使用 tats.lmfit 函數(shù)測量的均值和方差也與以上定義的值在合理的誤差范圍內(nèi)。對于使用上面給出的參數(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è)相對應(yīng)的結(jié)果。自相似性也被證明適用于模型,其中不同的時(shí)間步長 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)模型呈對數(shù)正態(tài)分布
#Retu ate 和 Vlatiiy 應(yīng)該是正態(tài)分布的
#Plot 價(jià)格水平
plt.figure(figsize=(15,5))
#與下面給出的均值和標(biāo)準(zhǔn)差的對數(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ù)期的對數(shù)正態(tài)密度分布
#繪制收益和波動(dòng)率分布
plt.figure(figsize=(15,5))



print(lono_ean)
print(np.sqrt(loomvr))

探索:使用真實(shí)股票數(shù)據(jù)測試模型
一旦模型被檢查為正常工作,它就會(huì)用真實(shí)的庫存數(shù)據(jù)進(jìn)行測試。耐克 (NKE) 2013-2015 年的股價(jià)被用來回測該模型。并且使用上述幾何布朗運(yùn)動(dòng)模型運(yùn)行 Monte Carlo 模擬。
以下值用于在兩年期間使用 NKE 的真實(shí)數(shù)據(jù)測試代碼。假設(shè)一年大約有 250 個(gè)工作日,N = 500 表示大約兩年的時(shí)間框架。通過將數(shù)據(jù)導(dǎo)入單獨(dú)的 .csv 文件并對股票價(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.01
sim_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ī)游走可以看出,我們在這里使用的模型乍一看似乎產(chǎn)生了正確方向和近似幅度的價(jià)格演變。由于它是一個(gè)隨機(jī)游走模型,重要的是要注意,結(jié)果只能解釋為價(jià)格水平或整體收益分布,而不是單個(gè)模擬。下面的代碼和數(shù)字為價(jià)格水平和收益率和波動(dòng)率生成所需的分布圖。
首先需要注意的是,使用等式 E[St]=S0e(μN(yùn)t) 的對數(shù)正態(tài)分布價(jià)格水平的計(jì)算平均值為 100.374。這位于真實(shí)值 98.6 的 5% 誤差范圍內(nèi),是使用 500 次模擬生成的。
其次,可以看出幾何布朗運(yùn)動(dòng)的所有性質(zhì)都得到滿足——價(jià)格水平服從對數(shù)正態(tài)分布,收益率和波動(dòng)率正態(tài)分布,均值對應(yīng)于輸入?yún)?shù)值。
請注意,模擬還針對其他時(shí)間范圍和不同的股票價(jià)格運(yùn)行,平均而言,該模型顯示的值在圣路易斯真實(shí)價(jià)值的 10% 以內(nèi)。
#繪制價(jià)格水平的分布并返回以檢查真實(shí)數(shù)據(jù)的代碼
#價(jià)格水平應(yīng)根據(jù)幾何布朗運(yùn)動(dòng)模型呈對數(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)差的對數(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ù)期的對數(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)行回測。NKE 2013-2015 年的股票價(jià)格用于計(jì)算 μ 和 σ 的值,然后用于運(yùn)行該期間的模擬。股票價(jià)格的模擬結(jié)果和真實(shí)價(jià)值在 5% 的誤差范圍內(nèi)相似。

最受歡迎的見解
1.R語言對S&P500股票指數(shù)進(jìn)行ARIMA + GARCH交易策略
2.R語言改進(jìn)的股票配對交易策略分析SPY—TLT組合和中國股市投資組合
3.R語言時(shí)間序列:ARIMA GARCH模型的交易策略在外匯市場預(yù)測應(yīng)用
4.TMA三均線期指高頻交易策略的R語言實(shí)現(xiàn)
5.r語言多均線量化策略回測比較
6.用R語言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測股票實(shí)例
7.r語言預(yù)測波動(dòng)率的實(shí)現(xiàn):ARCH模型與HAR-RV模型
8.R語言如何做馬爾科夫轉(zhuǎn)換模型markov switching model
9.matlab使用Copula仿真優(yōu)化市場風(fēng)險(xiǎn)