<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic How to calculate 48 sets of returns in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-calculate-48-sets-of-returns/m-p/927098#M364873</link>
    <description>&lt;P data-sourcepos="3:1-3:39"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-sourcepos="3:1-3:39"&gt;&lt;STRONG&gt;Would u help me to &lt;/STRONG&gt;&lt;STRONG&gt;calculate 48 sets of returns (2*3*2*2*2)&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL class="lia-list-style-type-disc"&gt;
&lt;LI data-sourcepos="5:1-5:28"&gt;&lt;STRONG&gt;2 breakouts portfolio (Max vs min) &amp;lt;I have done the column attached&amp;gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL data-sourcepos="7:1-10:0"&gt;
&lt;LI data-sourcepos="7:1-7:31"&gt;3 sizes (Small vs Mid vs Big)&amp;lt;&lt;STRONG&gt; I have done the column attached&amp;gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-sourcepos="8:1-8:55"&gt;2 weighted methods (value-weighted vs equal-weighted)&lt;/LI&gt;
&lt;LI data-sourcepos="9:1-10:0"&gt;2 groups of stocks (all stocks vs stocks that have broken out inportfolio Max or Min&amp;nbsp; )&amp;nbsp;&lt;BR /&gt;*2 Return type (one-week or one-month)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;NOW I HAVE&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NOWIHAVE.png" style="width: 999px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/96190i5907A4B789D08B01/image-size/large?v=v2&amp;amp;px=999" role="button" title="NOWIHAVE.png" alt="NOWIHAVE.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P data-sourcepos="11:1-11:8"&gt;&lt;STRONG&gt;sample Data&lt;BR /&gt;&lt;A href="https://docs.google.com/spreadsheets/d/1Jr2ophd_Q_MJqO72VO0PU17cyVlSPNK2/edit?usp=sharing&amp;amp;ouid=101047452363876489490&amp;amp;rtpof=true&amp;amp;sd=true" target="_blank"&gt;https://docs.google.com/spreadsheets/d/1Jr2ophd_Q_MJqO72VO0PU17cyVlSPNK2/edit?usp=sharing&amp;amp;ouid=101047452363876489490&amp;amp;rtpof=true&amp;amp;sd=true&lt;/A&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="11:1-11:8"&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-sourcepos="13:1-34:0"&gt;
&lt;LI data-sourcepos="13:1-13:66"&gt;Portfolio: Contains daily breakout (Max, Min, unqualified) flags&lt;/LI&gt;
&lt;LI data-sourcepos="14:1-14:45"&gt;Size: Contains size flags (Small, Mid, Big)&lt;/LI&gt;
&lt;LI data-sourcepos="15:1-15:29"&gt;PERMNO: Unique company code&lt;/LI&gt;
&lt;LI data-sourcepos="16:1-16:18"&gt;DATE: Daily date&lt;/LI&gt;
&lt;LI data-sourcepos="17:1-17:26"&gt;SHROUT: Number of shares&lt;/LI&gt;
&lt;LI data-sourcepos="18:1-18:34"&gt;CFACSHR: Share adjustment factor&lt;/LI&gt;
&lt;LI data-sourcepos="19:1-19:27"&gt;P: Adjusted closing price&lt;/LI&gt;
&lt;LI data-sourcepos="20:1-20:26"&gt;H: Historical high price&lt;/LI&gt;
&lt;LI data-sourcepos="21:1-21:25"&gt;L: Historical low price&lt;/LI&gt;
&lt;LI data-sourcepos="22:1-22:44"&gt;H_DATE: Date of last historical high price&lt;/LI&gt;
&lt;LI data-sourcepos="23:1-23:43"&gt;L_DATE: Date of last historical low price&lt;/LI&gt;
&lt;LI data-sourcepos="24:1-24:27"&gt;MV: Market capitalization&lt;/LI&gt;
&lt;LI data-sourcepos="25:1-25:95"&gt;LAST_MONTH_END: Date at the end of the previous month used to calculate market capitalization&lt;/LI&gt;
&lt;LI data-sourcepos="26:1-26:69"&gt;previous_MV: Market capitalization at the end of the previous month&lt;/LI&gt;
&lt;LI data-sourcepos="27:1-31:78"&gt;QUARTILE: Quartile used to determine which quartile the market capitalization falls into
&lt;UL data-sourcepos="28:5-31:78"&gt;
&lt;LI data-sourcepos="28:5-28:47"&gt;0: Smallest (market capitalization 0-25%)&lt;/LI&gt;
&lt;LI data-sourcepos="29:5-29:46"&gt;1: Medium (market capitalization 25-50%)&lt;/LI&gt;
&lt;LI data-sourcepos="30:5-30:46"&gt;2: Large (market capitalization 50-100%)&lt;/LI&gt;
&lt;LI data-sourcepos="31:5-31:78"&gt;Some stocks have no market capitalization and are classified as "nosize"&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="32:1-32:42"&gt;SIZE: Corresponds to the quartiles above&lt;/LI&gt;
&lt;LI data-sourcepos="33:1-34:0"&gt;RET: Daily return: (Today's closing price - Yesterday's closing price) / Yesterday's closing price&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="35:1-35:13"&gt;&lt;STRONG&gt;Objective&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="37:1-37:222"&gt;Calculate the one-week and one-month returns (using the RET column) for stocks that break out to a new high or new low each day, weighted by market capitalization and arithmetic average. This results in 24 sets of returns:&lt;/P&gt;
&lt;P data-sourcepos="39:1-39:18"&gt;2 * 3 * 2 * 2 = 24&lt;/P&gt;
&lt;P data-sourcepos="41:1-41:15"&gt;&lt;STRONG&gt;More portfolio flag/column explanation&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-sourcepos="44:5-48:0"&gt;
&lt;LI data-sourcepos="44:5-44:253"&gt;Max: Stocks that break out to a new high on certain day. However, the company must have been in existence for at least one year to be considered a new high. Stocks that set a new high within two days of their inception are not included in Max.&lt;/LI&gt;
&lt;LI data-sourcepos="45:5-45:65"&gt;Min: Stocks that break out to a new low on the certain day.&lt;/LI&gt;
&lt;LI data-sourcepos="46:5-46:35"&gt;Comparison: Remaining stocks.&lt;/LI&gt;
&lt;LI data-sourcepos="47:5-48:0"&gt;Unqualified: Data from the first year, not included in return calculations, but prices are still used to determine historical highs and lows.&lt;/LI&gt;
&lt;/UL&gt;
&lt;OL data-sourcepos="43:1-57:0"&gt;
&lt;LI data-sourcepos="49:1-51:0"&gt;
&lt;P data-sourcepos="49:4-49:41"&gt;Calculate daily market capitalization:&lt;/P&gt;
&lt;UL data-sourcepos="50:5-51:0"&gt;
&lt;LI data-sourcepos="50:5-51:0"&gt;MV = P * CFACSHR * SHROUT&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="52:1-54:0"&gt;
&lt;P data-sourcepos="52:4-52:30"&gt;Assign stocks to quartiles:&lt;/P&gt;
&lt;UL data-sourcepos="53:5-54:0"&gt;
&lt;LI data-sourcepos="53:5-54:0"&gt;Use the QUARTILE column to determine which quartile each stock falls into.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="55:1-57:0"&gt;
&lt;P data-sourcepos="55:4-55:76"&gt;Calculate weighted and arithmetic average returns for each set of stocks:&lt;/P&gt;
&lt;UL data-sourcepos="56:5-57:0"&gt;
&lt;LI data-sourcepos="56:5-57:0"&gt;For each of the 24 sets of stocks (portfolio defined by breakout, size, weighting method, and stock group), calculate the one-week and one-month returns using both market capitalization weighting and arithmetic averaging.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-sourcepos="58:1-58:10"&gt;&lt;STRONG&gt;Output&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="58:1-58:10"&gt;A table with the following category&lt;BR /&gt;&lt;SPAN&gt;2 new highs and lows (Max vs Min )&lt;/SPAN&gt;portfolio Breakout&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&lt;SPAN&gt;*3 sizes (Small vs Mid vs Big) &lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&lt;SPAN&gt;*2 weighting methods (&lt;/SPAN&gt;Market capitalization-weighted return&amp;nbsp;&lt;SPAN&gt;vs equal-weighted)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&lt;SPAN&gt; *2 groups of stocks (all stocks vs those that have reached new highs or lows)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;*2 Return type (one-week or one-month)&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;table may seems like the following&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Huddart.JPG" style="width: 999px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/96189iA0EB59C8B94AFC2F/image-size/large?v=v2&amp;amp;px=999" role="button" title="Huddart.JPG" alt="Huddart.JPG" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&lt;BR /&gt;&lt;STRONG style="font-family: inherit;"&gt;Additional notes&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-sourcepos="72:1-74:0"&gt;
&lt;LI data-sourcepos="72:1-72:66"&gt;The calculation should be performed daily to update the returns.&lt;/LI&gt;
&lt;LI data-sourcepos="73:1-74:0"&gt;The results can be used to analyze the performance of different breakout strategies and stock groups.&lt;BR /&gt;&lt;BR /&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;DM'LOG; CLEAR; OUT; CLEAR; ODSRESULTS; CLEAR;';
%LET FOLDER=%STR(C:\USERS\ALAIN\ONEDRIVE\桌面\HIGH);
LIBNAME HIGH "&amp;amp;FOLDER";

DATA HH;
 SET HIGH.HH;
 IF CFACPR=0 THEN DELETE;
RUN;

/*
DATA HH;
	SET	HH;
	IF _N_ &amp;lt;=1000;
RUN;
*/

PROC SORT 
  DATA=HH (KEEP  =SHRCD EXCHCD PERMNO DATE PRC CFACPR SHROUT CFACSHR RET
                      WHERE =( SHRCD IN (10,11) AND EXCHCD IN (1,2,3,31,32,33) )
                      ) 

OUT=HL(DROP=SHRCD EXCHCD );
  BY PERMNO DATE;
RUN;

DATA HL; 
    SET HL; 
    BY PERMNO DATE; 
    RETAIN H L 0; 
    P=ABS(DIVIDE (PRC, CFACPR));
    IF FIRST.PERMNO THEN H = P; 
    IF FIRST.PERMNO THEN L = P;
    H = MAX(H, P); 
    L = MIN(L, P);
 DROP  PRC CFACPR;
   RUN; /* PERMNO DATE  SHROUT CFACSHR H L P */

DATA MK (DROP=_:);
  SET HL;
  BY PERMNO DATE; 

  RETAIN _FIRST_DATE_QUALIFIED . 
         _H   .                 
         _H_DATE .              
         _L   .                 
         _L_DATE .              
          PORTFOLIO 
;             
LENGTH  PORTFOLIO $11;

  IF FIRST.PERMNO THEN DO;
    CALL MISSING(OF _:);
    _FIRST_DATE_QUALIFIED=INTNX('YEAR',DATE,1,'SAME')+1;
  END;

  IF _H=. THEN _H=P;
  IF _L=. THEN _L=P;

  IF P ^=. THEN DO;
    IF P &amp;gt; _H AND DATE &amp;gt;= INTNX('MONTH', _H_DATE, 1, 'SAME') THEN DO;
      _H=P;
      _H_DATE=DATE;
      PORTFOLIO='MAX';
    END;

    ELSE IF P &amp;lt; _L AND DATE &amp;gt;= INTNX('MONTH', _L_DATE, 1, 'SAME') THEN DO;
      _L=P;
      _L_DATE=DATE;
      PORTFOLIO='MIN';
    END;

    ELSE PORTFOLIO='COMPARISON';
  END;

  IF DATE &amp;gt;= _FIRST_DATE_QUALIFIED THEN DO;
      H = _H;
      H_DATE = _H_DATE;
      L = _L;
      L_DATE = _L_DATE;
  END;

  IF DATE &amp;lt; _FIRST_DATE_QUALIFIED THEN DO;
    PORTFOLIO = 'UNQUALIFIED';
  END;

  FORMAT H_DATE L_DATE YYMMDD10. ;

RUN;


DATA MV;
 SET MK;
 BY PERMNO DATE; 

 RETAIN 
 MV
 LAST_MONTH_END; 

 LAST_MONTH_END = INTNX('MONTH', DATE, -1, 'END');
 FORMAT LAST_MONTH_END YYMMDD10. ;

 MV = P * (SHROUT*CFACSHR) ;

RUN;

data LMV;
  set MV ;
  by permno date ;
  lag_MV = lag(MV);
  if first.permno then call missing(lag_MV,previous_MV);
  else if month(date) ne month(lag(date)) then previous_MV=lag_MV;
  retain previous_MV;
/*  drop lag_MV;*/
  run;


PROC SORT DATA=LMV;
    BY DATE PERMNO DESCENDING previous_MV;
RUN;

PROC RANK DATA=LMV OUT=RANKED_DATA GROUPS=4 TIES=LOW;
  BY DATE;
  VAR previous_MV;
  RANKS QUARTILE;
RUN;

/*
proc contents data=RANKED_DATA; 
run;
*/


DATA SMB;
    SET RANKED_DATA; 
RETAIN 
    SIZE
	;             
    LENGTH  SIZE $6;
    IF QUARTILE = 0 THEN SIZE = 'SMALL';
    else IF QUARTILE = 1 THEN SIZE = 'MID';
    else IF QUARTILE IN (2,3) THEN SIZE ='BIG';
    ELSE SIZE ='NOSIZE';
RUN;



data filtered_data;
    set SMB;
    where date between '24OCT1979'd and '01NOV1979'd;
run;

PROC EXPORT DATA= WORK.FILTERED_DATA 
            OUTFILE= "C:\Users\alain\OneDrive\桌面\check.xls" 
            DBMS=EXCEL REPLACE;
     SHEET="check"; 
RUN;


/*
DATA See;
  SET SMB(OBS=500);
  PUT (_ALL_) (+0);
RUN;





&lt;/CODE&gt;&lt;/PRE&gt;
&lt;BR /&gt;&lt;A title="whole data" href="https://drive.google.com/file/d/1grx_6p-yVMVzrzvVjdtfwyFUjRpq10W6/view?usp=drive_link" target="_self"&gt;https://drive.google.com/file/d/1grx_6p-yVMVzrzvVjdtfwyFUjRpq10W6/view?usp=drive_link&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sun, 05 May 2024 14:57:20 GMT</pubDate>
    <dc:creator>Irenelee</dc:creator>
    <dc:date>2024-05-05T14:57:20Z</dc:date>
    <item>
      <title>How to calculate 48 sets of returns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-calculate-48-sets-of-returns/m-p/927098#M364873</link>
      <description>&lt;P data-sourcepos="3:1-3:39"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-sourcepos="3:1-3:39"&gt;&lt;STRONG&gt;Would u help me to &lt;/STRONG&gt;&lt;STRONG&gt;calculate 48 sets of returns (2*3*2*2*2)&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL class="lia-list-style-type-disc"&gt;
&lt;LI data-sourcepos="5:1-5:28"&gt;&lt;STRONG&gt;2 breakouts portfolio (Max vs min) &amp;lt;I have done the column attached&amp;gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL data-sourcepos="7:1-10:0"&gt;
&lt;LI data-sourcepos="7:1-7:31"&gt;3 sizes (Small vs Mid vs Big)&amp;lt;&lt;STRONG&gt; I have done the column attached&amp;gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-sourcepos="8:1-8:55"&gt;2 weighted methods (value-weighted vs equal-weighted)&lt;/LI&gt;
&lt;LI data-sourcepos="9:1-10:0"&gt;2 groups of stocks (all stocks vs stocks that have broken out inportfolio Max or Min&amp;nbsp; )&amp;nbsp;&lt;BR /&gt;*2 Return type (one-week or one-month)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;NOW I HAVE&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NOWIHAVE.png" style="width: 999px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/96190i5907A4B789D08B01/image-size/large?v=v2&amp;amp;px=999" role="button" title="NOWIHAVE.png" alt="NOWIHAVE.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P data-sourcepos="11:1-11:8"&gt;&lt;STRONG&gt;sample Data&lt;BR /&gt;&lt;A href="https://docs.google.com/spreadsheets/d/1Jr2ophd_Q_MJqO72VO0PU17cyVlSPNK2/edit?usp=sharing&amp;amp;ouid=101047452363876489490&amp;amp;rtpof=true&amp;amp;sd=true" target="_blank"&gt;https://docs.google.com/spreadsheets/d/1Jr2ophd_Q_MJqO72VO0PU17cyVlSPNK2/edit?usp=sharing&amp;amp;ouid=101047452363876489490&amp;amp;rtpof=true&amp;amp;sd=true&lt;/A&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="11:1-11:8"&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-sourcepos="13:1-34:0"&gt;
&lt;LI data-sourcepos="13:1-13:66"&gt;Portfolio: Contains daily breakout (Max, Min, unqualified) flags&lt;/LI&gt;
&lt;LI data-sourcepos="14:1-14:45"&gt;Size: Contains size flags (Small, Mid, Big)&lt;/LI&gt;
&lt;LI data-sourcepos="15:1-15:29"&gt;PERMNO: Unique company code&lt;/LI&gt;
&lt;LI data-sourcepos="16:1-16:18"&gt;DATE: Daily date&lt;/LI&gt;
&lt;LI data-sourcepos="17:1-17:26"&gt;SHROUT: Number of shares&lt;/LI&gt;
&lt;LI data-sourcepos="18:1-18:34"&gt;CFACSHR: Share adjustment factor&lt;/LI&gt;
&lt;LI data-sourcepos="19:1-19:27"&gt;P: Adjusted closing price&lt;/LI&gt;
&lt;LI data-sourcepos="20:1-20:26"&gt;H: Historical high price&lt;/LI&gt;
&lt;LI data-sourcepos="21:1-21:25"&gt;L: Historical low price&lt;/LI&gt;
&lt;LI data-sourcepos="22:1-22:44"&gt;H_DATE: Date of last historical high price&lt;/LI&gt;
&lt;LI data-sourcepos="23:1-23:43"&gt;L_DATE: Date of last historical low price&lt;/LI&gt;
&lt;LI data-sourcepos="24:1-24:27"&gt;MV: Market capitalization&lt;/LI&gt;
&lt;LI data-sourcepos="25:1-25:95"&gt;LAST_MONTH_END: Date at the end of the previous month used to calculate market capitalization&lt;/LI&gt;
&lt;LI data-sourcepos="26:1-26:69"&gt;previous_MV: Market capitalization at the end of the previous month&lt;/LI&gt;
&lt;LI data-sourcepos="27:1-31:78"&gt;QUARTILE: Quartile used to determine which quartile the market capitalization falls into
&lt;UL data-sourcepos="28:5-31:78"&gt;
&lt;LI data-sourcepos="28:5-28:47"&gt;0: Smallest (market capitalization 0-25%)&lt;/LI&gt;
&lt;LI data-sourcepos="29:5-29:46"&gt;1: Medium (market capitalization 25-50%)&lt;/LI&gt;
&lt;LI data-sourcepos="30:5-30:46"&gt;2: Large (market capitalization 50-100%)&lt;/LI&gt;
&lt;LI data-sourcepos="31:5-31:78"&gt;Some stocks have no market capitalization and are classified as "nosize"&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="32:1-32:42"&gt;SIZE: Corresponds to the quartiles above&lt;/LI&gt;
&lt;LI data-sourcepos="33:1-34:0"&gt;RET: Daily return: (Today's closing price - Yesterday's closing price) / Yesterday's closing price&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="35:1-35:13"&gt;&lt;STRONG&gt;Objective&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="37:1-37:222"&gt;Calculate the one-week and one-month returns (using the RET column) for stocks that break out to a new high or new low each day, weighted by market capitalization and arithmetic average. This results in 24 sets of returns:&lt;/P&gt;
&lt;P data-sourcepos="39:1-39:18"&gt;2 * 3 * 2 * 2 = 24&lt;/P&gt;
&lt;P data-sourcepos="41:1-41:15"&gt;&lt;STRONG&gt;More portfolio flag/column explanation&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-sourcepos="44:5-48:0"&gt;
&lt;LI data-sourcepos="44:5-44:253"&gt;Max: Stocks that break out to a new high on certain day. However, the company must have been in existence for at least one year to be considered a new high. Stocks that set a new high within two days of their inception are not included in Max.&lt;/LI&gt;
&lt;LI data-sourcepos="45:5-45:65"&gt;Min: Stocks that break out to a new low on the certain day.&lt;/LI&gt;
&lt;LI data-sourcepos="46:5-46:35"&gt;Comparison: Remaining stocks.&lt;/LI&gt;
&lt;LI data-sourcepos="47:5-48:0"&gt;Unqualified: Data from the first year, not included in return calculations, but prices are still used to determine historical highs and lows.&lt;/LI&gt;
&lt;/UL&gt;
&lt;OL data-sourcepos="43:1-57:0"&gt;
&lt;LI data-sourcepos="49:1-51:0"&gt;
&lt;P data-sourcepos="49:4-49:41"&gt;Calculate daily market capitalization:&lt;/P&gt;
&lt;UL data-sourcepos="50:5-51:0"&gt;
&lt;LI data-sourcepos="50:5-51:0"&gt;MV = P * CFACSHR * SHROUT&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="52:1-54:0"&gt;
&lt;P data-sourcepos="52:4-52:30"&gt;Assign stocks to quartiles:&lt;/P&gt;
&lt;UL data-sourcepos="53:5-54:0"&gt;
&lt;LI data-sourcepos="53:5-54:0"&gt;Use the QUARTILE column to determine which quartile each stock falls into.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="55:1-57:0"&gt;
&lt;P data-sourcepos="55:4-55:76"&gt;Calculate weighted and arithmetic average returns for each set of stocks:&lt;/P&gt;
&lt;UL data-sourcepos="56:5-57:0"&gt;
&lt;LI data-sourcepos="56:5-57:0"&gt;For each of the 24 sets of stocks (portfolio defined by breakout, size, weighting method, and stock group), calculate the one-week and one-month returns using both market capitalization weighting and arithmetic averaging.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-sourcepos="58:1-58:10"&gt;&lt;STRONG&gt;Output&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="58:1-58:10"&gt;A table with the following category&lt;BR /&gt;&lt;SPAN&gt;2 new highs and lows (Max vs Min )&lt;/SPAN&gt;portfolio Breakout&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&lt;SPAN&gt;*3 sizes (Small vs Mid vs Big) &lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&lt;SPAN&gt;*2 weighting methods (&lt;/SPAN&gt;Market capitalization-weighted return&amp;nbsp;&lt;SPAN&gt;vs equal-weighted)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&lt;SPAN&gt; *2 groups of stocks (all stocks vs those that have reached new highs or lows)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;*2 Return type (one-week or one-month)&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;table may seems like the following&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Huddart.JPG" style="width: 999px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/96189iA0EB59C8B94AFC2F/image-size/large?v=v2&amp;amp;px=999" role="button" title="Huddart.JPG" alt="Huddart.JPG" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-sourcepos="60:1-60:35"&gt;&lt;BR /&gt;&lt;STRONG style="font-family: inherit;"&gt;Additional notes&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-sourcepos="72:1-74:0"&gt;
&lt;LI data-sourcepos="72:1-72:66"&gt;The calculation should be performed daily to update the returns.&lt;/LI&gt;
&lt;LI data-sourcepos="73:1-74:0"&gt;The results can be used to analyze the performance of different breakout strategies and stock groups.&lt;BR /&gt;&lt;BR /&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;DM'LOG; CLEAR; OUT; CLEAR; ODSRESULTS; CLEAR;';
%LET FOLDER=%STR(C:\USERS\ALAIN\ONEDRIVE\桌面\HIGH);
LIBNAME HIGH "&amp;amp;FOLDER";

DATA HH;
 SET HIGH.HH;
 IF CFACPR=0 THEN DELETE;
RUN;

/*
DATA HH;
	SET	HH;
	IF _N_ &amp;lt;=1000;
RUN;
*/

PROC SORT 
  DATA=HH (KEEP  =SHRCD EXCHCD PERMNO DATE PRC CFACPR SHROUT CFACSHR RET
                      WHERE =( SHRCD IN (10,11) AND EXCHCD IN (1,2,3,31,32,33) )
                      ) 

OUT=HL(DROP=SHRCD EXCHCD );
  BY PERMNO DATE;
RUN;

DATA HL; 
    SET HL; 
    BY PERMNO DATE; 
    RETAIN H L 0; 
    P=ABS(DIVIDE (PRC, CFACPR));
    IF FIRST.PERMNO THEN H = P; 
    IF FIRST.PERMNO THEN L = P;
    H = MAX(H, P); 
    L = MIN(L, P);
 DROP  PRC CFACPR;
   RUN; /* PERMNO DATE  SHROUT CFACSHR H L P */

DATA MK (DROP=_:);
  SET HL;
  BY PERMNO DATE; 

  RETAIN _FIRST_DATE_QUALIFIED . 
         _H   .                 
         _H_DATE .              
         _L   .                 
         _L_DATE .              
          PORTFOLIO 
;             
LENGTH  PORTFOLIO $11;

  IF FIRST.PERMNO THEN DO;
    CALL MISSING(OF _:);
    _FIRST_DATE_QUALIFIED=INTNX('YEAR',DATE,1,'SAME')+1;
  END;

  IF _H=. THEN _H=P;
  IF _L=. THEN _L=P;

  IF P ^=. THEN DO;
    IF P &amp;gt; _H AND DATE &amp;gt;= INTNX('MONTH', _H_DATE, 1, 'SAME') THEN DO;
      _H=P;
      _H_DATE=DATE;
      PORTFOLIO='MAX';
    END;

    ELSE IF P &amp;lt; _L AND DATE &amp;gt;= INTNX('MONTH', _L_DATE, 1, 'SAME') THEN DO;
      _L=P;
      _L_DATE=DATE;
      PORTFOLIO='MIN';
    END;

    ELSE PORTFOLIO='COMPARISON';
  END;

  IF DATE &amp;gt;= _FIRST_DATE_QUALIFIED THEN DO;
      H = _H;
      H_DATE = _H_DATE;
      L = _L;
      L_DATE = _L_DATE;
  END;

  IF DATE &amp;lt; _FIRST_DATE_QUALIFIED THEN DO;
    PORTFOLIO = 'UNQUALIFIED';
  END;

  FORMAT H_DATE L_DATE YYMMDD10. ;

RUN;


DATA MV;
 SET MK;
 BY PERMNO DATE; 

 RETAIN 
 MV
 LAST_MONTH_END; 

 LAST_MONTH_END = INTNX('MONTH', DATE, -1, 'END');
 FORMAT LAST_MONTH_END YYMMDD10. ;

 MV = P * (SHROUT*CFACSHR) ;

RUN;

data LMV;
  set MV ;
  by permno date ;
  lag_MV = lag(MV);
  if first.permno then call missing(lag_MV,previous_MV);
  else if month(date) ne month(lag(date)) then previous_MV=lag_MV;
  retain previous_MV;
/*  drop lag_MV;*/
  run;


PROC SORT DATA=LMV;
    BY DATE PERMNO DESCENDING previous_MV;
RUN;

PROC RANK DATA=LMV OUT=RANKED_DATA GROUPS=4 TIES=LOW;
  BY DATE;
  VAR previous_MV;
  RANKS QUARTILE;
RUN;

/*
proc contents data=RANKED_DATA; 
run;
*/


DATA SMB;
    SET RANKED_DATA; 
RETAIN 
    SIZE
	;             
    LENGTH  SIZE $6;
    IF QUARTILE = 0 THEN SIZE = 'SMALL';
    else IF QUARTILE = 1 THEN SIZE = 'MID';
    else IF QUARTILE IN (2,3) THEN SIZE ='BIG';
    ELSE SIZE ='NOSIZE';
RUN;



data filtered_data;
    set SMB;
    where date between '24OCT1979'd and '01NOV1979'd;
run;

PROC EXPORT DATA= WORK.FILTERED_DATA 
            OUTFILE= "C:\Users\alain\OneDrive\桌面\check.xls" 
            DBMS=EXCEL REPLACE;
     SHEET="check"; 
RUN;


/*
DATA See;
  SET SMB(OBS=500);
  PUT (_ALL_) (+0);
RUN;





&lt;/CODE&gt;&lt;/PRE&gt;
&lt;BR /&gt;&lt;A title="whole data" href="https://drive.google.com/file/d/1grx_6p-yVMVzrzvVjdtfwyFUjRpq10W6/view?usp=drive_link" target="_self"&gt;https://drive.google.com/file/d/1grx_6p-yVMVzrzvVjdtfwyFUjRpq10W6/view?usp=drive_link&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 05 May 2024 14:57:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-calculate-48-sets-of-returns/m-p/927098#M364873</guid>
      <dc:creator>Irenelee</dc:creator>
      <dc:date>2024-05-05T14:57:20Z</dc:date>
    </item>
    <item>
      <title>Re: How to calculate 48 sets of returns</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-calculate-48-sets-of-returns/m-p/927122#M364879</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/465079"&gt;@Irenelee&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you for providing a lot of information including your current code and data upfront. What normally works best in the forums here is asking for help for targeted challenges. I feel your request is a bit too broad - but who knows, may be someone in your field has already done something similar and is willing to share actual code or at least give you pointers how to proceed.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You would likely get more people helping if:&lt;/P&gt;
&lt;P&gt;1. Share less data. Just a representative sample that's sufficient for the problem.&lt;/P&gt;
&lt;P&gt;2. Explain in as much detail as you can the logic required to get from your sample data to the desired result.&lt;/P&gt;
&lt;P&gt;3. Show the desired result based on your sample data. This allows us to test the code we propose.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A lot of people won't download data shared via a link. The attached create_data.sas file is data step code that creates a table Have with the source data you shared via link.&lt;/P&gt;</description>
      <pubDate>Mon, 06 May 2024 03:09:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-calculate-48-sets-of-returns/m-p/927122#M364879</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2024-05-06T03:09:18Z</dc:date>
    </item>
  </channel>
</rss>

