如何计算加权平均值但使用SAS排除对象本身

时间:2015-06-16 16:01:36

标签: sas

我的数据集中有四个变量。 Company显示公司名称。 Return是第CompanyDate的返回。 Weight是该公司在市场上的重要性。

我想将所有变量保留在原始文件中,并创建一个额外的变量,即市场回报(排除Company本身)。股票'a'对应的市场收益是市场中相同Date的所有加权股票收益的总和,不包括股票a。例如,如果市场中有3只股票a,b和c。股票a的市场回报是回报(b)* [重量(b)/(重量(b)+重量(C))] +回报(C)* [重量(C)/(重量(b)+重量(C)同样,股票b的市场回报是回报(a)* [权重(a)/(权重(a)+权重(C))] +回报(C)* [权重(C)/(权重(a) )+重量(C)]。

我尝试使用proc摘要但是这个函数在计算股票a的市场回报时不能排除股票a。

PROC SUMMARY NWAY DATA  ; 
    CLASS Date ; 

    VAR Return / WEIGHT = weight;

    OUTPUT
       OUT = output
       MEAN (Return) = MarketReturn;
RUN;

有人可以教我如何解决这个问题。我对这个软件比较陌生,所以我不知道我是否应该使用循环或者可能有更好的选择。

1 个答案:

答案 0 :(得分:2)

这可以通过一些花哨的代数来完成。但这不是内置的东西。

基本上:

  • 构建“总”市场回报
  • 通过股票回报构建股票(所以只返回A)
  • 减去A对总数的贡献。

由于生成这些列表的简单数学运算,很容易做到这一点。

  

总和=((A*Awgt的平均值)+(余数的平均值*权重之和))/(Awgt的总和+剩余的总和)

所以,解决这个问题(休息的意思*休息的意思/休息时间的总和)。

  

独家总和:((所有wgts的总和的平均值) - (A *总和的平均值))/(所有wgts的总和 - A wgts的总和)

像这样。

data returns;
  input stock $ return weight;
  datalines;
A .50 1
B .75 2
C .33 1
;;;;
run;

proc means data=returns;
  class stock;
  types () stock; *this is the default;
  weight weight;
  output out=means_out mean= sumwgt= /autoname;
run;

data returns_excl;
  if _n_=1 then set means_out(where=(_type_=0) rename=(return_mean=tot_return return_sumwgt=tot_wgts));
  set means_out(where=(_type_=1));
  return_excl = (tot_return*tot_wgts-return_mean*return_sumwgt)/(tot_wgts-return_sumwgt);
run;