<?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 Re: Excluding stock (i) from portfolio of stocks in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Excluding-stock-i-from-portfolio-of-stocks/m-p/461059#M284732</link>
    <description>&lt;P&gt;What you can do is create a dataset of daily mean prices over ALL permno's for each date.&amp;nbsp; Then read your original data, get the corresponding mean price for that date, and adjust it for the given permno price.&amp;nbsp; I.e.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; complimentary_mean =&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (all_permno_mean * N_permnos - price)/(N_permnos-1)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Generating the means by date can be most easily done by asking proc summary to write dataset MEANS_BY_DATE below.&amp;nbsp; Then there are multiple ways to link the all_permno_means by date with the data set.&amp;nbsp; Below uses SET ... KEY= statement:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
  input date :ddmmyy8.  permno price;
  format date date9.;
datalines;
20/1/2010  10001 6
21/1/2010  10001 2
22/1/2010  10001 5
20/1/2010  10002 2
21/1/2010  10002 4
22/1/2010  10002 2
20/1/2010  10003 3  
21/1/2010  10003 2  
22/1/2010  10003 1
20/1/2010  10004 6
21/1/2010  10004 7
22/1/2010  10004 8
run;
proc summary data=have  nway;
  class date;
  var price;
  output out=means_by_date  (index=(date) keep=date all_permnos_mean n_permnos)  mean=all_permnos_mean n=n_permnos;
run;

data want;
  set have;
  set means_by_date key=date;
  complimentary_price=((n_permnos*all_permnos_mean) - price)/(n_permnos-1);
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Now if you are using a large universe (say 1,000 permnos per day) then you the &lt;EM&gt;&lt;STRONG&gt;SET ... KEY=&lt;/STRONG&gt;&lt;/EM&gt; statement loses efficiency, since it rereads each daily mean 1,000 times.&amp;nbsp; Instead you can put the data in a memory-resident hash object, keyed on DATE, as here:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc summary data=have  nway;
  class date;
  var price;
  output out=means_by_date  (index=(date) keep=date all_permnos_mean n_permnos)  mean=all_permnos_mean n=n_permnos;
run;

data want;
  set have means_by_date (obs=0);
  if _n_=1 then do;
    declare hash h (dataset:'means_by_date');
      h.definekey('date');
      h.definedata(all:'Y');
      h.definedone();
  end;
  rc=h.find();
  complimentary_price=((n_permnos*all_permnos_mean) - price)/(n_permnos-1);
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Wed, 09 May 2018 14:54:37 GMT</pubDate>
    <dc:creator>mkeintz</dc:creator>
    <dc:date>2018-05-09T14:54:37Z</dc:date>
    <item>
      <title>Excluding stock (i) from portfolio of stocks</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Excluding-stock-i-from-portfolio-of-stocks/m-p/460912#M284730</link>
      <description>&lt;P&gt;Hi All&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks in advance for the help to get the right codes to solve the problem below;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;I have the following table of dates and company stock prices:&lt;/SPAN&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;date&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;permno&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;price&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;20/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;6&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;21/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;22/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;5&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;20/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10002&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;21/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10002&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;4&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;22/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10002&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;20/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10003&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;3&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;21/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10003&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;22/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10003&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;20/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10004&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;6&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;21/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10004&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;7&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;22/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10004&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;8&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;From the above table,&amp;nbsp; I would like to create a portfolio table which is the average price of all stocks for that specific date where i exclude from the portfolio the stock of interest as shown below; Thus in calculating the portfolio of stock price for&amp;nbsp;instance for a firm with permno number 10001 for date 20/1/2010, i&amp;nbsp;calculated the average&amp;nbsp;of stock&amp;nbsp; price for firms 10002 , 10003 and 10004 thus 2+3+6/3=3.6667 as shown in the table below thus i excluded the price of firm with permno 10001 which is the firm of interest; I do same for the other dates etc and for the other firms.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;date&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;permno&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;price&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;Port-price&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;20/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;6&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;3.666667&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;21/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;4.333333&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;22/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10001&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;5&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;3.666667&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;20/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10002&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;1.333333&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;21/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10002&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;4&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;3.666667&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;22/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10002&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;4.666667&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;20/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10003&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;3&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;4.666667&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;21/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10003&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;4.333333&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;22/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10003&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;5&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;20/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10004&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;6&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;3.333333&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;21/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10004&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;7&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2.666667&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;22/1/2010&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10004&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;8&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;2.666667&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help for me to enable me code run the above problem. Please&amp;nbsp; in my data I have thousands of dates and&amp;nbsp;thousand&amp;nbsp;of companies, so it will be very practical for me if the code can handle any number of dates and companies.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Also attached is a sample of my data set.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you&lt;/P&gt;</description>
      <pubDate>Wed, 09 May 2018 04:46:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Excluding-stock-i-from-portfolio-of-stocks/m-p/460912#M284730</guid>
      <dc:creator>EJAA</dc:creator>
      <dc:date>2018-05-09T04:46:44Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding stock (i) from portfolio of stocks</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Excluding-stock-i-from-portfolio-of-stocks/m-p/460914#M284731</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table want as
select * ,mean(price) as port_price
from have
group by dates;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 09 May 2018 04:59:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Excluding-stock-i-from-portfolio-of-stocks/m-p/460914#M284731</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2018-05-09T04:59:50Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding stock (i) from portfolio of stocks</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Excluding-stock-i-from-portfolio-of-stocks/m-p/461059#M284732</link>
      <description>&lt;P&gt;What you can do is create a dataset of daily mean prices over ALL permno's for each date.&amp;nbsp; Then read your original data, get the corresponding mean price for that date, and adjust it for the given permno price.&amp;nbsp; I.e.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; complimentary_mean =&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (all_permno_mean * N_permnos - price)/(N_permnos-1)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Generating the means by date can be most easily done by asking proc summary to write dataset MEANS_BY_DATE below.&amp;nbsp; Then there are multiple ways to link the all_permno_means by date with the data set.&amp;nbsp; Below uses SET ... KEY= statement:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
  input date :ddmmyy8.  permno price;
  format date date9.;
datalines;
20/1/2010  10001 6
21/1/2010  10001 2
22/1/2010  10001 5
20/1/2010  10002 2
21/1/2010  10002 4
22/1/2010  10002 2
20/1/2010  10003 3  
21/1/2010  10003 2  
22/1/2010  10003 1
20/1/2010  10004 6
21/1/2010  10004 7
22/1/2010  10004 8
run;
proc summary data=have  nway;
  class date;
  var price;
  output out=means_by_date  (index=(date) keep=date all_permnos_mean n_permnos)  mean=all_permnos_mean n=n_permnos;
run;

data want;
  set have;
  set means_by_date key=date;
  complimentary_price=((n_permnos*all_permnos_mean) - price)/(n_permnos-1);
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Now if you are using a large universe (say 1,000 permnos per day) then you the &lt;EM&gt;&lt;STRONG&gt;SET ... KEY=&lt;/STRONG&gt;&lt;/EM&gt; statement loses efficiency, since it rereads each daily mean 1,000 times.&amp;nbsp; Instead you can put the data in a memory-resident hash object, keyed on DATE, as here:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc summary data=have  nway;
  class date;
  var price;
  output out=means_by_date  (index=(date) keep=date all_permnos_mean n_permnos)  mean=all_permnos_mean n=n_permnos;
run;

data want;
  set have means_by_date (obs=0);
  if _n_=1 then do;
    declare hash h (dataset:'means_by_date');
      h.definekey('date');
      h.definedata(all:'Y');
      h.definedone();
  end;
  rc=h.find();
  complimentary_price=((n_permnos*all_permnos_mean) - price)/(n_permnos-1);
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 09 May 2018 14:54:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Excluding-stock-i-from-portfolio-of-stocks/m-p/461059#M284732</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2018-05-09T14:54:37Z</dc:date>
    </item>
  </channel>
</rss>

