Publié le :

Calcul et comparaison des moyennes mobiles de Hull et simples

En attente de validation
Le script définit deux macros SAS© : %AddWMA pour le calcul de la moyenne mobile pondérée et %AddHMA pour la moyenne mobile de Hull (qui repose sur la WMA). Ces macros sont utilisées dans une étape DATA sur la table sashelp.Stocks (filtrée sur l'action IBM). Une macro %AddMA est également appelée mais n'est pas définie dans le snippet fourni. Enfin, une procédure SGPLOT génère une visualisation comparant les cours (High/Low/Close) avec les moyennes mobiles calculées.
Analyse des données

Type : SASHELP


Les données proviennent de la table standard 'sashelp.Stocks', filtrée sur la valeur 'IBM'.

1 Bloc de code
MACRO
Explication :
Macro calculant une Moyenne Mobile Pondérée (WMA) de manière optimisée en utilisant des variables retenues (RETAIN) et la fonction LAG pour ajuster les sommes glissantes.
Copié !
1%macro AddWMA(WMA_N=4, INPUT=close, OUT=&INPUT._WMA_&WMA_N., OUTLABEL=&INPUT. WMA(&WMA_N.));
2 retain _sumx_&INPUT._WMA_&WMA_N.;
3 _sumx_&INPUT._WMA_&WMA_N.=sum (_sumx_&INPUT._WMA_&WMA_N., &INPUT., -lag&WMA_N.( &INPUT. )) ;
4
5 retain _sum_&INPUT._WMA_&WMA_N.;
6 _sum_&INPUT._WMA_&WMA_N.=sum (_sum_&INPUT._WMA_&WMA_N., &WMA_N * &INPUT., -lag( _sumx_&INPUT._WMA_&WMA_N. )) ;
7
8 retain _sumw_&INPUT._WMA_&WMA_N.;
9 IF _N_ <= &WMA_N THEN _sumw_&INPUT._WMA_&WMA_N. = sum (_sumw_&INPUT._WMA_&WMA_N., &WMA_N, -_N_, 1);
10
11 &OUT=_sum_&INPUT._WMA_&WMA_N. / _sumw_&INPUT._WMA_&WMA_N.;
12
13 drop _sumx_&INPUT._WMA_&WMA_N. _sumw_&INPUT._WMA_&WMA_N. _sum_&INPUT._WMA_&WMA_N.;
14 label &OUT="&OUTLABEL";
15%mend;
2 Bloc de code
MACRO
Explication :
Macro calculant la Moyenne Mobile de Hull (HMA). Elle orchestre plusieurs appels à %AddWMA avec des fenêtres temporelles différentes (N, N/2, racine de N) pour réduire le décalage (lag) inhérent aux moyennes mobiles classiques.
Copié !
1%macro AddHMA(HMA_N=5, INPUT=close, OUT=&INPUT._HMA_&HMA_N., outlabel=&INPUT. HMA(&HMA_N.));
2 %AddWMA(WMA_N=&HMA_N, INPUT=&INPUT.);
3
4 %AddWMA(WMA_N=%sysfunc(round(&HMA_N./2)), INPUT=&INPUT.);
5
6 &INPUT._HMA_&HMA_N._DELTA=2 * &INPUT._WMA_%sysfunc(round(&HMA_N./2)) - &INPUT._WMA_&HMA_N;
7 %AddWMA(WMA_N=%sysfunc(round(%sysfunc(sqrt(&HMA_N)))), INPUT=&INPUT._HMA_&HMA_N._DELTA);
8
9 rename &INPUT._HMA_&HMA_N._DELTA_WMA_%sysfunc(round(%sysfunc(sqrt(&HMA_N.))))=&OUT;
10 label &INPUT._HMA_&HMA_N._DELTA_WMA_%sysfunc(round(%sysfunc(sqrt(&HMA_N.))))="&outlabel";
11
12 drop &INPUT._WMA_&HMA_N &INPUT._WMA_%sysfunc(round(&HMA_N./2)) &INPUT._HMA_&HMA_N._DELTA;
13%mend;
3 Bloc de code
DATA STEP Data
Explication :
Création de la table de travail 'Stocks_HMA'. Lit les données IBM depuis sashelp.Stocks et calcule les indicateurs via les macros. Note : la macro %AddMA est appelée mais son code source n'est pas présent dans ce fichier.
Copié !
1DATA Stocks_HMA;
2 SET sashelp.Stocks(where=(stock='IBM'));
3 %AddHMA( HMA_N=5, out=HMA, outlabel=%str(HMA))
4 %AddMA(MA_N=5, out=SMA, outlabel=%str(SMA));
5RUN;
4 Bloc de code
PROC SGPLOT
Explication :
Visualisation graphique des résultats : affiche les prix High/Low (barres), le prix de clôture (points), et superpose les courbes de la moyenne mobile simple (SMA) et de la moyenne mobile de Hull (HMA).
Copié !
1ods graphics / width=800px height=300px;
2title "Comparison of Simple and Hull Moving Average";
3PROC SGPLOT DATA=Stocks_HMA noautolegend;
4 highlow x=Date high=High low=Low / lineattrs=(color=LightGray);
5 scatter x=Date y=Close / markerattrs=(color=LightGray);
6 series x=Date y=SMA / curvelabel curvelabelattrs=(color=DarkGreen) lineattrs=(color=DarkGreen);
7 series x=Date y=HMA / curvelabel curvelabelattrs=(color=DarkOrange) lineattrs=(color=DarkOrange);
8 refline '01JUN1992'd / axis=x label='June 1992' labelloc=inside;
9 xaxis grid display=(nolabel);
10 yaxis grid max=200 label="IBM Closing Price";
11RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.