所以我有一个交易数据的数据集已经与大宗交易合并,这些交易基本上只是非常大的交易,一次性发生并由某个大型金融机构执行。
我试图看看在大宗交易之前和之后的几分钟内,特别是在大宗交易后,证券的价格如何变动。
数据有一个名为Date_Time的变量,它具有日期和时间,格式如下: 08FEB03:03:20:00(将于2003年2月8日上午3:20:00)。当交易被归类为大宗交易时,它还有一个虚拟变量,它表示" Block"如果它是一个区块交易,如果不是大宗交易就会丢失。
我想做的是找到每个区块交易并创建一个在区块交易之前和之后有时间间隔的变量。例如,如果大宗交易发生在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变量。数据集中存在大量的块交易,我想弄清楚如何创建一个变量,该变量在块交易和块交易之前和之后发生的交易之间的Date_Time存在差异。
我尝试用proc扩展做一些事情,但我似乎无法解决这个问题。对不起,如果这很容易,但我是SAS的全新。
答案 0 :(得分:1)
解决这个问题的相当直接的方法可能是将其分成几部分。
首先,拥有一个只有您的大宗交易的数据集。我假设你有一些其他的变量来识别交易,而不仅仅是日期时间(因为如果我理解正确,交易可以同时下降到微秒)?如果没有,那么我假设你知道如何回到原始数据集和/或你可以创建一个唯一的ID。让我们说这叫做StockID。
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;