I am trying to create a reference price measure that is an average of past 250 days stock prices, weighted by the probabilities of a stock not being traded since the date of the corresponding price:
reference_pricet=(pricet-250*turnover_ratiot-250*(1-turnover_ratiot-249)*(1-turnover_ratiot-248)*...*(1-turnover_ratiot-1)+pricet-249*turnover_ratiot-249*(1-turnover_ratiot-248)*(1-turnover_ratiot-247)*...*(1-turnover_ratiot-1)+...+pricet-1*turnover_ratiot-1)/k, where k is a constant that ensure price weights add up to 1 (see the formula below).
The following link is for STATA:
For each stock, how to code the reference price in SAS? Price, Turnover ratio each day are given.
Thanks very much!
The format of the dataset is as follow:
ID Date Price Turnover
AAA 1990/08/25 8 0.05
AAA 1990/08/26 8.05 0.06
.....
BBB
....
CCC
and so on
Do you have SAS/ETS?
@ZZB wrote:
I am not sure if my sas has it. How to check it?
If I have it, how to code it?
I think that you may actually want IML, SAS's matrix language more than ETS. ETS does time series analysis but I haven't had a license for 20 years so no practice...
To check license run:
Proc setinit; run;
If you see SAS/ETS in the output of the log you have a license for ETS.
If you have the license run:
Proc product_status; run;
to see if it is installed. If licensed and not installed then update the installation.
Any help? Thanks!
I use the simple data steps to calculate the above formula, in this case I just replace "t-250" with "t-4" for simplicity.
If I want to back to t-250, how to code efficiently?
/****************************************/
*proc printto log=junk;
proc expand data=MSF out=TO method=none;
by permno;
id date;
convert TO = Lead_TO / transformout=(lead 1);
run;
*proc printto;
data TO1;
set TO;
Lead_TO_1=1-Lead_TO;
run;
*proc printto log=junk;
proc expand data=TO1 (keep=permno date prc TO Lead_TO_1) out=TO2 method=none;
by permno;
id date;
convert Lead_TO_1 = CUM_Lead_TO3 / transformout=(MOVPROD 3 trimleft 2); *** 1990/5 vs. 1990/1, 3=Date interval - 1;
convert Lead_TO_1 = CUM_Lead_TO2 / transformout=(MOVPROD 2 trimleft 1); *** 1990/5 vs. 1990/2;
convert Lead_TO_1 = CUM_Lead_TO1 / transformout=(MOVPROD 1); *** 1990/5 vs. 1990/3;
run;
*proc printto;
*proc printto log=junk;
proc expand data=TO2 out=TO3 method=none;
by permno;
id date;
convert CUM_Lead_TO3 = Lead_CUM_Lead_TO3 / transformout=(lead 2); *** 1990/5 vs. 1990/1;
convert CUM_Lead_TO2 = Lead_CUM_Lead_TO2 / transformout=(lead 1); *** 1990/5 vs. 1990/2;
run;
*proc printto;
data TO4;
set TO3;
PRC4=PRC*TO*Lead_CUM_Lead_TO3;
PRC3=PRC*TO*Lead_CUM_Lead_TO2;
PRC2=PRC*TO*Lead_TO_1;
PRC1=PRC*TO;
run;
data TO4;
set TO4;
K4=TO*Lead_CUM_Lead_TO3;
K3=TO*Lead_CUM_Lead_TO2;
K2=TO*Lead_TO_1;
K1=TO;
run;
*proc printto log=junk;
proc expand data=TO4 out=TO5 method=none;
by permno;
id date;
convert PRC4 = LAG_TO4 / transformout=(lag 4);
convert PRC3 = LAG_TO3 / transformout=(lag 3);
convert PRC2 = LAG_TO2 / transformout=(lag 2);
convert PRC1 = LAG_TO1 / transformout=(lag 1);
convert K4 = LAG_K4 / transformout=(lag 4);
convert K3 = LAG_K3 / transformout=(lag 3);
convert K2 = LAG_K2 / transformout=(lag 2);
convert K1 = LAG_K1 / transformout=(lag 1);
run;
*proc printto;
data TO6;
set TO5;
RP=(LAG_TO4+LAG_TO3+LAG_TO2+LAG_TO1)/(LAG_K4+LAG_K3+LAG_K2+LAG_K1);
run;
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.