s********r 发帖数: 529 | 1 最近在搞一下MC的东西,主要用的Matlab。
发觉对于路径依赖的期权,例如说亚式期权,需要得到股票价格的历史路径。
有一些比较复杂的股票价格dynamics,如果一条路径上面取200个点,跑10^8条路径的话
,用Matlab就很慢了。
我Matlab用得很烂,基本上就是用很简单的for循环,但是这样的方法对于Matlab肯定是
不够优化的,不知道有没有达人能够指点一下,对于这样的MC方法,Matlab有哪些方法
可以让过程更加优化,跑得更加快呢?
多谢各位了! | l******i 发帖数: 1404 | 2 关于Matlab速度问题,我胡诌两句:
Matlab慢的关键是在循环上,Matlab尽量少用循环语句,尽量写成矩阵形式的计算。
如果matlab code里没有循环,全是大量矩阵运算的话,速度会很快的。
想用很多循环的又要速度的就上C++,想更快就把C++ code写成可以并行计算的那种。
抛开速度问题,另一个角度来说:你程序很大,变量很多的话,
C++是首选,因为C/C++拥有丰富的数据结构。 | S*********g 发帖数: 5298 | 3 1, 尽量少用for,多用logical indexing
2, 各种数组提前安排好大小,往里填数,不要让数组动态的长
的话
定是
【在 s********r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 最近在搞一下MC的东西,主要用的Matlab。 : 发觉对于路径依赖的期权,例如说亚式期权,需要得到股票价格的历史路径。 : 有一些比较复杂的股票价格dynamics,如果一条路径上面取200个点,跑10^8条路径的话 : ,用Matlab就很慢了。 : 我Matlab用得很烂,基本上就是用很简单的for循环,但是这样的方法对于Matlab肯定是 : 不够优化的,不知道有没有达人能够指点一下,对于这样的MC方法,Matlab有哪些方法 : 可以让过程更加优化,跑得更加快呢? : 多谢各位了!
| A*****s 发帖数: 13748 | 4 MATLAB现在循环还有那么慢么?
我那天手滑试了一下FDM上的,还好啊?
【在 l******i 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 关于Matlab速度问题,我胡诌两句: : Matlab慢的关键是在循环上,Matlab尽量少用循环语句,尽量写成矩阵形式的计算。 : 如果matlab code里没有循环,全是大量矩阵运算的话,速度会很快的。 : 想用很多循环的又要速度的就上C++,想更快就把C++ code写成可以并行计算的那种。 : 抛开速度问题,另一个角度来说:你程序很大,变量很多的话, : C++是首选,因为C/C++拥有丰富的数据结构。
| a*******1 发帖数: 1554 | 5 你看这样可以不?
S0是初始价格,r是利率,sigma是波动率,T是到期日,K是执行价,hsigma是算vega用
的,h0是算delta用的,N是200,p是10^8,但一般不用取这么大吧,我读书做project
才取10万,这是当时作业的一小部分
function []=ThreeMethodsMilter(S0, r, sigma, T, K, h0, hsigma,p,N)
%% Finite difference
SqrRootp = sqrt(p);
DeltaT = T/N;
SqrtDeltaT = sqrt(DeltaT);
Z= randn(N-1,p);
P = prod([ones(1,p);1+r*DeltaT+sigma*SqrtDeltaT*Z+0.5*sigma^2*DeltaT*(Z.^2-1
)]);
S = P*S0;
C = exp(-r*T)*max(0,S-K);
SPlus = exp(-r*T)*max(0,(S0+h0)*P-K);
SMinus = exp(-r*T)*max(0,(S0-h0)*P-K);
DeltaFD = (SPlus-SMinus)/2/h0;
GammaFD = (SPlus-2*C+SMinus)/h0^2;
SPlus = prod([S0*ones(1,p);1+r*DeltaT+(sigma+hsigma)*SqrtDeltaT*Z]);
VegaPlus = exp(-r*T)*max(0,SPlus-K);
SMinus = prod([S0*ones(1,p);1+r*DeltaT+(sigma-hsigma)*SqrtDeltaT*Z]);
VegaMinus = exp(-r*T)*max(0,SMinus-K);
VegaFD = (VegaPlus-VegaMinus)/2/hsigma; | A*****s 发帖数: 13748 | 6 Monte Carlo如果不是动真枪的话,用Excel就可以了 lol
project
【在 a*******1 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你看这样可以不? : S0是初始价格,r是利率,sigma是波动率,T是到期日,K是执行价,hsigma是算vega用 : 的,h0是算delta用的,N是200,p是10^8,但一般不用取这么大吧,我读书做project : 才取10万,这是当时作业的一小部分 : function []=ThreeMethodsMilter(S0, r, sigma, T, K, h0, hsigma,p,N) : %% Finite difference : SqrRootp = sqrt(p); : DeltaT = T/N; : SqrtDeltaT = sqrt(DeltaT); : Z= randn(N-1,p);
| s********r 发帖数: 529 | 7 嗯,这个真不错
但是如果碰到股票的dynamics当中的drift和volatility是和状态变量相关的话,比如说
stochastic volatility或者local volatility的话是不是就只能用for循环了?
多谢解答了!
project
【在 a*******1 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你看这样可以不? : S0是初始价格,r是利率,sigma是波动率,T是到期日,K是执行价,hsigma是算vega用 : 的,h0是算delta用的,N是200,p是10^8,但一般不用取这么大吧,我读书做project : 才取10万,这是当时作业的一小部分 : function []=ThreeMethodsMilter(S0, r, sigma, T, K, h0, hsigma,p,N) : %% Finite difference : SqrRootp = sqrt(p); : DeltaT = T/N; : SqrtDeltaT = sqrt(DeltaT); : Z= randn(N-1,p);
| a*******1 发帖数: 1554 | 8 你得把那个dynamics写出来我才知道。。。。。。 | l******n 发帖数: 9344 | 9 MEX compile C/C++
*p
【在 l******i 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 关于Matlab速度问题,我胡诌两句: : Matlab慢的关键是在循环上,Matlab尽量少用循环语句,尽量写成矩阵形式的计算。 : 如果matlab code里没有循环,全是大量矩阵运算的话,速度会很快的。 : 想用很多循环的又要速度的就上C++,想更快就把C++ code写成可以并行计算的那种。 : 抛开速度问题,另一个角度来说:你程序很大,变量很多的话, : C++是首选,因为C/C++拥有丰富的数据结构。
| s********r 发帖数: 529 | 10 Sorry, cant type chinese here
Say, dSt=rt St dt + sqrt(St) sigma dWt
Thanks for your help!
Great weekend!
【在 a*******1 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你得把那个dynamics写出来我才知道。。。。。。
| a*******1 发帖数: 1554 | 11 其实我好久没碰了,你可以试试用Ito's Formula变一下。。。。。。 |
|