楼主: sushuiasushui
2644 2

[问答] for循环内外循环问题求解 [推广有奖]

  • 9关注
  • 0粉丝

已卖:13份资源

硕士生

26%

还不是VIP/贵宾

-

威望
0
论坛币
610 个
通用积分
22.9838
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
1348 点
帖子
91
精华
0
在线时间
159 小时
注册时间
2011-12-16
最后登录
2019-7-16

楼主
sushuiasushui 发表于 2014-5-30 05:09:57 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
因为输入的参数都是要从excel表格里导入的向量,而且其中两部分的参数维数还不同,再加上又需要蒙特卡洛方法(即生成10000个路径),所以我只能编两个for循环:
下面是我写的code:
function [price] = mcmc(S,K,B,T,sigma,v,theta,r,d,M,N,seed)
%M is the number of time steps,
%N is the number of paths,
M = 100;
N = 10000;


MCpayoff = zeros(N,M+1);
S=zeros(N,M+1);
rand('seed',0);


%S is the current price of the underlying asset,
%K is the exercise price of the option,
%B is the barrier of the option,
%r is the risk-free rate,
%d is the dividend,
%T is the time to maturity,
%sigma is the volatility of the asset price,
NUM = xlsread('EuropeanUpAndOutCall.xls');
MCprice = zeros(26,5);


for i = 1:26
    B = NUM(i,1);
    K = NUM(i,2);
    %这两个参数的数据是26行的向量,
    for ii = 1:5
    T = NUM(ii,3);
    sigma = NUM(ii,4);
    v = NUM(ii,5);
    theta = NUM(ii,6);
    r = NUM(ii,7);
    d = NUM(ii,8);
    S0 = NUM(ii,9);
   %这几个参数却是5行的向量,
%choose a time discretization;
Deltat=T/M;


%simulate a random number of gamma processes,independent of all other yet
%simulated random number,
G = gamrnd(Deltat/v,v,N,M);
%simulate a standard normally distributed random number Z_i,
Z = normrnd(0,1,N,M);
%the return is
deltaX = theta*G+sigma*sqrt(G).*Z;
X0 = zeros(N,M);
X = X0+cumsum(deltaX,2);
%the stock prices
S(:,1) = S0*ones(N,1);
t = (Deltat:Deltat:T);
t = repmat(t,N,1);
w = (1/v)*log(1-theta*v-sigma^2*v/2);
S(:,2:M+1) = S0.*exp(r*t+X+w*t);
%the payoff for a Down and Out Put Option
ST = S(:,M+1);
Max = max(S,[],2);
for j=1:length(Max)
    if  Max(j,1) < B && K < S(j,M+1)%因为此处需要10000个元素的列向量的每个元素与B,K(26个元素的列向量)的每个元素比较,又设了个for循环和if循环
        MCpayoff(j,1) = S(j,M+1)-K;
    else
        MCpayoff(j,1) = 0;
    end;
end;
%the option price is
MCprice = exp(-r*T)*(1/N)*sum(MCpayoff(:,1));%此处是得出10000个路径的平均值,之后要针对有5个元素的列向量循环一次,然后是26个元素的列向量再循环一次。。
    end
end
我的问题是:类似这种代入参数维数不同的情况,有没有什么简化的方法?如果没有,循环的顺序是否先内再外呢?好复杂啊,我这个新手撑不住了。。光end都end了好几个,已经分不清了。。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:for循环 问题求解 For distributed Independent

沙发
Benlaron 发表于 2014-5-30 11:05:16
第一,楼主写的程序很多地方有问题:比如说你设定的输入参数和输出参数就基本没在function里用到。比如说你的price,你最后弄的是MCprice,我有信心说你的function跑一次就会报错;
第二,楼主写程序的格式不科学。缩进要对齐,这才是良好的编程习惯。比如说(你的程序见附件)
  1. for i = 1:100
  2.      disp('test');
  3.      for j = 1:10
  4.           disp('inner test');
  5.      end
  6. end
复制代码
如果你不喜欢敲tab键,就使用ctrl+I让MATLAB自动帮你缩进,不过你需要高版本的MATLAB。
第三, for循环你可以看做是一个“求和”符号,内层的for就是内层的求和,因此是先做内层的循环再做外层的循环。比如说上面的例子中,先做j = 1:10再做i = 1:100

mcmc.txt (2.09 KB)



藤椅
sushuiasushui 发表于 2014-5-30 19:28:41
多谢回复,因为是新手,猛一下需要写这么复杂的code实在吃不消
关于你的第一条我有点不太明白,输出参数的问题我了解了,应该是把function里的price改成MCprice,但是为什么说输入参数没有在function里用到呢?我也定义了每个参数啊,就是最开始的那些个26个元素的列向量和5个元素的列向量,而且后面的式子也都有用到这些参数来表达。。
第二个就是关于这种代入的维数不同的参数,是只能用多个for循环来解决么?
多谢多谢

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 14:52