モンテカルロシミュレーションでのgpu arrayfunののの
この例では、金融オプションの価格をモンテカルロ法を使用して GPU で計算する方法を示します。エキゾチック オプションの 3 つの単純なタイプを例として使用しますが、同様の方法でもっと複雑なオプションの価格を設定できます。
この例は関数であるため、補助関数をその内部に入れ子にすることができます。
功能PARALLELDEMO_GPU_OPTIONPRICTION
この例では実行に長時間かかるカーネルを使用するため、GPU でのカーネル実行がタイムアウト可能な場合は実行できません。タイムアウトが有効なのは、通常は、選択された GPU がディスプレイの駆動も行っている場合に限られます。
dev = gpudeVice();ifdev.kernelexecutionTimeOut错误('pctexample:gpuoptionpricing:kerneltimeout'',...['This example cannot run if kernel execution on the GPU can ',...'time-out.');end
株価の変化
ここはリスク金,利回り利回り利回り配当配当配当配当,,の予想変动率に关连した対数対数正规分布分布にてて価格ががものもの仮定仮定仮定仮定仮定しししし。ているます。これ,に关する次ような确率确率微分方程方程式がが与え。
ここで、は株価、は无リスク利,は株年间配当利回り,は価格のボラティリティ、はガウスのホワイト ノイズ過程です。が対数正規分布であると仮定すると、これは次のように離散化できます。
例として、毎年 1% の配当を生む $100 の株を使用します。政府の基準貸し付け利率が 0.5% であるとします。ほぼ毎日サンプリングした 2 年間の時間ウィンドウを調べます。市場の変動は、毎年 20% であると仮定します。
股票= 100;% Stock price starts at $100.dividend = 0.01;% 1% annual dividend yield.riskFreeRate = 0.005;%0.5%。timetoExpiry = 2;% Lifetime of the option in years.sampleRate = 1/250;% Assume 250 working days per year.波动率= 0.20;%20%波动率。
乱数発生器をリセットして、結果が必ず繰り返されるようにします。
seed = 1234; rng( seed );%重置CPU随机数生成器。gpurng(种子);% Reset the GPU random number generator.
これで、長期にわたるループにより株価の変動経路をシミュレートできます。
价格=上涨空间;时间= 0;hold上;尽管时间'.');end轴紧的; grid上; xlabel(“时间(年)”);ylabel('股价($)');
GPU での実行
株価シミュレーションを GPU で実行するには、まずシミュレーションのループを補助関数内に配置する必要があります。
功能FinalStockPrice = SimulateStockPrice(S,R,D,V,T,DT)t = 0;尽管t < T t = t + dT; dr = (r - d - v*v/2)*dT; pert = v*sqrt( dT )*randn(); S = S*exp(dr + pert);endfinalStockPrice = S;end
これにより、arrayfun
をしこれ何千回も呼び出すことができ。がががががががでででで行わ行われるれるようようようようにに,入力入力入力入力入力価格価格価格はははは,シミュレーションごとにごとにごとごとににににににににににににににににににににににににににににににににに1测定するため,关数Gputimeit
を使用し。
% Create the input data.N = 1000000; startStockPrices = stockPrice*ones(N,1,'gpuarray');%运行模拟。finalStockPrices = arrayfun( @simulateStockPrice,...startStockPrices, riskFreeRate, dividend, volatility,...时间表兴趣,采样);meanFinalPrice = mean(finalStockPrices);% Measure the execution time of the function on the GPU using gputimeit.% This requires us to store the |arrayfun| call in a function handle.功能ToTime = @() arrayfun(@simulateStockPrice,...startStockPrices, riskFreeRate, dividend, volatility,...时间表兴趣,采样);timetaken = guptimeit(functionTotime);fprintf('Calculated average price of $%1.4f in %1.3f secs.\n',...MeanFinalPrice,时间表);clf;Hist(FinalStockPrices,100);Xlabel('股价($)')ylabel('频率') 网格上;
Calculated average price of $98.9563 in 0.283 secs.
アジアン オプションの価格
例として、オプションの有効期間における株価の算術平均を基に、ヨーロピアン タイプのアジアン オプションを使用します。シミュレーション中に価格を累積することで、平均価格を計算できます。コール オプションの場合、平均価格が行使価格を超えている場合にオプションが行使され、支払いは 2 つの価格間の差額となります。
功能optionPrice = asianCallOption(S,r,d,v,x,T,dT) t = 0; cumulativePrice = 0;尽管t < T t = t + dT; dr = (r - d - v*v/2)*dT; pert = v*sqrt( dT )*randn(); S = S*exp(dr + pert); cumulativePrice = cumulativePrice + S;endnumSteps =(t/dt);平均值=累积优势 / numSteps;%在当今的钱中表达最终价格。optionPrice = exp(-r * t) * max(0,seemprice -x);end
ここでももを使用して,,arrayfun
により何千ものシミュレーション パスを実行します。各シミュレーション パスはオプション価格の独立した見積もりを与えるため、平均値を結果と見なします。
罢工= 95;% Strike price for the option ($).optionPrices = arrayfun( @asianCallOption,...StartStockPrices,风险延迟,股息,波动性,罢工,...时间表兴趣,采样);meanOptionPrice = mean(optionPrices);% Measure the execution time on the GPU and show the results.功能ToTime = @() arrayfun( @asianCallOption,...StartStockPrices,风险延迟,股息,波动性,罢工,...时间表兴趣,采样);timetaken = guptimeit(functionTotime);fprintf('Calculated average price of $%1.4f in %1.3f secs.\n',...卑鄙的人,时间表);
计算出的平均价格为0.287秒为8.7210美元。
ルックバック オプションの価格
この例ではヨーロピアンスタイルのルックバック オプションを使用します。その支払いは、オプションの有効期間における最低株価と最終株価の差額になります。
功能optionPrice = euroLookbackCallOption(S,r,d,v,T,dT) t = 0; minPrice = S;尽管t < T t = t + dT; dr = (r - d - v*v/2)*dT; pert = v*sqrt( dT )*randn(); S = S*exp(dr + pert);ifsendend%在当今的钱中表达最终价格。optionPrice = exp(-r*T) * max(0, S - minPrice);end
场合,行使価格は最低であるであるに注意しし。最终最终株価株価ははは必ず必ず最低以上以上ととなるなるためため,オプションオプションは常に常に行使され,,の
optionPrices = arrayfun( @euroLookbackCallOption,...startStockPrices, riskFreeRate, dividend, volatility,...时间表兴趣,采样);meanOptionPrice = mean(optionPrices);% Measure the execution time on the GPU and show the results.functionTotime = @()arrayfun(@eurolookbackcalloption,...startStockPrices, riskFreeRate, dividend, volatility,...时间表兴趣,采样);timetaken = guptimeit(functionTotime);fprintf('Calculated average price of $%1.4f in %1.3f secs.\n',...卑鄙的人,时间表);
Calculated average price of $19.2711 in 0.286 secs.
バリア オプションの価格
この最後の例では、株価がバリア レベルに到達すると無効になる「アップ アンド アウト」バリア オプションを使用します。株価がバリア レベル未満に留まる場合は、最終株価が通常のヨーロピアン コール オプションの計算に使用されます。
功能optionPrice = upAndOutCallOption(S,r,d,v,x,b,T,dT) t = 0;尽管(t < T) && (S < b) t = t + dT; dr = (r - d - v*v/2)*dT; pert = v*sqrt( dT )*randn(); S = S*exp(dr + pert);endifs 在障碍物内的%,因此价格为欧洲选择。optionPrice = exp(-r*T) * max(0, S - x);else% Hit the barrier, so the option is withdrawn.OptionPrice = 0;endend
ここでは、オプションの行使価格とそれが無効となるバリア価格の両方を提供しなければならないことに注意してください。
罢工= 95;% Strike price for the option ($).barrier = 150;% Barrier price for the option ($).optionPrices = arrayfun( @upAndOutCallOption,...startStockPrices, riskFreeRate, dividend, volatility,...strike, barrier,...时间表兴趣,采样);meanOptionPrice = mean(optionPrices);% Measure the execution time on the GPU and show the results.functionTotime = @()arrayfun(@upandoutcalloption,...startStockPrices, riskFreeRate, dividend, volatility,...strike, barrier,...时间表兴趣,采样);timetaken = guptimeit(functionTotime);fprintf('Calculated average price of $%1.4f in %1.3f secs.\n',...卑鄙的人,时间表);
Calculated average price of $6.8166 in 0.289 secs.
end