合并具有不同数量观察值的时间序列,其中变量具有相同的名称(SAS)

Merging time series with different number of observations where variables have the same name (SAS)

我有一堆时间序列数据(sas 文件),我喜欢将它们合并/组合成一个更大的 table(我对 SAS 还很陌生)。

  1. 文件名: cq_ts_SYMBOL,其中SYMBOL是每个文件各自的符号

  2. 结构如下:

cq_ts_AAA.sas7bdat: 文件 1

SYMBOL   DATE        TIME         BID     ASK      MID
AAA      20100101    9:30:00      10.375  10.4      .
AAA      20100101    9:31:00      10.38   10.4      .
.
.
AAA      20150101    15:59:00     15      15.1      .

cq_ts_BBB.sas7bdat: 文件 2

SYMBOL   DATE        TIME         BID     ASK      MID
BBB      20120101    9:30:00      12.375  12.4      .
BBB      20120102    9:31:00      12.38   12.4      .
.
.
BBB      20170101    15:59:00     20      20.1      .

主要特征: - 它们具有相同的变量名 - 他们有不同数量的观察 - 它们都保存在同一个文件夹中

所以我想做的是: - 创建3个tables: BID-table, ASK-table, Mid-table,结构如下,即for bid-table, cq_ts_bid.sas7bdat:

DATE        TIME         AAA     BBB     ...
20100101    9:30:00      10.375   .
20100102    9:31:00      10.38    .
.
.
20120101    9:30:00      9.375  12.375
20120102    9:31:00      9.38   12.38
.
.
20150101    15:59:00     15      17
.
.
20170101    15:59:00     .       20

对于 2 个股票时间序列来说并不难,但是,我想知道是否有可能执行以下操作:

  1. 从数据集 cq_ts_AAA 获取 DATE TIME BID 并将 BID 重命名为 AAA(从符号中的值?这有意义吗?或从文件名中获取名称)。
  2. 对 cq_ts_BBB 执行相同的操作。
  3. 其实就是循环遍历文件夹,得到文件的个数和文件名(这部分我得到的多多少少,见下文)。
  4. 合并 cq_ts_BBB 和 cq_ts_BBB 日期时间为 AAA(AAA 的前出价)BBB(BBB 的前出价),用于文件夹中的所有文件。
  5. 为 BID 执行此操作,然后为 ASK 执行此操作,最后为 MID(实际上我无法从出价和要价中获取中点变量(即 mid= (bid + ask) / 2;)只是给了我“.”在创建文件时的前面的数据步骤中)。

我认为一个宏首先获取每个文件然后重命名(这一步应该在什么时候进行?)并将它们合并在一起 - 就像一个双循环。

这里是重命名和合并部分:

data ALDW_short (rename=(iprice = ALDW));
     set output.cq_ts_aldw
retain date time ALJ;
run;

data ALJ_short (rename= (iprice = ALJ));
set output.cq_ts_alj;
retain date time datetime ALJ;
run;

data ALDW_ALJ_merged (keep= date itime ALDW ALJ);
    merge ALDW_short ALJ_short;
    by datetime;
run;

这是遍历文件夹并获取名称列表的部分:

proc contents data = output._all_ out = outputcont(keep = memname) noprint;
run;

proc sort data = outputcont nodupkey;
by memname;
run;

data _null_;
set outputcont end = last;
by memname;
i+1;
call symputx('name'||trim(left(put(i,8.))),memname);
if last then call symputx('count',i);
run;

从文件名中提取符号(以及如何?它们具有不同的长度)或仅从变量 SYMBOL 中提取符号(以及如何获得一个值来重命名我的列?)是否有意义?

不知怎么的,我很难改变列的顺序,即。我尝试保留和格式化。

看起来您可以使用 PROC TRANSPOSE 轻松地做到这一点。将您的数据集合并为一个数据集。

data all ;
  set set output.cq_ts_: ;
  by date time;
run;

然后对每个源 variables/target 表使用 PROC TRANSPOSE。

proc transpose data=all out=bid ;
   by date time ;
   id symbol; 
   var bid;
run;

根据您的示例数据,

的 MID 公式
mid = (bid + ask)/2 ;

应该可以。如果您获得了所有缺失值,您很可能会将赋值语句放在 SET 或 INPUT 语句之前。换句话说,您正在尝试使用尚未读入的值进行计算。