f*****c 发帖数: 3257 | 1 一直不熟悉matlab语言,特别是循环问题,最近终于碰到大麻烦了,10个包子求助!
我用如下的代码,对38个国家的货币回报分别跟10个跨国公司的季度回报做资产组合,
但是写完这个代码,matlab居然停不下来了,请问各位大神,这是怎么回事?
----------------------------------
for y=1:38
%currency equity return
eval(['su',num2str(y),'=r',num2str(y),'-cost']); % net currency return
eval(['rr',num2str(y),'=zeros(q,s)']); % construct the whole currency return
matrix for (s+1) leverage
for i=1:s
for j=1:q
eval(['rr',num2str(y),'(j,i)=(su',num2str(y),'(j)-(fai(j,i)*leverage
(i)))/(1-leverage(i))']);
end
end
eval(['r_h',num2str(y),'=mean(rr',num2str(y),')']); % currency mean return,
1*s
eval(['var_h',num2str(y),'=var(rr',num2str(y),')']); % currency return Std.
Dev. 1*s
stock=[stock1,stock2,stock3,stock4,stock5,stock6,stock7,stock8,stock9,
stock10];
t=size(stock,2); % t=10;total number of stocks
covs=a.*cov(stock); % covariance between stock return, or H
r=mean(stock,1)'; % stock mean return, or f
eval(['x',num2str(y),'=zeros(t,s)']); % stock optimal shares
eval(['covsh',num2str(y),'=zeros(t,s)']); % 10*100 matrix, covariance
between currency and stocks
eval(['total',num2str(y),'=[stock,rr',num2str(y),']']);% all stocks and
currency are puttogether
eval(['covtotal',num2str(y),'=a.*cov(total',num2str(y),')']); % get the
covariance between all assets
for i=1:s
eval(['covsh',num2str(y),'(:,i)=covtotal',num2str(y),'(1:t,t+i)']); %
end
A=-eye(t);
b=zeros(t,1);
Aeq=ones(1,t);
beq=ones(s,1)-s_h; %here is a matrix while in each quandprog is a scalar
eval(['favl',num2str(y),'=zeros(s,1)']);
eval(['U',num2str(y),'=zeros(s,1)']);
eval(['f',num2str(y),'=zeros(t,s)']);
for i=1:s
eval(['f',num2str(y),'(:,i)=(a*s_h(i)).*covsh',num2str(y),'(:,i)-r']);
end
for i=1:s
eval(['[x',num2str(y),'(:,i),favl',num2str(y),'(i)]=quadprog(covs,f',
num2str(y),'(:,i),A,b,Aeq,beq(i),zeros(t,1))']);
eval(['U',num2str(y),'(i)=-(favl',num2str(y),'(i)+.5*a*s_h(i)^2*var_h(i)
-s_h(i)*r_h(i))']);
end
tr=zeros(t+1,s); % total mean returns for 11 assets
for i=1:s
tr(1:t,i)=r;
tr(t+1,i)=r_h(i);
end
eval(['sr',num2str(y),'=[x',num2str(y),';s_h]']); % shares for 11 asset
eval(['ret',num2str(y),'=zeros(s,1)']);
eval(['risk',num2str(y),'=zeros(s,1)']);
for i=1:s
eval(['ret',num2str(y),'(i)=sr',num2str(y),'(:,i)'*tr(:,i)']); %
portfolio return
eval(['risk',num2str(y),'(i)=sr',num2str(y),'(:,i)'*[covs,covsh',num2str
(y),...
'(:,i);covsh',num2str(y),'(:,i)',var_h(i)]*sr',num2str(y),'(:,i)']);
end
% leverage, currency share, stock share; covariance;return;risk,utility
eval(['[max_val',num2str(y),',m',num2str(y),'] = max(max(U',num2str(y),...
',[],2))']);
end
--------------------------------------
总是转个不停,就是停不下来,怎么回事? | X****r 发帖数: 3557 | 2 s和q分别是多大?
你这个程序,老实说,惨不忍睹啊。
return
【在 f*****c 的大作中提到】 : 一直不熟悉matlab语言,特别是循环问题,最近终于碰到大麻烦了,10个包子求助! : 我用如下的代码,对38个国家的货币回报分别跟10个跨国公司的季度回报做资产组合, : 但是写完这个代码,matlab居然停不下来了,请问各位大神,这是怎么回事? : ---------------------------------- : for y=1:38 : %currency equity return : eval(['su',num2str(y),'=r',num2str(y),'-cost']); % net currency return : eval(['rr',num2str(y),'=zeros(q,s)']); % construct the whole currency return : matrix for (s+1) leverage : for i=1:s
| t****t 发帖数: 6806 | 3 我从来没见过matlab需要写这么多eval的, 比如说你明明可以写
a(i)=b(i), 为什么一定要写
eval(['a(' num2str(i) ')=b(' num2str(i) ')'])呢? 你是故意把程序写复杂以保住
职位吗?
return
【在 f*****c 的大作中提到】 : 一直不熟悉matlab语言,特别是循环问题,最近终于碰到大麻烦了,10个包子求助! : 我用如下的代码,对38个国家的货币回报分别跟10个跨国公司的季度回报做资产组合, : 但是写完这个代码,matlab居然停不下来了,请问各位大神,这是怎么回事? : ---------------------------------- : for y=1:38 : %currency equity return : eval(['su',num2str(y),'=r',num2str(y),'-cost']); % net currency return : eval(['rr',num2str(y),'=zeros(q,s)']); % construct the whole currency return : matrix for (s+1) leverage : for i=1:s
| f*****c 发帖数: 3257 | 4
s&q=100
【在 X****r 的大作中提到】 : s和q分别是多大? : 你这个程序,老实说,惨不忍睹啊。 : : return
| f*****c 发帖数: 3257 | 5
是小弟无能,每次都要对38个国家做同样的操作~~下面是其中一个国家r1表示第一个
国家的货币回报。
s=100;% 100 types of currency
currency=zeros(s,1); %100*1
q=size(r1,1); % 100 quarters
a=6;%risk aversion
a=5;% this is value of V/NW
for i=1:s %1:100
currency(i)=0.8+0.002*(i-1);
end
%s_h=[1;zeros(s-1,1)];
s_h=zeros(s,1);% share of currency
for i=1:s
s_h(i)=a*(1-currency(i));% now assume NW/V=20%
end
cost=0.014.*ones(s,1);%assume annual rate of cost+tax=1.4%*4=5.6%;
%currency equity return
su=r1-cost; % net currency return
rr1=zeros(q,s); % construct the whole currency return matrix for (s+1)
currency
%fai=0.01;
fai=zeros(q,s);
for i=1:q
for j=1:s
fai(i,j)=arm(i)+0.00005*(j-1);
end
end
for i=1:s
for j=1:q
rr1(j,i)=(su(j)-(fai(j,i)*currency(i)))/(1-currency(i));
end
end
r_h=mean(rr1); % currency mean return, 1*s
var_h=var(rr1); % currency return Std. Dev. 1*s
t=size(stock,2); % t=10;total number of stocks (stock is a 100*10 matrix:
100 periods and 10 types)
covs=a.*cov(stock); % covariance between stock return, or H
r=mean(stock,1)'; % stock mean return, or f
x=zeros(t,s); % stock optimal shares
covsh=zeros(t,s); % 10*100 matrix, covariance between currency and stocks
total=[stock,rr1];% all stocks and currency are puttogether
covtotal=a.*cov(total); % get the covariance between all assets
for i=1:s
covsh(:,i)=covtotal(1:t,t+i); %
end
A=-eye(t);
b=zeros(t,1);
Aeq=ones(1,t);
beq=ones(s,1)-s_h; %here is a matrix while in each quandprog is a scalar
favl=zeros(s,1);
U=zeros(s,1);
f=zeros(t,s);
for i=1:s
f(:,i)=(a*s_h(i)).*covsh(:,i)-r;
end
for i=1:s
[x(:,i),favl(i)]=quadprog(covs,f(:,i),A,b,Aeq,beq(i),zeros(t,1));
U(i)=-(favl(i)+.5*a*s_h(i)^2*var_h(i)-s_h(i)*r_h(i));
end
tr=zeros(t+1,s); % total mean returns for 11 assets
for i=1:s
tr(1:t,i)=r;
tr(t+1,i)=r_h(i);
end
sr=[x;s_h']; % shares for 11 asset
ret=zeros(s,1);
risk=zeros(s,1);
for i=1:s
ret(i)=sr(:,i)'*tr(:,i); % portfolio return
risk(i)=sr(:,i)'*[covs,covsh(:,i);covsh(:,i)',var_h(i)]*sr(:,i);
end
% currency, currency share, stock share; covariance;return;risk,utility
[max_val,m] = max(max(U,[],2));
【在 t****t 的大作中提到】 : 我从来没见过matlab需要写这么多eval的, 比如说你明明可以写 : a(i)=b(i), 为什么一定要写 : eval(['a(' num2str(i) ')=b(' num2str(i) ')'])呢? 你是故意把程序写复杂以保住 : 职位吗? : : return
| s*w 发帖数: 729 | 6 没仔细看你的 code, 提醒一下:
1. 不要用 eval 来实现 dynamic variable 之类的,直接用 cell 保存
2. matlab debug 不要太容易,自己 step 一下,就明白哪里出错了
【在 f*****c 的大作中提到】 : : 是小弟无能,每次都要对38个国家做同样的操作~~下面是其中一个国家r1表示第一个 : 国家的货币回报。 : s=100;% 100 types of currency : currency=zeros(s,1); %100*1 : q=size(r1,1); % 100 quarters : a=6;%risk aversion : a=5;% this is value of V/NW : for i=1:s %1:100 : currency(i)=0.8+0.002*(i-1);
| f*****c 发帖数: 3257 | 7
大湿,问个问题:
我在stata可以如下操作
forvalue i=1/38{
generate bithc`i'="bithch`i'"
}
请问在matlab的话,该怎么写呢
【在 s*w 的大作中提到】 : 没仔细看你的 code, 提醒一下: : 1. 不要用 eval 来实现 dynamic variable 之类的,直接用 cell 保存 : 2. matlab debug 不要太容易,自己 step 一下,就明白哪里出错了
| b***i 发帖数: 3043 | 8 举个例子:
iseq=1:100;
currency = 0.8+0.002*iseq;
不需要循环。
【在 f*****c 的大作中提到】 : : 大湿,问个问题: : 我在stata可以如下操作 : forvalue i=1/38{ : generate bithc`i'="bithch`i'" : } : 请问在matlab的话,该怎么写呢
| S*********g 发帖数: 5298 | 9 你还是重写吧。
把stock1,...,stock38存成一个矩阵
r1,r2,...,r38合并成一个矩阵
然后用矩阵操作
就你这么点数据量,应该是瞬间完成的
return
【在 f*****c 的大作中提到】 : 一直不熟悉matlab语言,特别是循环问题,最近终于碰到大麻烦了,10个包子求助! : 我用如下的代码,对38个国家的货币回报分别跟10个跨国公司的季度回报做资产组合, : 但是写完这个代码,matlab居然停不下来了,请问各位大神,这是怎么回事? : ---------------------------------- : for y=1:38 : %currency equity return : eval(['su',num2str(y),'=r',num2str(y),'-cost']); % net currency return : eval(['rr',num2str(y),'=zeros(q,s)']); % construct the whole currency return : matrix for (s+1) leverage : for i=1:s
| S*********g 发帖数: 5298 | 10
return
leverage
这个j循环可以改成
rr(y,:,:)=repmat(su(y,:),1,s)-fai.*repmat(leverage./(1-leverage,q,1);
i循环也可以同样变成矩阵操作,
最后,这两层循环,一行就可以解决了
return,
.
i)
num2str
);
【在 f*****c 的大作中提到】 : 一直不熟悉matlab语言,特别是循环问题,最近终于碰到大麻烦了,10个包子求助! : 我用如下的代码,对38个国家的货币回报分别跟10个跨国公司的季度回报做资产组合, : 但是写完这个代码,matlab居然停不下来了,请问各位大神,这是怎么回事? : ---------------------------------- : for y=1:38 : %currency equity return : eval(['su',num2str(y),'=r',num2str(y),'-cost']); % net currency return : eval(['rr',num2str(y),'=zeros(q,s)']); % construct the whole currency return : matrix for (s+1) leverage : for i=1:s
| | | C**R 发帖数: 1047 | 11 居然用inline function,疯了。
return
【在 f*****c 的大作中提到】 : 一直不熟悉matlab语言,特别是循环问题,最近终于碰到大麻烦了,10个包子求助! : 我用如下的代码,对38个国家的货币回报分别跟10个跨国公司的季度回报做资产组合, : 但是写完这个代码,matlab居然停不下来了,请问各位大神,这是怎么回事? : ---------------------------------- : for y=1:38 : %currency equity return : eval(['su',num2str(y),'=r',num2str(y),'-cost']); % net currency return : eval(['rr',num2str(y),'=zeros(q,s)']); % construct the whole currency return : matrix for (s+1) leverage : for i=1:s
| C**********r 发帖数: 8189 | 12 我可以说这个帖子很欢乐吗?lz原来是写什么语言的,Matlab用的像外国人讲中国话那
样别扭呢。 | k**********g 发帖数: 989 | 13
繁体的MATLAB看了觉得很好
【在 C**********r 的大作中提到】 : 我可以说这个帖子很欢乐吗?lz原来是写什么语言的,Matlab用的像外国人讲中国话那 : 样别扭呢。
| a****0 发帖数: 51 | 14
Javascript?
【在 C**********r 的大作中提到】 : 我可以说这个帖子很欢乐吗?lz原来是写什么语言的,Matlab用的像外国人讲中国话那 : 样别扭呢。
| m****s 发帖数: 1481 | 15 程序看不懂,我用matlab快10年了,从来没用过eval,能用矩阵和向量的就不用循环,
用for loop在matlab那是相当的慢的。
给个tip,如果非要用for loop然后发现停不下来,在for 后面插一行for的变量名,至
少可以看看是循环造成的慢还是循环里面的运算慢 | T*****u 发帖数: 7103 | 16 楼主去上个半天一天的培训吧,至少格式会清楚些。
【在 m****s 的大作中提到】 : 程序看不懂,我用matlab快10年了,从来没用过eval,能用矩阵和向量的就不用循环, : 用for loop在matlab那是相当的慢的。 : 给个tip,如果非要用for loop然后发现停不下来,在for 后面插一行for的变量名,至 : 少可以看看是循环造成的慢还是循环里面的运算慢
| C*********g 发帖数: 3728 | 17 for loop现在Matlab内部实现矢量化了,所以速度不再慢。但是当然写成矢量化看着干
净。
【在 m****s 的大作中提到】 : 程序看不懂,我用matlab快10年了,从来没用过eval,能用矩阵和向量的就不用循环, : 用for loop在matlab那是相当的慢的。 : 给个tip,如果非要用for loop然后发现停不下来,在for 后面插一行for的变量名,至 : 少可以看看是循环造成的慢还是循环里面的运算慢
| s*w 发帖数: 729 | 18 非大师,不过 matlab 断断续续用过10多年
matlab 里面不用动态生成变量,你想生成 r1,r2...r38 的话,应该直接用
r = cell(1,38)
然后 r{i} 里面放你的 ri
如果你的 r1,..r38 size 一样的话,连 cell 都不用,直接用 matrix
r = zeros(38,1) 如果 ri 是 scalar
r = zeros(38,3,3) 如果 ri 是 3*3 matrix
个人偏见,matlab 是最好学好写的语言; 可惜没啥大用,学得再好也找不到工作,所以
有机会的话,还是练练别的语言,找工也容易些
【在 f*****c 的大作中提到】 : : 大湿,问个问题: : 我在stata可以如下操作 : forvalue i=1/38{ : generate bithc`i'="bithch`i'" : } : 请问在matlab的话,该怎么写呢
| t****t 发帖数: 6806 | 19 matlab一向是作为一个好用的工具, 而不是作为一门语言出现的. 就好象以前计算器是
一个好用的工具, 工程师基本上都需要. 但是计算器玩得再好也很难靠计算器找到工作
. 从另一个角度讲, 想要靠计算器找到工作的企图本身就是不对的.
最后, 楼主显然也不是想靠matlab来找工作, 所以我们说的都是废话.
所以
【在 s*w 的大作中提到】 : 非大师,不过 matlab 断断续续用过10多年 : matlab 里面不用动态生成变量,你想生成 r1,r2...r38 的话,应该直接用 : r = cell(1,38) : 然后 r{i} 里面放你的 ri : 如果你的 r1,..r38 size 一样的话,连 cell 都不用,直接用 matrix : r = zeros(38,1) 如果 ri 是 scalar : r = zeros(38,3,3) 如果 ri 是 3*3 matrix : 个人偏见,matlab 是最好学好写的语言; 可惜没啥大用,学得再好也找不到工作,所以 : 有机会的话,还是练练别的语言,找工也容易些
| t****t 发帖数: 6806 | 20 这是什么时候的事情?
【在 C*********g 的大作中提到】 : for loop现在Matlab内部实现矢量化了,所以速度不再慢。但是当然写成矢量化看着干 : 净。
| | | C*********g 发帖数: 3728 | 21 matlab2010 or 2009 version I believe
【在 t****t 的大作中提到】 : 这是什么时候的事情?
| t****t 发帖数: 6806 | 22 我狗了一圈new feature, 从2009到2012, 没发现你说的功能. 给个reference? 这种革
命性的提高必定要大大吹嘘的, 虽然我认为不太可能.
【在 C*********g 的大作中提到】 : matlab2010 or 2009 version I believe
| S*********g 发帖数: 5298 | 23 这个是真的
for loop已经差不多了
【在 t****t 的大作中提到】 : 我狗了一圈new feature, 从2009到2012, 没发现你说的功能. 给个reference? 这种革 : 命性的提高必定要大大吹嘘的, 虽然我认为不太可能.
| S*********g 发帖数: 5298 | 24 it was in Matlab 6.5
As long as you don't call other m file function, for loop is at least as
fast as vectorized version
【在 S*********g 的大作中提到】 : 这个是真的 : for loop已经差不多了
| f*****c 发帖数: 3257 | 25
多谢建议。
后来索性全部写完了。
我之所以没用cell,是因为r1,。。。r38,每个都是100×100的矩阵。
【在 s*w 的大作中提到】 : 没仔细看你的 code, 提醒一下: : 1. 不要用 eval 来实现 dynamic variable 之类的,直接用 cell 保存 : 2. matlab debug 不要太容易,自己 step 一下,就明白哪里出错了
| f*****c 发帖数: 3257 | 26
r1,r2,...,r38合并成一个矩阵,最后就是100×3800的矩阵,所以我昨天直接一个个的
写完了~~~
唉,各位砖家的讨论,让小弟惭愧
【在 S*********g 的大作中提到】 : 你还是重写吧。 : 把stock1,...,stock38存成一个矩阵 : r1,r2,...,r38合并成一个矩阵 : 然后用矩阵操作 : 就你这么点数据量,应该是瞬间完成的 : : return
| f*****c 发帖数: 3257 | 27
~~~作为一个matlab新手,写成这样了,要多鼓励好不好
【在 C**********r 的大作中提到】 : 我可以说这个帖子很欢乐吗?lz原来是写什么语言的,Matlab用的像外国人讲中国话那 : 样别扭呢。
| f*****c 发帖数: 3257 | 28
多谢建议!
【在 m****s 的大作中提到】 : 程序看不懂,我用matlab快10年了,从来没用过eval,能用矩阵和向量的就不用循环, : 用for loop在matlab那是相当的慢的。 : 给个tip,如果非要用for loop然后发现停不下来,在for 后面插一行for的变量名,至 : 少可以看看是循环造成的慢还是循环里面的运算慢
| S*********g 发帖数: 5298 | 29 才100x3800
我做intraday model的矩阵都是78000000 by 30
【在 f*****c 的大作中提到】 : : 多谢建议!
| f*****c 发帖数: 3257 | 30
~~~~哈哈,好好,立马给包子~~
不到葵花来,不知自己有多弱~
【在 S*********g 的大作中提到】 : 才100x3800 : 我做intraday model的矩阵都是78000000 by 30
| | | S*********g 发帖数: 5298 | 31 他那是老古董了
要想快要避免两点:
1 字符串操作,死慢
2 动态添加数据
内存能提前分配就提前分配
【在 f*****c 的大作中提到】 : : ~~~~哈哈,好好,立马给包子~~ : 不到葵花来,不知自己有多弱~
| t****t 发帖数: 6806 | 32 "as long as you don't call other m file function"?
这个很难说有没有什么大用啊.
【在 S*********g 的大作中提到】 : it was in Matlab 6.5 : As long as you don't call other m file function, for loop is at least as : fast as vectorized version
| T*U 发帖数: 22634 | 33 matlab 就是个能编程的计算器,这个惨不忍睹啊,跟shell script差不多了。 | l*****n 发帖数: 1068 | |
|