因此,我有一个数据集,其中的交易数据已经与大宗交易合并了,这些交易本质上就是非常大的交易,所有交易都是同时发生的,并由某种大型金融机构执行。
我正试图了解证券价格在大宗交易之后的走势,特别是在大宗交易前后的几分钟内。
数据有一个名为Date_Time的变量,它有日期和时间,格式如下: 08FEB03: 03:20:00 (2003年2月8日凌晨3:20)。当一项交易被归类为整笔交易时,它也有一个虚拟变量,如果是整笔交易,则表示“阻止”,如果不是整笔交易,则表示“阻止”。
我想要做的是找到每一个区块交易,并创建一个变量,它的时间间隔在区块交易之后和之前。例如,如果一个大宗交易发生在2010年2月8日凌晨3:20,那么我想看看之前执行的交易的价格(假设时间是3:16和时间3:19,如果这是之前的交易),也就是在紧接之后的交易(比如3:21和3:23,如果这些是之后的交易)。现在我只试着每隔30分钟看一次。因此,我希望我的数据看起来像这样
Date_Time|Block|Price|Time_From_Block_Trade
08FEB08:03:16:00 "." 113.01 -4
08FEB08:03:19:00 "." 113.02 -1
08FEB08:03:20:00 "Block" 113.02 0
08FEB08:03:21:00 "." 113.07 1
08FEB08:03:23:00 "." 113.09 3除了我不知道如何创建Time_From_Block_Trade变量之外,我什么都有。dataset中有很多块交易,我想知道如何创建一个变量,该变量的Date_Time值与块交易之前和之后发生的交易之间的差异。
我试着用proc展开来做一些事情,但我似乎想不出答案。对不起,如果这真的很容易,但我是全新的SAS。
发布于 2014-06-18 22:24:01
要解决这个问题,最简单的方法可能是将其分成几个部分。
首先,有一个数据集,只是你的大宗交易。我假设您有一些其他的变量可以明确地标识交易,而不仅仅是日期时间(如果我正确理解的话,交易可以同时进行到微秒)?如果不是,那么我假设您知道如何返回原始数据集和/或您可以创建一个唯一的ID。
data blocks;
set trades;
if block=1;
keep stockID date_time block_id;
rename date_time=block_time;
block_id+1;
run;现在将其合并回原始数据集。
proc sql;
create table block_trades as
select t.*, b.block_id, t.date_time - b.block_time as time_from_block_trade
from blocks b
left join trades t
on b.stockID=t.stockID
and abs(b.block_time -t.date_time) le 30
order by b.block_id, t.date_time;
quit;现在,这应该是一个容易分析的数据集,只有有用的行,一个按组分析的block_id (或类),以及为您计算的块的时间。
对于任何其他复制此数据集的人,这都可以使用这个初始数据集:
data trades;
call streaminit(7);
do stockID=1 to 5;
do date_time = '01JAN2014:10:00:00'dt to '01JAN2014:13:00:00'dt;
volume = 1000*rand('Uniform');
if volume > 999 then block=1;
else block=0;
output;
end;
end;
run;https://stackoverflow.com/questions/24295161
复制相似问题