我有以下格式的数据:
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%。
这样会一直持续到明年六月,那时我将根据市值再次重新平衡...
答案 0 :(得分:0)
10%的月收益率是投机性的!
当两家公司相差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;