SAS如果Else和LAG跳过一排

时间:2017-06-14 19:03:56

标签: sas

我试图使用以下代码来计算累积回报():

retain MIDPRICE CUM_RETURN; 
LAG_MIDPRICE = lag(MIDPRICE);
LAG_CUMRETURN = lag(CUM_RETURN);   
return_sec = (MIDPRICE - LAG_MIDPRICE) / LAG_MIDPRICE; 
if first.symbol then CUM_RETURN = 0;
else CUM_RETURN  = return_sec + LAG_CUMRETURN;

但是,使用if和else语句,SAS正在跳过一行:

+--------+----------+------+--------------+--------------+-------------+----------+----------------+
| SYMBOL |   DATE   | time |  CUM_RETURN  |  return_sec  |    RMIN     |  one_M   | MK_RETURN_RATE |
+--------+----------+------+--------------+--------------+-------------+----------+----------------+
| A      | 20130108 |    1 | 0            |              | 0.00023571  | 1.90E-11 | 3.130243764    |
| A      | 20130108 |    2 |              | -0.00117855  | 0.000235988 | 1.90E-11 | 0.000274509    |
| A      | 20130108 |    3 | 0.000471976  | 0.000471976  | 0.000235877 | 1.90E-11 | 6.86083E-05    |
| A      | 20130108 |    4 |              | -0.000471754 | 0.000235988 | 1.90E-11 | 6.86036E-05    |
| A      | 20130108 |    5 | -0.000471976 | -0.000943953 | 0.000236211 | 1.90E-11 | 6.85989E-05    |
| A      | 20130108 |    6 |              | -0.002362112 | 0.000236771 | 1.90E-11 | 0              |
| A      | 20130108 |    7 | 0.000711876  | 0.001183852  | 0.000236491 | 1.90E-11 | -0.000137188   |
| A      | 20130108 |    8 |              | 0.001300698  | 0.000236183 | 1.90E-11 | 0              |
| A      | 20130108 |    9 | 0.000711876  | 0            | 0.000236183 | 1.90E-11 | 0              |
| A      | 20130108 |   10 |              | 0            | 0.000236183 | 1.90E-11 | 0.000137207    |
| A      | 20130108 |   11 | 0.000711876  | 0            | 0.000236183 | 1.90E-11 | 0.000137188    |
| A      | 20130108 |   12 |              | 0.000590458  | 0.000236044 | 1.90E-11 | 6.85848E-05    |
| A      | 20130108 |   13 | 0.000711876  | 0            | 0.000236044 | 1.90E-11 | 0              |
| A      | 20130108 |   14 |              | -0.000118022 | 0.000236072 | 1.90E-11 | -0.0003429     |
| A      | 20130108 |   15 | 0.000711876  | 0            | 0.000236072 | 1.90E-11 | -0.000068604   |
+--------+----------+------+--------------+--------------+-------------+----------+----------------+

正如你所看到的,我想要CUM_RETURN = return_sec + lag(CUM_RETURN),但现在它似乎在做CUM_RETURN = return_sec + lag(滞后(CUM_RETURN))。

我知道你不能直接在if和else条件下写滞后的问题,这就是我在if else条件之前使用LAG变量的原因。但它似乎仍然以一种奇怪的方式工作......

此外,如果我删除if语句并执行

if first.symbol then CUM_RETURN = 0;
CUM_RETURN  = return_sec + LAG_CUMRETURN;

CUM_RETURN的整个列都变空了......

1 个答案:

答案 0 :(得分:1)

我认为您不需要LAG_CUMRETURNCUMRETURN中有retain

(抛弃其他噪音)

retain cumreturn;
if first.symbol then cumreturn = 0;

cumreturn = sum(cumreturn,return_sec);

那应该能得到你想要的东西。 SUM()函数将缺失值视为0,因此对于每个安全性的第一条记录,CUMRETURN将保持为0。