- proc expand
- data=trade_day_all out=rolling_mean;
- convert turnover=turnover_1 / transformout=(movave 6 );
- convert num=obs_1 / transformout=(movsum 6); /*num是全一列,用来记录使用的观测值个数*/
- by stockcode;
- run;
因为存在股票停牌的问题,所以在原始数据的基础上做了笛卡尔积
比如股票1在04年6月30日停牌,则这一天股票1有一个除了股票代码外全空的观测值。
我希望实现的效果是:
如果滚动窗口(6个交易日)内有n个缺失的观测值,则用剩下的6-n个观测值计算滚动平均,并且通过对全一列求和(全一列在停牌的那一天也是缺失的)记录使用的观测值个数6-n.
但是实际运行结果很奇怪,当窗口里包含缺失值时,滚动平均的结果既不是6-n计算出来的,也不是用扩大窗口直到观测值等于6计算出来的。在调试过程中发现了如下结果
这是把窗口长度改为2之后的计算结果,在这个停牌的第二天居然算出了结果,而滚动窗口为2时这一天的窗口内应该只有两个缺失值。
sas帮助文档里面提到了nomiss命令,并没有起到作用
- proc expand
- data=trade_day_all out=rolling_mean;
- convert turnover=turnover_1 / transformout=(nomiss movave 6 );
- convert num=obs/transformout=(movsum 6);/*num是全一列,用来记录使用的观测值个数*/
- convert num=obs_1 / transformout=(nomiss movsum 6);
- by stockcode;
- run;
数据的结构如下