Я провожу исследование событий и нуждаюсь в среднем значении доходности для получения ненормальной доходности. Окно моего теста [-60, -11] и окно события [-5, -1] с 0 в качестве даты объявления. Однако у меня есть несколько объявлений, которые могут испортить окно тестов и событий. Тем не менее, я хочу сохранить 50 дней окна теста производительности без изменений, поэтому, если в окне теста есть объявление, удалите этот день и увеличьте окно на 1.

Прямо сейчас я генерирую средние значения с помощью proc expand:

proc expand; by stock;
convert logreturn = avg_logreturn / METHOD = none   TRANSFORMOUT = (movave 60 lag 11); 

Запустить;

А затем вычтите среднее значение из фактической доходности.

Мой набор данных выглядит так (данные за 10 лет):

Stock   Date      Return    Announcement
AAA    01/01/10    0.05
AAA    02/01/10    0.04
AAA    03/01/10   -0.02      03/01/10     this one should be deleted as is spoils the coming announcement but still be counted as an announcement
AAA    04/01/10    0.01
AAA    05/01/10   -0.03       
AAA    06/01/10    0.05
AAA    07/01/10    0.04
AAA    08/01/10   -0.02      08/01/10  
AAA    09/01/10    0.01
AAA    10/01/10   -0.03
AAB    01/01/10    0.01

Др

Обычно для каждого объявления требуется окно от -60 до -11, где я вычисляю среднее значение. Длина должна оставаться такой же, но всегда, если в этом окне есть другое объявление, возврат не должен учитываться в этом среднем.

Идея проста, но реализация кажется сложной ...

0
MaBo88 15 Дек 2017 в 10:12

1 ответ

Лучший ответ

Предварительно обработайте данные для расширения.

  • Найдите запас / финики, которые нужно отбраковать
  • Создайте представление, исключающее отбракованные финики
  • Proc EXPAND

Образец кода:

data have;
  attrib 
    stock length=$3
    date  length=4 format=date9. informat=mmddyy8. 
    return length=8 format=6.2 
    announcement length=4 format=date9. informat=mmddyy8. 
  ;
  infile cards missover;
  input stock date return announcement;
datalines;
AAA    01/01/10    0.05
AAA    02/01/10    0.04
AAA    03/01/10   -0.02      03/01/10     this one should be deleted as is spoils the coming announcement but still be counted as an announcement
AAA    04/01/10    0.01
AAA    05/01/10   -0.03
AAA    06/01/10    0.05
AAA    07/01/10    0.04
AAA    08/01/10   -0.02      08/01/10  
AAA    09/01/10    0.01
AAA    10/01/10   -0.03
AAB    01/01/10    0.01
run;

%let CULL_GAP_LE_CRITERIA = 5 ;

data cull(keep=stock cull_date);
  set have;
  by stock date;

  retain cull_date;

  if first.stock then cull_date = .;

  if announcement then do;
    if cull_date then do;
      gap = intck('month', cull_date, announcement);
      if gap <= &CULL_GAP_LE_CRITERIA then
        OUTPUT;
    end;

    cull_date = announcement; * setup for culling this announcement as well;
    put cull_date=;
  end;
run;

data DATA_FOR_EXPAND / view=DATA_FOR_EXPAND;
  merge 
    have 
    cull(rename=cull_date=date in=culled)
  ; 
  by stock date;
  if not culled;
run;

if not culled удалит выбранную строку. Я думаю, что это правильно для вас, потому что вы сказали, что окно должно увеличиться на 1.

Если вы хотите, чтобы отбракованная дата использовалась в скользящих окнах перед самой собой, у вас есть немного рассола.

0
Richard 15 Дек 2017 в 15:05