我有四个变量Name
,Date
,MarketCap
和Return
。 Name
是公司名称。 Date
是时间戳。 MarketCap
显示公司的规模。 Return
是Date
日返回的MarketReturn
。
我想创建一个额外的变量date
,它是每个时间点市场的价值加权回报。对于每天t,MarketCap加权回报=总和[return(i)*(MarketCap(i)/ Total(MarketCap)](return(i)是公司i在第t天的回报)。
我这样做非常低效。我想必须有一些功能可以很容易地在SAS中实现这个目标,所以我想问一下是否有人可以改进我的代码。
第1步:按TotalMV
排序数据
步骤2:计算每天的总市值MarketCap
=总和(MarketCap)。
第3步:计算每家公司的权重(权重= TotalMV
/ Contribution
)
step4:创建一个新的变量' Contribution' =每个公司的回报*重量
第五步:每天总结Sendkeys
。总和(分担)
答案 0 :(得分:3)
许多SAS PROC都支持加权平均值。其中一个更常见,全面有用的是PROC SUMMARY
:
PROC SUMMARY NWAY DATA = my_data_set ;
CLASS Date ;
VAR Return / WEIGHT = MarketCap ;
OUTPUT
OUT = my_result_set
MEAN (Return) = MarketReturn
;
RUN;
NWAY
篇告诉PROC,观察结果应仅按照CLASS
声明中所述的内容进行分组 - 它不应提供未分组的总计等等。
CLASS Date
片告诉PROC按日期对观察进行分组。使用CLASS
时,无需对数据进行预排序。如果您说BY Date
,则必须进行预先排序。使用BY
的唯一理由是,如果您的数据集非常大且自然排序,则可以获得一些性能。在大多数情况下坚持CLASS
。
VAR Return / WEIGHT = MarketCap
告诉proc,Return
上的任何加权计算都应使用MarketCap
作为权重。
最后,OUTPUT
语句指定将结果写入的数据集(使用OUT
选项),并指定Return
上将写入的平均值的计算MarketReturn
。
PROC SUMMARY
可以做很多很多事情。 PROC SUMMARY
的文档很稀疏,但仅仅因为它是PROC MEANS
的几乎完全相同的兄弟,而且SAS不想为两者生成大部分相同文档的大量内容。 Here is the link to the SAS 9.4 PROC MEANS
documentation。两个PROCS之间的主要区别在于SUMMARY
仅输出到数据集,而MEANS
默认输出到屏幕。如果您想立即在屏幕上弹出结果,请尝试PROC MEANS
。
MEAN
声明中的OUTPUT
关键字来自SAS的统计关键字列表a helpful reference for which is here。