Type : EXTERNE
Les données sont fournies dynamiquement via le paramètre de macro '&returns'. Aucune donnée n'est codée en dur.
| 1 | %macro return_annualized(returns, |
| 2 | scale= 1, |
| 3 | method= DISCRETE, |
| 4 | dateColumn= DATE, |
| 5 | outData= annualized_returns); |
| 6 | |
| 7 | %local _temp nv vars i; |
| 8 | %let vars=%get_number_column_names(_table=&returns,_exclude=&dateColumn); |
| 9 | %put VARS IN return_annualized: (&vars); |
| 10 | |
| 11 | %let _temp=%ranname(); |
| 12 | %let nv = %sysfunc(countw(&vars)); |
| 13 | %let i = %ranname(); |
| 1 | /*DISCRETE*/ |
| 2 | %IF %upcase(&method) = DISCRETE %THEN %DO; |
| 3 | %geo_mean(&returns,dateColumn=&dateColumn,outData= &_temp); |
| 4 | |
| 5 | DATA &outData(keep=_stat_ &vars); |
| 6 | FORMAT _STAT_ $32.; |
| 7 | SET &_temp; |
| 8 | array ret[&nv] &vars; |
| 9 | DO &i=1 to &nv; |
| 10 | ret[&i]=(1+ret[&i])**&scale-1; |
| 11 | END; |
| 12 | _stat_="Annualized Return"; |
| 13 | RUN; |
| 14 | %END; |
| 1 | /*LOG*/ |
| 2 | %IF %upcase(&method) = LOG %THEN %DO; |
| 3 | PROC MEANS DATA=&returns mean noprint; |
| 4 | OUTPUT out=&_temp mean=; |
| 5 | RUN; |
| 6 | |
| 7 | DATA &outData(keep=_stat_ &vars); |
| 8 | FORMAT _STAT_ $32.; |
| 9 | SET &_temp; |
| 10 | array ret[&nv] &vars; |
| 11 | DO &i=1 to &nv; |
| 12 | ret[&i]=ret[&i]*&scale; |
| 13 | END; |
| 14 | _stat_="Annualized Return"; |
| 15 | RUN; |
| 16 | %END; |
| 1 | PROC DATASETS lib= work nolist; |
| 2 | delete &_temp; |
| 3 | RUN; |
| 4 | QUIT; |
| 5 | %mend; |