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的整個立柱稍稍變空...
但是爲什麼使用LAG會出錯? –
,因爲你不需要它。 'retain'語句給你一個新變量的滯後值。您應該閱讀滯後函數如何工作的文檔。這不像你想象的那麼直截了當。 – DomPazz
但是我的方式使用滯後來計算回報正確,但? return_sec =(MIDPRICE - LAG_MIDPRICE)/ LAG_MIDPRICE; –