2

我正在计算金融时间序列数据的一些间隔统计信息(例如一分钟间隔的标准偏差)。我的代码设法为包含数据的所有间隔获取结果,但对于不包含时间序列中任何观察的间隔,我想插入一个空行以保持时间戳的一致性。

例如,如果在 10:00 到 10:01、10:02 到 10:03 之间有数据,但不是 10:01 到 10:02,我的输出将是:

10:01 stat1 stat2 stat3
10:03 stat1 stat2 stat3

如果结果可能是理想的(我希望一些值为0,一些缺少'。'):

10:01 stat1 stat2 stat3
10:02 0     0     .
10:03 stat1 stat2 stat3

我做了什么:

 data v_temp/view = v_temp;
    set &taq_ds;
    where TIME_M between &start_time and &end_time;
    INTV = hms(00, ceil(TIME_M/'00:01:00't),00); *create one minute interval;
    format INTV tod.; *format hh:mm:ss;
 run; 

 proc means data = sorted noprint;
    by SYM_ROOT DATE INTV;
    var PRICE;
    weight SIZE;
    output 
    out=oneMinStats(drop=_TYPE_ _FREQ_) 
    n=NTRADES  mean=VWAP sumwgt=SUMSHS max=HI min=LO std=SIGMAPRC
    idgroup(max(TIME_M) last out(price size ex time_m)=LASTTRD LASTSIZE LASTEX LASTTIME);
 run;

对于一些不活跃的股票,有很多这样的缺口。生成这些填充行的有效方法是什么?

4

1 回答 1

2

如果您已SAS:ETS获得许可,PROC EXPAND则在时间序列中添加空白行是一个不错的选择。这是一个非常简短的示例:

data mydata;
input timevar stat1 stat2 stat3;
format timevar TIME5.;
informat timevar HHMMSS5.;
datalines;
10:01 1 3 5
10:03 2 4 6
;;;;
run;

proc expand data=mydata out=mydata_exp from=minute to=minute observed=beginning method=none;
id timevar;
run;

如果您想执行内插/外插或类似的操作,文档会提供更多详细信息。重要的选项是 from=minute、observed=beginning、method=none(无外推或插值)和 id(标识时间变量)。

如果您没有 ETS,那么一个数据步骤就足够了。您可以合并到已知数据集,也可以添加自己的行;数据集的大小在某种程度上决定了哪个更容易。这是合并变体。在数据步变体中添加您自己的行类似于我创建额外行的方式。

*Select the maximum time available.;
proc sql noprint;
select max(timevar) into :endtime from mydata;
quit;

*Create the empty dataset with just times;
data mydata_tomerge;
set mydata_tomerge(obs=1);
do timevar = timevar to &endtime by 60; *by 60 = minutes!;
output;
end;
keep timevar;
run;
*Now merge the one with all the times to the one with all the data!;
data mydata_fin;
merge mydata_tomerge(in=a) mydata;
by timevar;
if a;
run;
于 2013-07-19T17:08:38.340 回答