使用GPUarrayfun
的蒙特卡罗模拟
这个例子展示了如何计算金融期权价格GPU使用蒙特卡罗方法。
示例使用三个简单类型的选择,但是你可以以类似的方式更复杂的期权价格。在本例中,您比较时间在CPU上运行蒙特卡罗模拟和使用arrayfun
在GPU上。
股票价格演变
根据对数正态分布假定价格演化分布与无风险利率,股息收益率(如果有的话),在市场波动。此外,假定所有这些量保持不变的一生的选择。这些假设导致价格的随机微分方程。
,
在哪里 股票价格, 是无风险利率, 是一年一度的股息收益率的股票, 是价格的波动性, 代表一个高斯白噪声过程。假设 对数正态分布分布,这个微分方程离散得到这个方程。
。
检查两年时间窗口使用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);
当你打电话arrayfun
GPU数组和函数句柄作为输入,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 / timeAsianOptionGPU…timeLookbackOptionCPU / 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;结束结束
另请参阅
相关的话题
- 测量和提高GPU性能
- 提高性能使用arrayfun Element-Wise MATLAB函数的GPU
- 欧洲和美国的定价选择传播(金融工具的工具箱)
- 亚洲期权定价(金融工具的工具箱)
- 欧洲使用不同的股票看涨期权定价模型(金融工具的工具箱)
- 金宝app支持股权衍生功能(金融工具的工具箱)