全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 EViews专版
3344 9
2005-07-08

Eviews 高手请进(找出1,0,-1的对应组合问题)

我用Eviews编写一段程序:

程序首先自动产生一个1,0,-1序列(共!t个1,0或-1,具体!t值在运行前给定, 因为每次运行时要设定不同的!t值).

然后我要找出所有的!t个1,0或-1组合 (共3的!t次方个) 中, 有至少M(M<!t, 通过!track的值设定)个1,0或-1与程序自动产生的那个序列中的1,0,-1一一对应的那些组合. 将这些组合放到一个group中.

我编写的程序如下, 用了!t个循环, 切实可行, 可是当我设定!t到20以上时, 这段代码的运行效率就太低. 计算机要很多天连续运行.

请高手指教, 如何编写当!t值大于20时效率高一点的程序? 如果有疑问之处, 敬请指出, 我再作解释. 谢谢!

!t = 10 !track = 0.90 create u 1 !t series markt = 2*@round(rnd) - 1 stom(markt,vecmarkt) group success !i = 0 !n = 0 for !v1 = -1 to 1 step 1 for !v2 = -1 to 1 step 1 for !v3 = -1 to 1 step 1 for !v4 = -1 to 1 step 1 for !v5 = -1 to 1 step 1 for !v6 = -1 to 1 step 1 for !v7 = -1 to 1 step 1 for !v8 = -1 to 1 step 1 for !v9 = -1 to 1 step 1 for !v10 = -1 to 1 step 1 !n = !n + 1 rowvector(!t) strat!n = na for !pos = 1 to !t strat!n(!pos) = !v{!pos} next scalar ergeb!n = @inner(strat!n,vecmarkt) if ergeb!n >= 2*!track*!t - !t then

(解释一下这里:在我的程序中, 我计算每一个组合和程序自动产生的那个序列的内积(ergeb!n), 然后判断ergeb!n是否大于或等于 2*!track*!t - !t. 当!track=0.90, !t=10时, 2*!track*!t - !t=8, 此时找出3的10次方个1,0或-1组合有至少有8个与程序自动产生的那个序列中的1或-1对应的那些组合) mtos(strat!n, res!n) success.add res!n !i = !i + 1 endif delete ergeb!n strat!n next next next next next next next next next next freeze(strattable) success.table

二维码

扫码加我 拉你入群

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

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

全部回复
2005-7-8 15:14:00

欢迎任何改进意见或提出全新方法! 谢谢!

二维码

扫码加我 拉你入群

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

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

2005-7-8 18:02:00

牛能编程我至少还要两年后才有这水平

二维码

扫码加我 拉你入群

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

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

2005-7-9 01:23:00

这里应该有不少Eviews的大牛们呀! 不要光看不回贴呀! 任何想法和建议都是好的! 在此谢过!

二维码

扫码加我 拉你入群

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

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

2005-7-10 02:50:00

受EViews内存空间的约束,!t增大,系统会到硬盘暂存数据,必然很慢。

楼主的程序很节省内存。下面是学习楼主程序的习作。用3个循环生成待评价的向量(序列)。

!t=10 !track = 0.90 create abc u 1 !t series markt = 2*@round(rnd) - 1 stom(markt,vecmarkt) scalar pb=2*!track*!t - !t !Q=3^(!t) matrix(!Q,!t) mm matrix(!t,!Q) m group success for !j=1 to !t for !i=1 to 3^(!j) for !k=1+(!i-1)*3^(!t-!j) to !i*3^(!t-!j) if @mod(!i,3)=1 then mm(!k,!j)=-1 endif if @mod(!i,3)=2 then mm(!k,!j)=0 endif if @mod(!i,3)=0 then mm(!k,!j)=1 endif next next next m=@transpose(mm) !k=0 for !j=1 to !Q vector v1=@columnextract(m, !j) scalar ergeb = @inner(v1,vecmarkt) if ergeb>=pb then !k=!k+1 series s!k mtos(v1,s{!k}) success.add s{!k} endif next freeze(strattable) success.table

在EViews4.1和EViews5.1(企业版)下都通过。

二维码

扫码加我 拉你入群

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

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

2005-7-10 08:26:00

以下是对楼主程序的少许“改进”,在EViews5.1下通过。

'设定工作文件的区间长度,!t=10不到一分钟,!t=14约14分钟,!t增加1决不止增加一分钟 !t=14 !track = 0.90 create abc u 1 !t '为工作变量赋初始值 series markt = 2*@round(rnd) - 1 stom(markt,vecmarkt) scalar pb=2*!track*!t - !t group success rowvector(!t) strat !i=0 '设定循环 for !v1 = -1 to 1 step 1 for !v2 = -1 to 1 step 1 for !v3 = -1 to 1 step 1 for !v4 = -1 to 1 step 1 for !v5 = -1 to 1 step 1 for !v6 = -1 to 1 step 1 for !v7 = -1 to 1 step 1 for !v8 = -1 to 1 step 1 for !v9 = -1 to 1 step 1 for !v10 = -1 to 1 step 1 for !v11 = -1 to 1 step 1 for !v12 = -1 to 1 step 1 for !v13 = -1 to 1 step 1 for !v14 = -1 to 1 step 1 'for !v15 = -1 to 1 step 1 'for !v16 = -1 to 1 step 1 'for !v17 = -1 to 1 step 1 'for !v18 = -1 to 1 step 1 'for !v19 = -1 to 1 step 1 'for !v20 = -1 to 1 step 1

'循环体开始 for !pos = 1 to !t strat(!pos) = !v{!pos} next scalar ergeb = @inner(strat,vecmarkt)

if ergeb >= pb then !i = !i + 1 series s!i mtos(strat, s!i) success.add s!i endif '循环体结束

'next '20 'next '19 'next '18 'next '17 'next '16 'next '15 next '14 next '13 next '12 next '11 next '10 next '9 next '8 next '7 next '6 next '5 next '4 next '3 next '2 next '1 '展示处理结果 freeze(strattable) success.table

'save abc.wf1

二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群