主要内容

使用GPU ARRAYFUN蒙特卡罗模拟

这个例子展示了如何将金融期权价格计算使用蒙特卡罗方法在GPU。三种简单的新奇选择权作为例子,但更复杂的选项可以以类似的方式。

这个例子是一个函数,以便助手可以嵌套在里面。

函数paralleldemo_gpu_optionpricing

这个示例使用长时间运行的内核,所以不能在GPU上运行如果内核执行可以暂停。暂停通常只活跃是否还开显示选中的GPU。

dev = gpuDevice ();如果dev.KernelExecutionTimeout错误(“pctexample: gpuoptionpricing: KernelTimeout”,(这个例子不能运行如果内核执行GPU可以的,“超时”。]);结束

股票价格演变

我们假设价格发展根据对数正态分布分布与无风险利率,股息收益率(如果有的话),在市场波动。这些量都是假定固定的一生的选择。这给了以下价格随机微分方程:

$ $ {}\ rm d =年代\ * # xA;左\ [& # xA;(r d) {} \ rm d t + \σ\ε\ sqrt {{\ rm d} t} & # xA;\]$ $

在哪里年代美元股票价格,r美元是无风险利率,$ d $是股票的年度股息收益率,\σ美元价格的波动性和吗\ε美元代表一个高斯白噪声过程。假设美元(S + \δS) / S $对数正态分布分布,这可以离散:

$ $ S_ {t + 1} = S_ {t} \ * \ exp {& # xA;左\ [& # xA;\离开(r - d - \压裂{1}{2}\σ^ 2 \)\δt # xA;+ \σ\ε\ sqrt{\δt} & # xA;正确\]& # xA;} $ $

作为一个例子让我们用100美元的股票收益率每年1%的股息。中央政府利率被认为是0.5%。每天我们检查大约两年的时间窗采样。市场波动是假定为每年20%。

上涨空间= 100;%股票价格起价100美元。股息= 0.01;% 1%的年度股息收益率。riskFreeRate = 0.005;% 0.5%。timeToExpiry = 2;%一生的选择。sampleRate = 1/250;%承担每年250工作天。波动率= 0.20;% 20%波动。

我们重置随机数生成器,以确保可重复的结果。

种子= 1234;rng(种子);%重置CPU随机数发生器。gpurng(种子);%重置GPU随机数生成器。

随着时间的推移我们现在可以循环模拟股票价格的路径:

价格=上涨空间;时间= 0;持有;时间< =时间+ sampleRate timeToExpiry时间;漂移= (riskFreeRate -股利波动*波动/ 2)* sampleRate;微扰=波动*√sampleRate * randn ();价格=价格* exp(漂流+微扰);情节(时间、价格、“。”);结束;网格;包含(的时间(年));ylabel (的股票价格($));

运行在GPU上的

股票价格运行模拟GPU上我们首先需要把模拟循环内部一个helper函数:

函数finalStockPrice = simulateStockPrice (S, r, d, v, T, dT) T = 0;t < t t = t + dT;博士= (r - d - v * v / 2) * dT;pert = v * sqrt (dT) * randn ();S = * exp(博士+ pert);结束finalStockPrice = S;结束

我们可以叫它使用数千倍arrayfun。我们确保计算发生在GPU的输入价格与每一个元素模拟GPU向量。精确测量计算时间在我们使用的GPUgputimeit函数。

%创建输入数据。N = 1000000;startStockPrices =上涨空间*的(N, 1“gpuArray”);%运行模拟。finalStockPrices = arrayfun (@simulateStockPrice,startStockPrices riskFreeRate,股息,波动,timeToExpiry sampleRate);meanFinalPrice =意味着(finalStockPrices);%测量函数的执行时间在使用gputimeit GPU。%这需要我们店| arrayfun |处理调用的函数。functionToTime = @ () arrayfun (@simulateStockPrice,startStockPrices riskFreeRate,股息,波动,timeToExpiry sampleRate);timeTaken = gputimeit (functionToTime);流(的平均价格计算f $ % 1.4 f % 1.3秒。\ n”,meanFinalPrice timeTaken);clf;嘘(finalStockPrices, 100);包含(的股票价格($))ylabel (“频率”网格);
在0.283秒计算平均价格为98.9563美元。

亚洲期权定价

作为一个例子,让我们用一个欧洲亚洲选择基于股票价格的算术平均值的生命周期的选择。我们可以通过累积平均价格计算价格在模拟。看涨期权,期权被执行如果平均价格高于罢工,支出是两者的区别:

函数optionPrice = asianCallOption (S, r, d, v, x, T, dT) T = 0;cumulativePrice = 0;t < t t = t + dT;博士= (r - d - v * v / 2) * dT;pert = v * sqrt (dT) * randn ();S = * exp(博士+ pert);cumulativePrice = cumulativePrice + S;结束numSteps = (T / dT);meanPrice = cumulativePrice / numSteps;在今天的钱%表达最终价格。optionPrice = exp (- r * T *马克斯(0,meanPrice - x);结束

我们使用GPU运行成千上万的模拟路径使用arrayfun。每个模拟路径提供了一个独立的期权价格的估计,我们因此以均值为结果。

罢工= 95;%为期权执行价格($)。optionPrices = arrayfun (@asianCallOption,startStockPrices riskFreeRate,股息,波动性,罢工,timeToExpiry sampleRate);meanOptionPrice =意味着(optionPrices);%测量GPU上的执行时间和显示结果。functionToTime = @ () arrayfun (@asianCallOption,startStockPrices riskFreeRate,股息,波动性,罢工,timeToExpiry sampleRate);timeTaken = gputimeit (functionToTime);流(的平均价格计算f $ % 1.4 f % 1.3秒。\ n”,meanOptionPrice timeTaken);
在0.287秒计算平均价格为8.7210美元。

Lookback期权定价

的这个例子中,我们使用一个欧式lookback选项的区别是支付最低股价和最后的股票价格的一生的选择。

函数optionPrice = euroLookbackCallOption (S, r, d, v, T, dT) T = 0;minPrice = S;t < t t = t + dT;博士= (r - d - v * v / 2) * dT;pert = v * sqrt (dT) * randn ();S = * exp(博士+ pert);如果S < minPrice minPrice = S;结束结束在今天的钱%表达最终价格。optionPrice = exp (- r * T *马克斯(0,S - minPrice);结束

请注意,在这种情况下,期权的执行价格是最低股价。因为最后的股票价格总是大于或等于最低,选择总是锻炼并不是真正的“可选的”。

optionPrices = arrayfun (@euroLookbackCallOption,startStockPrices riskFreeRate,股息,波动,timeToExpiry sampleRate);meanOptionPrice =意味着(optionPrices);%测量GPU上的执行时间和显示结果。functionToTime = @ () arrayfun (@euroLookbackCallOption,startStockPrices riskFreeRate,股息,波动,timeToExpiry sampleRate);timeTaken = gputimeit (functionToTime);流(的平均价格计算f $ % 1.4 f % 1.3秒。\ n”,meanOptionPrice timeTaken);
在0.286秒计算平均价格为19.2711美元。

障碍期权定价

这最后一个例子使用的“和”障碍期权变得无效如果股票价格达到水平的障碍。如果股票价格低于障碍水平最后股票价格在正常使用欧洲看涨期权的计算。

函数optionPrice = upAndOutCallOption (S, r, d, v, x,, T, dT) T = 0;(t < t) & & (S < b) t = t + dT;博士= (r - d - v * v / 2) * dT;pert = v * sqrt (dT) * randn ();S = * exp(博士+ pert);结束如果S < b%在屏障,所以欧式期权的价格。optionPrice = exp (- r * T *马克斯(0,S - x);其他的%的屏障,所以选择撤回。optionPrice = 0;结束结束

请注意,我们现在必须供应期权的执行价格和障碍价格变得无效:

罢工= 95;%为期权执行价格($)。障碍= 150;%障碍期权的价格(美元)。optionPrices = arrayfun (@upAndOutCallOption,startStockPrices riskFreeRate,股息,波动,罢工,障碍,timeToExpiry sampleRate);meanOptionPrice =意味着(optionPrices);%测量GPU上的执行时间和显示结果。functionToTime = @ () arrayfun (@upAndOutCallOption,startStockPrices riskFreeRate,股息,波动,罢工,障碍,timeToExpiry sampleRate);timeTaken = gputimeit (functionToTime);流(的平均价格计算f $ % 1.4 f % 1.3秒。\ n”,meanOptionPrice timeTaken);
在0.289秒计算平均价格为6.8166美元。
结束