楼主: 等风来撒
1389 9

条件语句问题,求大神.... [推广有奖]

  • 0关注
  • 0粉丝

博士生

40%

还不是VIP/贵宾

-

威望
0
论坛币
490 个
通用积分
35.4021
学术水平
0 点
热心指数
5 点
信用等级
0 点
经验
2497 点
帖子
220
精华
0
在线时间
233 小时
注册时间
2014-1-5
最后登录
2025-7-23

楼主
等风来撒 发表于 2014-7-14 15:24:06 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有如下类型数据....
a1   a2   a3   a4   a5   a6     b1   b2   b3   b4  b5   b6
3     6     4     5    7     4      0     1     0     1     1     0
6     7     9     9     7    4      1     0     1     1     0     0
3     9     6     5     6     3     0     0     0     0     1     0
5     7     5     3     5     2     1     1     0     0     0     1
4     6     5     6     6     7     0     0     1    0     1     0
7     9     4     9     4     7     0     1     0     1     0     0
2     5     2     4     2     8     0     0     0     0     0     1



其中a是价格,b是信号,只有0-1,1表示买入,0表示不操作

我想做的是,当bi为1时,生成一个ci,里面为ai向后10期的收益率,否则就是0,

例如,第一行里b2为1时,那么c2就等于[a2(第10行)-a2(第1行)]/a2(第一行)
请问如何操作......由于ai和bi有几百个.所以只列举一部分.....

二维码

扫码加我 拉你入群

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

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

关键词:如何操作 收益率

这个...........

沙发
pobel 在职认证  发表于 2014-7-14 16:00:52
一个问题:对于第一行,它的“向后10期”是第10行,还是第11行?

如果是第10行,楼主可以参考下面的代码:

%let num=6;
data wanted;
    set test nobs=nobs;
        array a(&num); array b(&num); array c(&num); array tmp(&num);
        if _N_<=nobs-9 then do;
        set test(firstobs=10 keep=a1-a&num rename=(a1-a&num=tmp1-tmp&num));
                do i=1 to &num;
                   c(i)=b(i)*((tmp(i)-a(i))/a(i));
                end;
        end;
        drop tmp: i;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jingju11 + 5 + 5 + 5 精彩帖子

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

藤椅
ilovekate 发表于 2014-7-14 16:09:08
data test1;set test1;retain id; id+1;run;
data test2;set test1; if _N_ >9;retain id;id+1;run;
proc sort data=test1;by id;run; proc sort data=test2;by id;run;
data test3(drop=id i lag1-lag6);merge test1 test2(keep=id a1-a6 rename=(a1=lag1 a2=lag2 a3=lag3 a4=lag4 a5=lag5 a6=lag6));by id;
array lag{*} lag1-lag6;
array a{*} a1-a6;
array b{*} b1-b6;
array c{*} c1-c6;
do i=1 to 6;
if b{i}=1 then c{i}=(lag{i}-a{i} )/a{i};
else c{i}=.;
end;
run;

板凳
等风来撒 发表于 2014-7-14 16:14:32
pobel 发表于 2014-7-14 16:00
一个问题:对于第一行,它的“向后10期”是第10行,还是第11行?

如果是第10行,楼主可以参考下面的代码 ...
定义不了数组....他显示
ERROR: 不能用以下名称定义数组,IF、SELECT、SUBSTR、INPUT、PUT、WHEN、WHILE、UNTIL 和 RETURN。


还有一个小问题.....我的变量名是a1 a3 a5 a7.....我用by2循环咋不行呢 - -?

报纸
ilovekate 发表于 2014-7-14 16:27:38
pobel 发表于 2014-7-14 16:00
一个问题:对于第一行,它的“向后10期”是第10行,还是第11行?

如果是第10行,楼主可以参考下面的代码 ...
我试了你的代码发现,最后9行数字不对。

地板
等风来撒 发表于 2014-7-14 16:33:05
ilovekate 发表于 2014-7-14 16:27
我试了你的代码发现,最后9行数字不对。
是不是我变量名有问题....还有,我数据集里面有空值,为啥我运行不了

7
pobel 在职认证  发表于 2014-7-14 16:34:49
等风来撒 发表于 2014-7-14 16:14
定义不了数组....他显示
ERROR: 不能用以下名称定义数组,IF、SELECT、SUBSTR、INPUT、PUT、WHEN、WHILE ...
数组的名字不能是error里列的那几个。

如果是a1 a3 a5 a7 ...,那定义数组应该是array a(6) a1 a3 a5 a7 a9 a11;
如果这些变量在数据集中的位置是连续的,那可以用array a(6) a1--a11.

8
ilovekate 发表于 2014-7-14 16:36:20
data test2;
set test1;
array lag{*} lag1-lag6;
array a{*} a1-a6;
array b{*} b1-b6;
array c{*} c1-c6;
do i=1 to 6;
b{i}=lag9(b{i});lag{i}=lag9(b{i});
if b{i}=1 then c{i}=(a{i}-lag{i} )/lag{i};
else c{i}=.;
end;
run;

9
pobel 在职认证  发表于 2014-7-14 16:37:14
ilovekate 发表于 2014-7-14 16:27
我试了你的代码发现,最后9行数字不对。
最后9行应该不会有“向后10期”吧。

10
ilovekate 发表于 2014-7-14 16:38:07
等风来撒 发表于 2014-7-14 16:33
是不是我变量名有问题....还有,我数据集里面有空值,为啥我运行不了
set 会把最后(9行)的temp用最后一行的值补充

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-21 14:43