2017-06-14 88 views
0

我嘗試使用下面的代碼做計算的累積回報():SAS如果else和LAG跳過一行

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 +滯後(CUM_RETURN),但似乎現在正在做CUM_RETURN = return_sec +滯後(滯後(CUM_RETURN))。

我知道你不能直接在if和else條件中寫滯後,這就是爲什麼我在if else條件之前使用LAG變量的原因。但它似乎仍然以一種不可思議的方式工作...

此外,如果我刪除if語句,做

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

CUM_RETURN的整個立柱稍稍變空...

回答

1

我不認爲你需要LAG_CUMRETURN,你有CUMRETURNretain

(扔出去的其他噪聲)

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

cumreturn = sum(cumreturn,return_sec); 

這應該得到你想要的東西。 SUM()函數將缺失值視爲0,因此對於每個安全性的第一條記錄,CUMRETURN將保持爲0.

+0

但是爲什麼使用LAG會出錯? –

+0

,因爲你不需要它。 'retain'語句給你一個新變量的滯後值。您應該閱讀滯後函數如何工作的文檔。這不像你想象的那麼直截了當。 – DomPazz

+0

但是我的方式使用滯後來計算回報正確,但? return_sec =(MIDPRICE - LAG_MIDPRICE)/ LAG_MIDPRICE; –