主要内容

使用GPUarrayfun的蒙特卡罗模拟

这个例子展示了如何计算金融期权价格GPU使用蒙特卡罗方法。

示例使用三个简单类型的选择,但是你可以以类似的方式更复杂的期权价格。在本例中,您比较时间在CPU上运行蒙特卡罗模拟和使用arrayfun在GPU上。

股票价格演变

根据对数正态分布假定价格演化分布与无风险利率,股息收益率(如果有的话),在市场波动。此外,假定所有这些量保持不变的一生的选择。这些假设导致价格的随机微分方程。

d 年代 = 年代 × ( ( r - - - - - - d ) d t + σ ϵ d t ] ,

在哪里 年代 股票价格, r 是无风险利率, d 是一年一度的股息收益率的股票, σ 是价格的波动性, ϵ 代表一个高斯白噪声过程。假设 ( 年代 + Δ 年代 ) / 年代 对数正态分布分布,这个微分方程离散得到这个方程。

年代 t + 1 = 年代 t × 经验值 ( ( r - - - - - - d - - - - - - 1 2 σ 2 ) Δ t + σ ϵ Δ t ]

检查两年时间窗口使用100美元的股票和这些假设:

  • 股票收益率每年1%的股息。

  • 政府无风险利率是0.5%。

  • 价格每天取样,每年有250个工作日。

  • 市场波动是每年20%。

上涨空间= 100;timeToExpiry = 2;股息= 0.01;riskFreeRate = 0.005;sampleRate = 1/250;波动率= 0.20;

为了确保可预测的结果,设置CPU和GPU随机数生成器的种子。

种子= 1234;rng(种子);gpurng(种子);

模拟股票价格随着时间的推移和情节的路径结果。

价格=上涨空间;时间= 0;h = animatedline(标志=“。”);时间< =时间+ sampleRate timeToExpiry时间;漂移= (riskFreeRate -股利波动*波动/ 2)* sampleRate;微扰= * sqrt (sampleRate) * randn波动;价格=价格* exp(漂流+微扰);addpoints (h、时间、价格);结束网格包含(“时间(年)”)ylabel (“股票价格(美元)”)

时间执行的CPU和GPU

simulateStockPrice提供的功能,在本例中,使用离散微分方程模拟了股票价格在前一节中描述。

准备输入数据运行100000蒙特卡罗模拟的股票价格。

N = 100000;startStockPrices =上涨空间*的(N - 1);

100000模拟CPU时间。

抽搐finalStockPricesCPU = 0 (N, 1);i = 1: N finalStockPricesCPU (i) = simulateStockPrice (startStockPrices(我),riskFreeRate、股息、波动,timeToExpiry sampleRate);结束timeCPU = toc;

因为每个仿真提供一个独立的期权价格的估计,以均值为结果。

流(“计算的平均价格$ % 1.4 f在CPU上% 1.3秒。\ n”,意思是(finalStockPricesCPU) timeCPU);
计算平均价格99.0857美元在2.206秒在CPU上。

在GPU上运行模拟,准备在GPU通过创建一个输入数据gpuArray对象。

gpuStartStockPrices = gpuArray (startStockPrices);

当你打电话arrayfunGPU数组和函数句柄作为输入,arrayfun您所指定的函数适用于每个元素的数组。这种行为意味着在每个循环开始股票价格不是必需的。的arrayfun函数在GPU以聪明元素MATLAB®函数变成一个定制的CUDA®内核,从而降低执行操作的开销。

运行simulateStockPrice函数使用arrayfun和时间100000模拟使用GPUgputimeit

finalStockPricesGPU = arrayfun (@simulateStockPrice,gpuStartStockPrices riskFreeRate,股息,波动,timeToExpiry sampleRate);timeGPU = gputimeit (@ () arrayfun (@simulateStockPrice,gpuStartStockPrices riskFreeRate,股息,波动,timeToExpiry sampleRate));流(“计算平均价格1.4美元的% f f % 1.3秒的GPU。\ n”,意思是(finalStockPricesGPU) timeGPU);
在GPU计算平均价格99.0442美元的0.023秒。

情节GPU上的蒙特卡罗模拟的结果在一个柱状图。

直方图(finalStockPricesGPU, 100);包含(“股票价格(美元)”)ylabel (“频率”网格)

亚洲期权定价

使用欧洲亚洲选项基于股票价格的算术平均一生中选择。的asianCallOption函数计算平均价格通过积累在模拟价格。对于看涨期权,功能锻炼选项如果平均价格高于执行价格。支付的平均价格与执行价格的区别。使用asianCallOption,在这个例子中,模拟一个亚洲看涨期权。

期权的执行价格设置为95美元。

罢工= 95;

时间100000模拟CPU和GPU上使用arrayfun并显示结果。

抽搐optionPricesCPU = 0 (N, 1);i = 1: N optionPricesCPU (i) = asianCallOption (startStockPrices(我),riskFreeRate、股息、波动性,罢工,timeToExpiry sampleRate);结束timeAsianOptionCPU = toc;流(“计算的平均价格$ % 1.4 f在CPU上% 1.3秒。\ n”,意思是(optionPricesCPU) timeAsianOptionCPU);
计算平均价格8.6733美元在2.146秒在CPU上。
optionPricesGPU = arrayfun (@asianCallOption,gpuStartStockPrices riskFreeRate,股息,波动性,罢工,timeToExpiry sampleRate);timeAsianOptionGPU = gputimeit (@ () arrayfun (@asianCallOption,gpuStartStockPrices riskFreeRate,股息,波动性,罢工,timeToExpiry sampleRate));流(“计算平均价格1.4美元的% f f % 1.3秒的GPU。\ n”,意思是(optionPricesGPU) timeAsianOptionGPU);
在GPU计算平均价格8.7448美元的0.023秒。

Lookback期权定价

使用欧式lookback选择支付的区别是最低的股票价格和最终的股票价格的一生的选择。期权的执行价格是最低股价。因为最后的股票价格总是大于或等于最低,选择总是锻炼,不是可选的。使用lookbackCallOption,在这个例子中,模拟一个欧式lookback看涨期权。

时间100000年模拟在CPU和GPU上使用arrayfun并显示结果。

抽搐optionPricesCPU = 0 (N, 1);i = 1: N optionPricesCPU (i) = lookbackCallOption (startStockPrices(我),riskFreeRate、股息、波动,timeToExpiry sampleRate);结束timeLookbackOptionCPU = toc;流(“计算的平均价格$ % 1.4 f在CPU上% 1.3秒。\ n”,意思是(optionPricesCPU) timeLookbackOptionCPU);
计算平均价格19.2456美元在2.201秒在CPU上。
optionPricesGPU = arrayfun (@lookbackCallOption,gpuStartStockPrices riskFreeRate,股息,波动,timeToExpiry sampleRate);timeLookbackOptionGPU = gputimeit (@ () arrayfun (@lookbackCallOption,gpuStartStockPrices riskFreeRate,股息,波动,timeToExpiry sampleRate));流(“计算平均价格1.4美元的% f f % 1.3秒的GPU。\ n”,意思是(optionPricesGPU) timeLookbackOptionGPU);
在GPU计算平均价格19.3893美元的0.021秒。

障碍期权定价

使用一个从障碍的选择,它变得无效,如果股票价格水平达到了障碍。如果股票价格保持低于障碍水平,使用最后的股票价格在一个正常的欧洲看涨期权的计算。使用upAndOutCallOption提供的功能,在本例中,模拟一个看涨期权还有障碍。

期权的执行价格和障碍价格变得无效。用95美元的价格和一个障碍的价格150美元。

罢工= 95;障碍= 150;

时间100000模拟CPU和GPU上使用arrayfun并显示结果。

抽搐optionPricesCPU = 0 (N, 1);i = 1: N optionPricesCPU (i) = upAndOutCallOption (startStockPrices(我),riskFreeRate、股息、波动性,罢工,障碍,timeToExpiry sampleRate);结束timeBarrierOptionCPU = toc;流(“计算的平均价格$ % 1.4 f在CPU上% 1.3秒。\ n”,意思是(optionPricesCPU) timeBarrierOptionCPU);
计算平均价格6.8327美元在2.074秒在CPU上。
optionPricesGPU = arrayfun (@upAndOutCallOption,gpuStartStockPrices riskFreeRate,股息,波动性,罢工,障碍,timeToExpiry sampleRate);timeBarrierOptionGPU = gputimeit (@ () arrayfun (@upAndOutCallOption,gpuStartStockPrices riskFreeRate,股息,波动性,罢工,障碍,timeToExpiry sampleRate));流(“计算平均价格1.4美元的% f f % 1.3秒的GPU。\ n”,意思是(optionPricesGPU) timeBarrierOptionGPU);
在GPU计算平均价格6.7834美元的0.021秒。

比较结果

计算CPU执行时间比GPU执行时间为每个模拟。

率= [timeCPU / timeGPU timeAsianOptionCPU / timeAsianOptionGPUtimeLookbackOptionCPU / timeLookbackOptionGPU timeBarrierOptionCPU / timeBarrierOptionGPU]
率=1×494.2557 94.6009 104.1725 97.5490

可视化结果,情节为每个模拟执行时间的比率。

栏(分类([“股价”“亚洲看涨期权”“Lookback选项”“障碍选择”]),比率)ylabel (“CPU与GPU执行时间比率”)

在这个例子中,在GPU上运行模拟arrayfun明显快于模拟在CPU上运行。

当你这个例子中所述的技术应用到您自己的代码,性能提升将强烈依赖于硬件和运行的代码。

金宝app支持功能

股票价格演化模拟功能

simulateStockPrice函数执行蒙特卡罗模拟来确定最终的股票价格。进化计算假定价格根据对数正态分布分布与无风险利率,股息收益率(如果有的话),在市场波动。

simulateStockPrice函数接受一个初始股票价格,无风险利率,股息率,市场波动,总时间窗口和采样率作为输入。

函数finalStockPrice = simulateStockPrice(价格、riskFreeRate股息,波动性,T, dT) T = 0;t < t t = t + dT;漂移= (riskFreeRate -股利波动*波动/ 2)* dT;微扰= * sqrt (dT) * randn波动;价格=价格。* exp(漂流+微扰);结束finalStockPrice =价格;结束

亚洲看涨期权的功能

asianCallOption函数执行蒙特卡罗模拟来确定一个亚洲看涨期权的价格。进化计算假定价格根据对数正态分布分布与无风险利率,股息收益率(如果有的话),在市场波动。函数计算平均价格通过积累在模拟价格。对于看涨期权,功能锻炼选项如果平均价格高于执行价格。支付的平均价格与执行价格的区别。

asianCallOption函数接受一个初始股票价格,无风险利率,股息率,市场波动,价格,总时间窗口和采样率作为输入。

函数optionPrice = asianCallOption(价格、riskFreeRate股息,波动性,罢工,T, dT) T = 0;cumulativePrice = 0;t < t t = t + dT;博士= (riskFreeRate -股利波动*波动/ 2)* dT;pert = * sqrt (dT) * randn波动;价格=价格* exp(博士+ pert);cumulativePrice = cumulativePrice +价格;结束numSteps = (T / dT);meanPrice = cumulativePrice / numSteps;在今天的钱%表达最终价格optionPrice = exp (-riskFreeRate * T *马克斯(0,meanPrice -罢工);结束

Lookback选项功能

lookbackCallOption函数执行的蒙特卡罗模拟来确定一个欧式lookback选择支付的区别是最低股价和最后的股票价格的一生的选择。期权的执行价格是最低股价。因为最后的股票价格总是大于或等于最低,选择总是锻炼并不是真正的“可选的”。

lookbackCallOption函数接受一个初始股票价格,无风险利率,股息率,市场波动,总时间窗口和采样率作为输入。

函数optionPrice = lookbackCallOption(价格、riskFreeRate股息,波动性,T, dT) T = 0;minPrice =价格;t < t t = t + dT;博士= (riskFreeRate -股利波动*波动/ 2)* dT;pert = * sqrt (dT) * randn波动;价格=价格* exp(博士+ pert);如果价格< minPrice minPrice =价格;结束结束在今天的钱%表达最终价格optionPrice = exp (-riskFreeRate * T *马克斯(0,价格- minPrice);结束

障碍选择功能

upAndOutCallOption函数执行蒙特卡罗模拟来确定一个看涨期权的价格还有障碍。如果股票价格保持低于障碍水平,函数使用最后的股票价格在一个正常的欧洲看涨期权的计算。

upAndOutCallOption函数接受一个初始股票价格,无风险利率,股息率,市场波动,价格,价格障碍,总时间窗口和采样率作为输入。

函数optionPrice = upAndOutCallOption(价格、riskFreeRate股息,波动性,罢工,障碍,T, dT) T = 0;(t < t) & &(价格< t = t + dT障碍);博士= (riskFreeRate -股利波动*波动/ 2)* dT;pert = * sqrt (dT) * randn波动;价格=价格* exp(博士+ pert);结束如果价格<障碍%在屏障,所以欧式期权的价格optionPrice = exp (-riskFreeRate * T *马克斯(0,价格-罢工);其他的%的屏障,所以选择撤回optionPrice = 0;结束结束

另请参阅

||

相关的话题