Расчет взвешенной стоимости в SAS - PullRequest
0 голосов
/ 09 марта 2019

У меня есть некоторые данные в следующем формате:

COMPNAME DATA CAP RETURN

Я нашел код, который сконструирует и рассчитает взвешенную по стоимости прибыль на основе данных.

Это прекрасно работаети ниже:

PROC SUMMARY NWAY DATA = Data1 ; CLASS DATE ;

VAR RETURN / WEIGHT = CAP ;

OUTPUT
   OUT = MKTRET
   MEAN (RETURN) = MONTHLYRETURN
RUN;

Расширение, которое я хотел бы сделать, в моей голове немного сложнее.

Я хочу сделать весовые коэффициенты на основе рыночной капитализации в июне.

Так что это будут портфели с покупкой и удержанием.Фактические данные содержат данные о сотнях компаний, но в качестве репрезентативного примера можно привести две компании с единственным объяснением того, как будут развиваться веса ...

Скажем, например, у меня есть две компании, A и B.

CAP A составляет 100 миллионов фунтов стерлингов, а B - 100 миллионов фунтов стерлингов.

В июле одного года я бы инвестировал 50% в A и 50% в B.

Доходы вВ июле 10% и -10%.

Поэтому я бы инвестировал 55% и 45%.

Так будет продолжаться до июня следующего года, когда я снова перебалансирую, основываясь нарыночная капитализация ...

1 Ответ

0 голосов
/ 11 марта 2019

10% ежемесячный доход довольно спекулятивный!

Когда две компании отличаются более чем на 200, вам также нужно будет продавать и покупать, чтобы выровнять компании.

Предположите ставки в месяцмоделируются и хранятся в наборе данных.Вы можете создать смоделированный регистр следующим образом:

  • добавить возврат
  • сравнить сальдо
    • выровнять, разделив 200 инвестиций, если сальдо достаточно близко
    • выровнятьинвестируя все 200 в одну и продавая и покупая

Конечно, портфель с более чем 2 компаниями становится более сложным балансированием для достижения математического баланса.

data simurate(label="Future expectation is not an indicator of past performance :)");
  do month = 1 to 60;
  do company = 1 to 2;
    return = round (sin(company+month/4) / 12, 0.001); %* random return rate for month;
    output; 
  end;
  end;    
run;

data want;
  if 0 then set simurate;

  declare hash lookup (dataset:'simurate');
  lookup.defineKey ('company', 'month');
  lookup.defineData('return');
  lookup.defineDone();


  month = 0;
  bal1 = 0; bal2 = 0;
  output;

  do month = 1 to 60;

    lookup.find(key:1, key:month);  rate1 = return;
    ret1 = round(bal1 * rate1, 0.0001);

    lookup.find(key:2, key:month);  rate2 = return;
    ret2 = round(bal1 * rate2, 0.0001);

    bal1 + ret1;
    bal2 + ret2;

    goal = mean(bal1,bal2) + 100;

    sel1 = 0; buy1 = 0;
    sel2 = 0; buy2 = 0;

    if abs(bal1-bal2) <= 200 then do;
      * difference between balances after returns is < 200;
      * balances can be equalized simple investment split;
      inv1 = goal - bal1;
      inv2 = goal - bal2;
    end;
    else if bal1 < bal2 then do;
      * sell bal2 as needed to equalize;
      inv1 = 200;
      inv2 = 0;
      buy1 = goal - 200 - bal1;
      sel2 = bal2 - goal;
    end;
    else do;
      inv2 = 200;
      inv1 = 0;
      buy2 = goal - 200 - bal2;
      sel1 = bal1 - goal;      
    end;

    bal1 + (buy1 - sel1 + inv1);
    bal2 + (buy2 - sel2 + inv2);

    output;

  end;
  stop;
  drop company return ;
  format bal: 10.4 rate: 5.3;
run;
...