在SAS中计算价值加权回报

时间:2019-03-09 13:58:41

标签: sas

我有以下格式的数据:

COMPNAME DATA CAP RETURN

我发现了一些代码,这些代码将根据数据构造和计算价值加权回报。

效果很好,如下所示:

PROC SUMMARY NWAY DATA = Data1 ; CLASS DATE ;

VAR RETURN / WEIGHT = CAP ;

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

我想做的扩展名有点复杂。

我想根据6月份的市值进行加权。

因此,这将是购买和持有投资组合。实际数据有100家公司,但仅举两个例子说明权重将如何变化,就给两个公司一个代表。

例如,我有两家公司,A和B。

A的CAP值为1亿英镑,B的CAP为1亿英镑。

在一年的7月,我将对A投资50%,对B投资50%。

7月的回报率为10%和-10%。

因此,我将投资55%和45%。

这样会一直持续到明年六月,那时我将根据市值再次重新平衡...

1 个答案:

答案 0 :(得分:0)

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;