蒙特卡羅

如何使用 GPU 和 Matlab 模擬 CIR 過程

  • April 27, 2015

我正在嘗試使用 Matlab 和我的 GPU 來模擬 CIR 過程以提高效率。由於離散化的遞歸性質,目前我遇到了一些實現問題。

我目前使用的 sheme 是簡單的歐拉

$$ V_t \approx \max {V_{t-1} + \kappa_V(\bar{V}-V_{t-1})\Delta h + \sigma_V\sqrt{V_{t-1}}\sqrt{\Delta h}\mathcal{N}(0,1),0}. $$ 要在 GPU 上正確模擬,我需要一些幫助功能,如本Matlab 指南中所述

function [ V ] = simulation_fun( V, W, N, h, kappa_V, V_bar, sigma_V)        
t=1;
while t < N    % a path has N steps 
    V(:,t+1)=max(V(:,t)+kappa_V*(V_bar-V(:,t))*h + sigma_V*sqrt(V(:,t))*sqrt(h)*W(:,t),0);
    t=t+1;    
end     
end

比我定義模型參數

N=1000; 
M=1000;  % Number of MC simulations
h=0.01;
kappa_V=1;
V_bar=1;
sigma_V=0.2;
V=gpuArray(ones(M,N));
W=gpuArray.randn(M,N);

之後我通過呼叫模擬

V = arrayfun(@simulation_fun,V, W, N, h, kappa_V, V_bar, sigma_V);

並得到以下錯誤

Error using gpuArray/arrayfun
Indexing is not supported. error at line: 3  .

但是,如果我使用

V = simulation_fun(V, W, N, h, kappa_V, V_bar, sigma_V);

它可以工作,但模擬比僅使用 CPU 慢大約 2.5 倍。

有誰知道如何正確實現模擬?

您應該為您的 matlab 程式碼用 CUDA(Nvidia 語言)編寫一些核心函式。Arrayfun 非常嚴格,不合適。查看此連結http://fr.mathworks.com/help/distcomp/run-cuda-or-ptx-code-on-gpu.html了解有關 matlab 和並行計算的更多詳細資訊。

使用 arrayfun 有一些限制。 您可以在此處閱讀限制

從錯誤來看,您不能像現在這樣使用索引。

您可能必須為 $ V_{t+1} $ 和 $ V_t $ .

我建議您在 Matlab 的網站上找到類似的範例並嘗試複製其功能。這是一篇有關如何使用 Matlab 在 GPU 上編寫二階波動方程的資訊的文章。

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