楼主: cskiller
4249 11

[求助]大侠,帮我用宏实现这段程序。 [推广有奖]

  • 0关注
  • 3粉丝

低调

已卖:1278份资源

副教授

8%

还不是VIP/贵宾

-

威望
0
论坛币
30536 个
通用积分
11.8479
学术水平
2 点
热心指数
4 点
信用等级
1 点
经验
13963 点
帖子
473
精华
0
在线时间
891 小时
注册时间
2006-4-17
最后登录
2022-2-28

楼主
cskiller 发表于 2008-3-18 13:09:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币


data in_nlp4(type=est);/*用inest产生数据集*/
input _type_ $8. x1-x8 _rhs_;
cards;
parms    .125  .125  .125  .125  .125  .125  .125  .125  .
lowerbd  0  0  0  0  0  0  0  0  .
upperbd  1  1  1  1  1  1  1  1  .
eq       1  1  1  1  1  1  1  1  1
ge       0.0246951391  0.0127497123  0.0124444582 0.0079714507  0.0216395959  0.0067692931   0.0263324389   0.0143749164  0.019
;

------------------------
data quad;
set cov_out4 in_nlp4;/*cov为变量协方差矩阵*/
proc nlp  inquad=quad outest=nlp_out6;
min;
parms x1-x8;
run;

--------------------------------------------------------

问题:此为用MV模型求解投资组合的一段程序。见(朱老师书籍P179)。这段程序只能一次求解一个期望值。我的目的是想建立一个宏函数,可以处理一组期望收益,如:0.008,0.01,0.012.然后得到对应的目标函数序列。

我正在学习SAS中,自己也在调试。

希望有大侠帮我指点下。。。。

个人奖励1000论坛币。不多,只是一点劳动补偿。

二维码

扫码加我 拉你入群

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

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

关键词:1000论坛币 outest parms Input 协方差矩阵 程序 大侠

回帖推荐

wolfcrying 发表于11楼  查看完整内容

你的加号"+"号好象写错了,写成全角加号"+",或者就是空格是全角空格。如果还不行,可以试一下%let i=%sysfunc(sum(&i.,&increment.));

wolfcrying 发表于4楼  查看完整内容

这个不难,首先你在宏定义外面建好你要参数表,ge行的_rhs_可以留空.然后这样.%macro main(start,end,increment);   %let i=&start.;   %do  %while(&i.<=&end.);data temp; set quad; if _type_=’ge’ then _rhs_=&i.; run;proc nlp inquad=quad outest=nlp_out; min; parms x1-x8;run;data function;  ge=&i.;set nlp_out(where=(_type_=’OBJ’) keep=v ...

本帖被以下文库推荐

强悍的人生不需要解释!

沙发
wolfcrying 发表于 2008-3-18 16:40:00

你想变动哪个数, parm 吗? 我对MV模型不熟悉,不太清楚你的问题的背景,否则我可以帮你用宏实现的

藤椅
cskiller 发表于 2008-3-18 17:18:00

不好意思  是我没有说清楚。

我想变动的参数是 ge 的约束条件,以及最后非线性后处理得到最优化的值。

如不是用宏处理的话,我要这样计算每一个值,比较烦琐:

data quad1;

set quad;

if _type_ = "ge" then _rhs_ =0.02 ;(上面的是0.019)

proc nlp inquad=quad1 outset=nlp_out7;

min;

parms x1-x8;

run;

然后又要从nlp-out7提取目标函数。

我的想法其实就是直接建立宏,或者其他可行的方法。一次计算所有的值,得到相应的目标值。

强悍的人生不需要解释!

板凳
wolfcrying 发表于 2008-3-18 17:38:00

这个不难,首先你在宏定义外面建好你要参数表,ge行的_rhs_可以留空.

然后这样.

%macro main(start,end,increment);

   %let i=&start.;

   %do  %while(&i.<=&end.);

data temp;

 set quad;

 if _type_=’ge’ then _rhs_=&i.;

 run;

proc nlp inquad=quad outest=nlp_out;

 min;

 parms x1-x8;

run;

data function;  ge=&i.;

set nlp_out(where=(_type_=’OBJ’) keep=value);

 keep ge value; run;

/*就是取出目标函数值,不一定是OBJ,可能是其他,具体可以查一查

value 就是函数值*/;

 

%if &i.=&start. %then %do;  data base; set function;run;                            

                  %end;

%else do;  proc append base=base data= function force;run;

%let I = %eval(&i.+&increment.);

%end;

%mend;

   %main(0.006,0.02,0.002);

 

 

 

 

 

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 10 精彩帖子

总评分: 经验 + 3  论坛币 + 10   查看全部评分

报纸
cskiller 发表于 2008-3-18 23:29:00
哈哈。

谢谢~~主要

明天我把论坛币汇到你帐户谢谢啊~~~

data base;

set function;run; 与proc append base=base data= function force;run;

有什么作用,我感觉是不是重复了??我对sas是正处于探索阶段,用它做毕业论文模型数据处理。

[此贴子已经被作者于2008-3-18 23:45:59编辑过]

强悍的人生不需要解释!

地板
wolfcrying 发表于 2008-3-19 01:06:00

不重复的,第一步是初始化,如果在base不存在的时候append,结果没错,但是log会出error message

7
cskiller 发表于 2008-3-19 08:30:00
哦~~知道了。怎么现在转不了帐了 奇怪。还有其他方式吗?我问问版主
强悍的人生不需要解释!

8
shj981222 发表于 2008-3-19 09:28:00
看不明白
To be rong is fine, but to stay rong is unforgivable.

9
macroshirs 发表于 2008-3-19 13:37:00

就是C语言函数一样

[此贴子已经被作者于2008-3-19 13:39:33编辑过]

10
cskiller 发表于 2008-3-19 13:54:00

%macro nlp(start,end,increment);
%let i = &start.;/*定义宏变量*/
%do %while (&i.<= &end.);/*定义循环体*/
data quad1;
set quad;
if _type_ ="ge" then _rhs_ = &i.;/*修改期望值*/
proc nlp  inquad=quad1 outest=nlp_out6 noprint;/*求最优组合*/
min;
parms x1-x8;
run;

data function;/*提取期望和相应风险值*/
ge=&i.;
set nlp_out6(where=( _type_ = 'PARMS'));
keep ge  _RHS_;
run;

%if &i. = &start. %then %do;/*数据初始化*/
data base;set function;run;
%end;
%else %do;/*追加数据集*/
proc append base =base data=function force;
run;
%end;
%let i=%eval(&i.+ &increment.);/*自动增加变量*/
%end;
%mend nlp;
%nlp(0.008,0.026,0.002);
run;

----------------------------

大侠你好,这是我根据你的思路做的宏,但运行之后只得出一个结果。然后就是错误提示:

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
       operand is required. The condition was: 0.008+ 0.002
ERROR: The macro NLP will stop executing.--

怎么会是操作符不对呢??

强悍的人生不需要解释!

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

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