期權定價

Python - MC 模擬中的隨機數問題

  • September 24, 2021

我有興趣使用蒙特卡羅模擬估計歐式看漲期權的價格,以獲得布萊克斯科爾斯分析公式的良好近似值,這是一項非常簡單的任務。執行模擬時,我注意到一件事:如果我更改隨機數的種子,我會得到不同的結果。無論選擇何種種子,是否有任何程序可以讓我獲得相同的價格?(可能價格不完全相同,但有一些降低所選種子效果的策略)。

正如我們從這張圖片中看到的,這裡我們有不同種子的分析價格和估計價格之間的絕對值差異。在這裡我們可以看到最好的種子是數字 100。

X 軸 = 區間內的現貨價格值

$$ 1,1.2 $$ Y 軸 = 估計選項和分析選項之間的絕對值差異

模擬次數 = 200000

K = 1

r = q = 0

西格瑪 = 0.5

在此處輸入圖像描述

在這裡,我附上了用於為不同種類的種子生成 MC 模擬的程式碼。

from math import log, sqrt, pi, exp
from scipy.stats import norm
from datetime import datetime, date
import numpy as np
import pandas as pd
from pandas import DataFrame

def Option_MC(s0, K, T, j, sigma, r, q, seed):
   Rand = np.random.RandomState()
   Rand.seed(seed)
   S = np.ndarray(shape=(2, j), dtype=np.double)
   S[0] = s0
   Brownian_Motion = Rand.normal(-.5 * sigma * sigma * T, sigma * sqrt(T), (1, j))
   S[1] = S[0] * np.exp(Brownian_Motion)
   P = np.maximum(S[1] - K, 0)
   mean = np.average(P)
   return mean

def d1(S,K,T,r,sigma):
   return (log(S/K)+(r+sigma**2/2.)*T)/(sigma*sqrt(T))
def d2(S,K,T,r,sigma):
   return d1(S,K,T,r,sigma)-sigma*sqrt(T)
def bs_call(S,K,T,r,sigma):
   return S*norm.cdf(d1(S,K,T,r,sigma))-K*exp(-r*T)*norm.cdf(d2(S,K,T,r,sigma))

analytical = []
for i in arrays:
   analytical.append(bs_call(i,1.,1,0,0.5))

arrays = np.linspace(1,1.2,100)
seeds = [1,10,100,1000]
price_tot = []
for seed in seeds:
   price = []
   for i in arrays:
       price.append(Option_MC(i,1.,1,200000,0.5,0,0,seed))
   price_tot.append(price)

for p,seed in zip(price_tot,seeds):
   plt.plot(arrays,abs(np.array(p)-np.array(analytical)),label=f'Seed = {seed}')
plt.legend()
plt.show()

for p,seed in zip(price_tot,seeds):
   plt.plot(arrays,p,label=f'Seed = {seed}')
plt.legend()
plt.show()

最快和最簡單的(對您而言,而不是對電腦而言)是增加模擬次數。當我使用 100 萬個模擬市民時,錯誤會更小:

更多的模擬導致更小的錯誤

您可以在 Glasserman 的“金融工程中的蒙地卡羅方法”中找到更複雜的技術來減少您的估計變異數。對於期權定價,您可以查看控制變數和對立變數,它們相對容易實施。

我相信 Python 的 Rand 使用某種線性同餘生成器來恢復“隨機”數字。

將隨機生成器視為算法(確定性生成器),它在

$$ 0, 1 $$. 例如: $$ 0.0234, \ 0.382, \ 0.375432, \ 0.392, \ 0.785, \ … $$ 然後將這些數字“轉換”(例如參見 CDF 或 AR 的反轉)到正常的“隨機”圖形。 把種子當作這一切的“起點”

$$ 0, 1 $$序列。由於生成序列的算法是確定性的,因此給出相同的種子將始終產生相同的序列。改變種子,你改變了起點,所以整個序列。如果您更改整個序列,您的結果將始終不同。 您想要實現的是蒙地卡羅收斂。模擬次數越多(並不總是),樣本隨機變數的標準誤差越低。

提示:盡量避免使用低種子。至少應使用 1000+。

引用自:https://quant.stackexchange.com/questions/68058