在具有不同数量变量的多行上使用SAS财务XIRR函数

  • 本文关键字:SAS 函数 XIRR 财务 变量 sas
  • 更新时间 :
  • 英文 :


我正试图在数据集上使用SAS XIRR函数。语法为:

财务('XIRR',value1,value2,value3…valuen,date1,date2,date3…daten(;

我的问题是,数据的每一行都有不同数量的值/日期。每行最多可以有122个值/日期。

如果有缺失的值,XIRR函数就会失败,所以我将所有缺失的值都设置为0。现在函数失败了,因为"丢失"的日期现在是1960年1月。有人有什么想法吗?

在下面的代码中,cf1-cf122是现金流值,ed1-ed122是日期。

/* remove blanks */
data irrtable3;
set irrtable2;
array change _numeric_;
do over change;
if change=. then change=0;
end;
run;
/* create irr */
data irrtable4;
set irrtable3;
IRR=finance('XIRR',OF CF1-CF122,OF ED1-ED122);
run;```

您可以使用codegen构建一个具有可变参数数的动态FINANCE(..)调用,该调用由宏系统在DATA步骤运行时解析。

使用RESOLVE在宏环境中计算许多行的结果,与普通的DATA步骤相比,可能会有明显的缓慢。

示例:

data have;
v1=−10000; d1=mdy(1, 1, 2008);
v2=2750; d2=mdy(3, 1, 2008);
v3=4250; d3=mdy(10, 30, 2008);
v4=3250; d4=mdy(2, 15, 2009);
v5=2750; d5=mdy(4, 1, 2009);
output;
call missing(v5,d5); output;
call missing(v4,d4); output;
call missing(v3,d3); output;
call missing(v2,d2); output;
run;

options missing=' ';
data want;
set have;
args = catx(',', of v1-v5, of d1-d5);
result = resolve( cats (
'%sysfunc(FINANCE(XIRR,', args, '))'
));
run;
options missing='.';

据我所知(我不使用Finance函数,所以我不是专家(,如果在"unfilled"之前有所有"filled"参数,那么可以将所有缺少的参数都设置为零(包括"value"one_answers"date"(。使用Richard提供的示例(这是SAS文档中的示例(:

data want2;
set have;

array v v1-v5;
array d d1-d5;

do _i_ = 1 to dim(v);
if missing(v[_i_]) then do;
v[_i_]=0; d[_i_]=0;
end;
end;

args = catx(',', of v1-v5, of d1-d5);
result =FINANCE('XIRR',of v1-v5, of d1-d5);
run;

这起到了作用,得到了与Richard相同的结果,而且可能更快。

这确实需要0都在末尾——如果它们是穿插的,并且你不能使用CALL SORTN将它们都放在一端——而且你的数据太大,无法与RESOLVE一起使用,那么我会完全用宏语言来构建它。您可以做一些事情,所有这些对于这个答案来说都太长了,但最简单的可能是为每一行创建代码,并将它们放在每一行的if _n_ = 5 then do; &row5code.; end;后面。这当然会很长,但应该比解析更快(只是可维护性差得多(。您也可以对每一行执行CALL EXECUTE,速度也很慢,但有可能,甚至是DOSUBL。

最新更新