2017-11-16 11 views
0

私はいくつかの株式を持っているデータセットを使って作業しています。私はその上にイベントを持つデータセットをマージしました。日付の周りにいくつかのウィンドウを作成

イベントスタディでは、ダミーとして機能し、ウィンドウを作成するいくつかの変数を作成したいと思います:-60〜-11日、-5〜-1日、アナウンスデー+ 1日+1。

  1. それは証券でなければならない(ウィンドウは銘柄間で引き継がれるべきではありません)
  2. 1つの告知/イベント日(ann_day)別のイベントのウィンドウを台無しにはならない重要: は2つのことです。

私は次のことを試してみましたが、それはちょうど私の窓を与えているし、別の株式や甘やかされて育った窓を考慮していません:

​​

いくつかの情報:発表日は dataset_fullが株式を持っているイベントです、日付、リターン、ボリューム1カレンダー/取引日に1行。 発表は株式、発表日と発表情報(発表ごとに1行) を持っているデータは、次のようになります。

Stock Date Ann_date flag_minus60_minus11 flag_minus5_minus1 flag_day0_day1 
A 1/01/2016   1 
A 2/01/2016   1 
A 3/01/2016    
A 4/01/2016 4/01/2016   1 
A 5/01/2016    1 
A 6/01/2016    
A 7/01/2016    
A 8/01/2016    
A 9/01/2016    
A 10/01/2016    
A 11/01/2016    
A 12/01/2016    
A 13/01/2016    
A 14/01/2016    
A 15/01/2016    
B 1/01/2016  1  
B 2/01/2016  1  
B 3/01/2016  1  
B 4/01/2016  1  
B 5/01/2016  1  
B 6/01/2016  1  
B 7/01/2016    
B 8/01/2016    
B 9/01/2016    
B 10/01/2016    
B 11/01/2016   1 
B 12/01/2016   1 
B 13/01/2016   1 
B 14/01/2016   1 
B 15/01/2016   1 
B 16/01/2016 16/01/2016   1 
B 17/01/2016    1 
B 18/01/2016   1 
B 19/01/2016   1 
B 20/01/2016 20/01/2016   1 
B 21/01/2016    1 
B 22/01/2016    
B 23/01/2016    
B 24/01/2016    
B 25/01/2016    

enter image description here

答えて

1

マボ:ここ

は、いくつかのサンプルデータとSQLです。あなたが出力を調べるとき、私はあなたが「腐敗した」情報を見ることを前提としています - それは、フラギングの時間枠内に複数の将来のアナウンスがある日付です。

イベント日付に関する取引日のフラグ付けの問題は、内部結合です。計算されている各フラグに対して内部結合を実行する必要があり、その内部結合を必要なものにするために取引データに結合したままにする必要があります。いくつかの時点で

data trading; 
    do group = 1 to 4; 
    do date = today()-1000 to today(); format date yymmdd10.; 
     output; 
    end; 
    end; 
run; 

data announcement; 
    do group = 1 to 4; 
    do date = today()-1000 to today(); format date yymmdd10.; 
     if ranuni(123) < 0.01 then output; 
    end; 
    end; 
run; 

proc sql; 
    create table trading_pre_announce_flagged as 
    select 
    trading.* 
    , announcement.date as annouce_date 
    , case when P0.date is not null then 1 else . end as P0_flag label="Announcement was today or yesterday" 
    , case when P1.date is not null then 1 else . end as P1_flag label="Announcement in 1 to 5 days" 
    , case when P2.date is not null then 1 else . end as P2_flag label="Announcement in 11 to 60 days" 
    , case when P2.date is not null then P2.adate else . end as P2_date label="Date of Announcement in 11 to 60 days" format=yymmdd10. 

    from 
    trading 
    left join 
    announcement 
    on announcement.date = trading.date and announcement.group = trading.group 
    left join 
    (select trading.group, trading.date 
     from trading 
     inner join 
     announcement 
     on announcement.group = trading.group 
     and announcement.date - trading.date between -1 and 0 
    ) as P0 
    on P0.date = trading.date and P0.group = trading.group 
    left join 
    (select trading.group, trading.date 
     from trading 
     inner join 
     announcement 
     on announcement.group = trading.group 
     and announcement.date - trading.date between 1 and 5 
    ) as P1 
    on P1.date = trading.date and P1.group = trading.group 
    left join 
    (select trading.group, trading.date, announcement.date as adate 
     from trading 
     inner join 
     announcement 
     on announcement.group = trading.group 
     where announcement.date - trading.date between 11 and 60 
    ) as P2 
    on P2.date = trading.date and P2.group = trading.group 
    order 
    by trading.group, trading.date 
    ; 
quit; 

はOPが処理〜750社の企業と500の全体のイベントを述べた(ただし、それを見つけることができない)、およびSQL液が長く実行されているように見えたという。

代わりにDATAステップがあります。

500イベントは、グループと日付の配列を使用してルックアップのイベントを格納するのに十分な小さな基数です。ソートされたイベントのスマートインデックストラッキングを使用して、ルールを評価して条件フラグを適用するための最小限のスキャンを実行できます。例えば

data trading; 
    do group = 1 to 700; 
    do date = today()-1000 to today(); format date yymmdd10.; 
     output; 
    end; 
    end; 
run; 

data announcement; 
    do eventid = 1 to 500; 
    group = ceil(700*ranuni(123)); 
    date = (today()-1000) + ceil(1000*ranuni(123)); format date yymmdd10.; 
    if mod(eventid,20) = 1 then do; 
     output; 
     eventid+1; 
     date = date + 30 + floor(100*ranuni(123)); 
     output; 
     eventid+1; 
     date = date + 30 + floor(100*ranuni(123)); 
    end; 
    output; 
    end; 
run; 

proc sort data=announcement; 
    by group date; 
run; 

data _null_; 
    if 0 then set announcement nobs=nobs; 
    call symputx ('top', nobs+1); 
run; 

data marked_trading; 
    array e_group(0:&TOP) _temporary_; 
    array e_date (0:&TOP) _temporary_; 

    * load event array; 
    do _n_ = 1 by 1 until (last_announcement); 
    set announcement end=last_announcement; 
    e_group(_n_) = group; 
    e_date(_n_) = date; 

    eix0 = 1; 
    eix1 = 1; 
    end; 

    e_group(0) = 0; * sentinel; 
    e_group(_n_) = 1e9; *sentinel; 

    * evaluate flagging criteria for each trade group date; 
    do _n_ = 1 by 1 until (last_trading); 
    set trading end=last_trading; 
    by group; 
    if first.group then do; 
     * discover indices of events associated with the group; 
     do eix0 = eix0 by 1 while (e_group(eix0) < group); end; 
     do eix1 = eix0 by 1 while (e_group(eix1) = group); end; eix1 = eix1 - 1; 
     eix_group = e_group(eix0); 
    end; 

    p3_flag = .; p2_flag = .; p1_flag = .; 
    if group = eix_group then do; 
     * NOTE: bounds are evaluated only at loop initialization; 
     * evaluate events for flagging a trade; 
     do ix = eix0 to eix1; 
     days_to_event = e_date(ix) - date; 

     if not p3_flag then if 11 <= days_to_event <= 60 then p3_flag = 1; 
     if not p2_flag then if 1 <= days_to_event <= 5 then p2_flag = 1; 
     if not p1_flag then if -1 <= days_to_event <= 0 then p1_flag = 1; 

     if days_to_event <= -1 then eix0 = ix+1; * update when applicability exhausted; 
     end; 
    end; 

    output; 
    end; 

    keep group date p:; 

    stop; 
run; 
+0

はい、あなたはDataステップを使用することができます。 _n_ = 1では、イベント・グループをロードして2つの配列に日付を入れ、各取引行のすべてのイベントについてフラグ条件を評価します。 – Richard

関連する問題