全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2269 3
2010-07-05
现有如下的数据集:
obsclose  MA   own   buy  sellmoney
1 99.981000000000100
2 104.391000000000100
3 109.131000000000100
4 114.551000000000100
5 120.25109.66110100
6 125.27114.718100104.1746
7 125.28118.896100104.183
8 126.45122.36100105.1559
9 127.61124.972100106.1206
10 128.84126.69100107.1435
11 130.14127.664100108.2245
12 131.44128.896100109.3056

              ……
本文感兴趣的是:采用移动平均(MA)规则可以战胜市场吗?上述数据集中,own表示该交易日收盘后是否还持有股票,1表示持有,0表示不持有;buy和sell分别表示买入和卖出,1表示行动,0表示不行动。特别要加以说明的是。前四天的均价这里是用1000000来表示。
现在,要生成每一天的资金市值。上例中,是考虑5天的均线。当obs<5时,money=100(初始投资规模);
当obs>=5时,又分为以下几种情况:
1,如果当天买入,则该交易日的资金量等于上一交易日的资金量;
2,如果当日卖出,则该交易日的资金量等于上一交易日的资金量乘以今日和昨日的价格比;
3,如果当日不操作,并且上一交易日收盘时空仓,则今日的资金量等于上一交易日的资金量;
4,如果当日不操作,并且上一交易日收盘时持仓,则今日的资金量等于上一交易日的资金量乘以今日和昨日的价格比。
综上,编程过程如下:
data ……;
if obs<5 then money=100;
if obs>=5 and buy=1 then money=lag(money);
if obs>=5 and sell=1 then money=lag(money)*close/lag(close);
if obs>=5 and buy=0 and sell=0 and lag(own)=1 then money=lag(money)*close/lag(close);
if obs>=5 and buy=0 and sell=0 and lag(own)=0 then money=lag(money);
run;
可是,这样得到的结果却是:money的前四个观测值为100,随后的所有观测值均是缺失的。
请问,正确的程序应该是怎样的?
恳请论坛里的高手能帮小弟解决这个问题,谢谢!
二维码

扫码加我 拉你入群

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

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

全部回复
2010-7-5 01:48:02
caidalangzi 发表于 2010-7-5 00:48
现有如下类型的数据集:
A     B     C
1     1      100
1     2       200
2     1      200
2     2      400
上面的数据集中,A B都是已知的,现在要分情况生成数据C。C的初始值是已知的,即C的第一个观测值=100,现在要做如下的工作:
1,当B(n)=2时,C(n)=2*C(n-1);
2,当B(n)=1时,C(n)=C(n-1)。
如果进行如下的编程:
data ……;
if obs=1 then c=100;
if obs>1 and b=2 then c=2*lag(c);
if obs>1 and b=1 then c=lag(c);
run;
这样运行的结果是:
A     B      C
1     1      100
1      2     .
2     1      .
2      2     .
请问:正确的程序应该是怎样的?
素闻论坛SAS高手云集,特前来请教,希望能有大侠帮小弟解决这个困惑!谢谢!
Hope this is what you want.
data t;
input A     B     C    ;
clag=lag(c);
if b=1 then c2=clag;
else c2=2*clag;
cards;
1     1      100
1     2       200
2     1      200
2     2      400
;

proc print; run;
**************************************;
  Obs    A    B     C     clag     c2

   1     1    1    100       .      .
   2     1    2    200     100    200
   3     2    1    200     200    200
   4     2    2    400     200    400
二维码

扫码加我 拉你入群

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

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

2010-7-5 08:27:39
2# bobguy
谢谢!不过可能你没有看清楚我的说明:
一开始只知道C的第一个观测值,现在要根据B的情况生成新的观测值C,因为C包括了其自身的滞后值,因此这个就是按顺序来生成C的问题。我猜理论上的操作应该是,首先根据C的观测序号(如obs=1),然后根据B的情况来得到C的值,然后再跳到C的下一个观测(obs=2)来生成C,并以此类推。总之,就是要一个一个生成变量C,因为新产生的变量C在某些情况下和其滞后值有关。
谢谢您的关注!
二维码

扫码加我 拉你入群

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

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

2010-7-5 08:38:53
data a;
    c=100;
    do a=1 to 2;
       do b=1 to 2;
              if b=2 then c=2*c;
                  output;
           end;
        end;
run;
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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