<?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: Creating rolling 30-day returns variable in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157178#M41215</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hey &lt;A __default_attr="2746" __jive_macro_name="user" class="jive_macro jive_macro_user" href="https://communities.sas.com/"&gt;&lt;/A&gt; and &lt;A __default_attr="255172" __jive_macro_name="user" class="jive_macro jive_macro_user" href="https://communities.sas.com/"&gt;&lt;/A&gt;,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have been playing with the code that you each posted and have still not been able to make it work.&amp;nbsp; I have gone back and attached an exerpt of the dataset that I am working with.&amp;nbsp; The entire dataset is large, something like 700MB and has 11mm observations.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When I run the following code (obviously calling my own libraries, etc) the code just sort of sits there and does nothing.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;&amp;nbsp; create table mylib.twt2_2 as&lt;/P&gt;&lt;P&gt;&amp;nbsp; select t1.CUSIP,&lt;/P&gt;&lt;P&gt;&amp;nbsp; t1.DATE,&lt;/P&gt;&lt;P&gt;&amp;nbsp; sum(t2.RET) as cum_ret,&lt;/P&gt;&lt;P&gt;&amp;nbsp; exp(sum(log(1+t2.RET)))-1 as compo_ret,&lt;/P&gt;&lt;P&gt;&amp;nbsp; count(t2.RET) as n&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; from mylib.twt2_1 as t1&lt;/P&gt;&lt;P&gt;&amp;nbsp; left join mylib.twt2_1 as t2&lt;/P&gt;&lt;P&gt;&amp;nbsp; on t2.date-t1.date between 0 and 30 &amp;amp; (t1.CUSIP = t2.CUSIP)&lt;/P&gt;&lt;P&gt;&amp;nbsp; group by t1.CUSIP, t1.date;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Could you guys have a look at the dataset that I have attached and see what may be going wrong?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks!!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sun, 28 Sep 2014 12:50:19 GMT</pubDate>
    <dc:creator>mahler_ji</dc:creator>
    <dc:date>2014-09-28T12:50:19Z</dc:date>
    <item>
      <title>Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157168#M41205</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello All,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I would like to create a variable that, for each day, creates a variable that represents the following 30 days of returns.&amp;nbsp; The data takes the following form:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="text-decoration: underline;"&gt;Firm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Date&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ret&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/1/11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .1&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/2/11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .01&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/3/11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .1&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/4/11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .2&lt;/P&gt;&lt;P&gt;.&lt;/P&gt;&lt;P&gt;.&lt;/P&gt;&lt;P&gt;.&lt;/P&gt;&lt;P&gt;.&lt;/P&gt;&lt;P&gt;B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/1/11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .05&lt;/P&gt;&lt;P&gt;B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/2/11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .1&lt;/P&gt;&lt;P&gt;.&lt;/P&gt;&lt;P&gt;.&lt;/P&gt;&lt;P&gt;.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So the idea is for the 1/1/11 observation for Firm A, the variable would return the cumulative return, starting that day, and going forward one day.&amp;nbsp; Just to make it simple, we could use addition, rather than a compounding return:&amp;nbsp; .1 + .01 + .1 + .2 and so on for thirty days.&amp;nbsp; And for the 1/2/11 observation for Firm A, it would be: .01 + .1 + .2 and so on for thirty more days.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;And this would continue with all the firms that I have.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any help would be greatly appreciated. I am going to be downloading a small file for you guys to play with if you need data to work out the problem.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;John&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 23 Sep 2014 20:44:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157168#M41205</guid>
      <dc:creator>mahler_ji</dc:creator>
      <dc:date>2014-09-23T20:44:26Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157169#M41206</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Obvious question: What should happen to the later records for each firm, where there are less than 30 subsequent days of data?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 24 Sep 2014 01:51:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157169#M41206</guid>
      <dc:creator>dkb</dc:creator>
      <dc:date>2014-09-24T01:51:36Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157170#M41207</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hey &lt;A __default_attr="841015" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;, thanks for your question.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It doesn't really matter, because I am going to trim the data to get rid of those observations.&amp;nbsp; So they can either return something wrong or return a "."&amp;nbsp; Either one will do!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any help would be amazing!&amp;nbsp; I am having a hard time figuring this one out.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;John&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 24 Sep 2014 01:55:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157170#M41207</guid>
      <dc:creator>mahler_ji</dc:creator>
      <dc:date>2014-09-24T01:55:10Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157171#M41208</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;A SQL self join is a quick way, this will return an invalid number if you have less than 30 days of records. You could add a count to keep track of how many records and either eliminate them or set them to missing in the same query if you wanted.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;(untested)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;create table want as&lt;/P&gt;&lt;P&gt;select a.firm, a.date, sum(b.ret) as cum_ret&lt;/P&gt;&lt;P&gt;from have as a&lt;/P&gt;&lt;P&gt;left join have as b&lt;/P&gt;&lt;P&gt;on b.date-a.date between 0 and 30&lt;/P&gt;&lt;P&gt;order by a.firm, a.date;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 24 Sep 2014 02:37:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157171#M41208</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2014-09-24T02:37:30Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157172#M41209</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Should work, but requires a merge:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Data A (Keep=Firm Date R);&lt;BR /&gt;&amp;nbsp; Do Firm_Nr=1 To 3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do Time=0 To 50;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Firm=Byte(Firm_Nr+64);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Date=IntNX('day',"01JAN2000"d,Time);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; R=Normal(1)*0.02+0.03;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Output;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End;&lt;BR /&gt;&amp;nbsp; End;&lt;BR /&gt;&amp;nbsp; Format Date Date9.;&lt;BR /&gt;Run;&lt;/P&gt;&lt;P&gt;%Let Periods=30;&lt;BR /&gt;Data B;&lt;BR /&gt;&amp;nbsp; Retain Total;&lt;BR /&gt;&amp;nbsp; Set A;&lt;BR /&gt;&amp;nbsp; Date=IntNX('day',Date,-&amp;amp;Periods.);&lt;BR /&gt;&amp;nbsp; By Firm;&lt;BR /&gt;&amp;nbsp; If First.Firm Then Do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Total=0;&lt;BR /&gt; Count=0;&lt;BR /&gt;&amp;nbsp; End;&lt;BR /&gt;&amp;nbsp; Count+1;&lt;BR /&gt;&amp;nbsp; Drop_Obs=Lag&amp;amp;Periods.(R);&lt;BR /&gt;&amp;nbsp; If Count gt &amp;amp;Periods Then Total=Sum(Total,R,-Drop_Obs);&lt;BR /&gt;&amp;nbsp; Else Total=Sum(Total,R); &lt;BR /&gt;Run;&lt;/P&gt;&lt;P&gt;Data C;&lt;BR /&gt;&amp;nbsp; Merge A (in=inA) B (Keep=Firm Date Total in=inB);&lt;BR /&gt;&amp;nbsp; By Firm Date;&lt;BR /&gt;&amp;nbsp; If inA;&lt;BR /&gt;Run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 24 Sep 2014 08:20:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157172#M41209</guid>
      <dc:creator>user24feb</dc:creator>
      <dc:date>2014-09-24T08:20:49Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157173#M41210</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;John,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Let us have a small number of dates. There are 6 days for A and&lt;/P&gt;&lt;P&gt;4 for B. It can be made to work with 30 days or for any number of days.&lt;/P&gt;&lt;P&gt;Just change the macro variable, &amp;amp;days, to your context. Also, you need&lt;/P&gt;&lt;P&gt;to give the expected maximum number of dates. For instance, in the&lt;/P&gt;&lt;P&gt;following data set, Firm A has the maximum dates(6).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;An Array is used to save the RET values for a Firm at a time to&lt;/P&gt;&lt;P&gt;build up the cumulative sum of RETs. To be efficient, the sums&lt;/P&gt;&lt;P&gt;beyond &amp;amp;days, are made in such a way that one subtraction and&lt;/P&gt;&lt;P&gt;one addition are made for every day thereafter.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;As sums are cumulatively made and when the number of observations&lt;/P&gt;&lt;P&gt;forward are lesser than &amp;amp;days, partial sums are made, which you can take&lt;/P&gt;&lt;P&gt;or ignore. Once a Firm is finished, the next Firm is processed in&lt;/P&gt;&lt;P&gt;a DoW-loop.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data have;&lt;/P&gt;&lt;P&gt;informat Date mmddyy8.;&lt;/P&gt;&lt;P&gt;format Date date10.;&lt;/P&gt;&lt;P&gt;input Firm $ Date Ret;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/1/11&amp;nbsp;&amp;nbsp; .1&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/2/11&amp;nbsp;&amp;nbsp; .01&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/3/11&amp;nbsp;&amp;nbsp; .1&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/4/11&amp;nbsp;&amp;nbsp; .2&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/5/11&amp;nbsp;&amp;nbsp; .3&lt;/P&gt;&lt;P&gt;A&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/6/11&amp;nbsp;&amp;nbsp; .2&lt;/P&gt;&lt;P&gt;B&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/1/11&amp;nbsp;&amp;nbsp; .05&lt;/P&gt;&lt;P&gt;B&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/2/11&amp;nbsp;&amp;nbsp; .1&lt;/P&gt;&lt;P&gt;B&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/3/11&amp;nbsp;&amp;nbsp; .2&lt;/P&gt;&lt;P&gt;B&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/4/11&amp;nbsp;&amp;nbsp; .1&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data = have;&lt;/P&gt;&lt;P&gt;by Firm ;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let days = 3;&lt;/P&gt;&lt;P&gt;%let maxdates = 6;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data need;&lt;/P&gt;&lt;P&gt;array k[&amp;amp;maxdates] _temporary_;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do ind = 1 by 1 until(last.Firm);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by Firm;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k[ind] = Ret;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; sum_Ret = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; * Find first sum for &amp;amp;days ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do ind = 1 to &amp;amp;days;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum_Ret + k[ind];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do ind = 1 by 1 until(last.Firm);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by Firm;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ind = 1 then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; * Find subsequent sums by adjusting SUM_RET (removing and adding RET);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum_Ret +- k[ind - 1];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ind &amp;lt;= (dim(k) - &amp;amp;days + 1) then sum_Ret ++ k[ind + &amp;amp;days - 1];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; call missing(of k&lt;LI&gt;);&lt;/LI&gt;&lt;/P&gt;&lt;P&gt;drop ind;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Muthia Kachirayan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 25 Sep 2014 10:32:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157173#M41210</guid>
      <dc:creator>KachiM</dc:creator>
      <dc:date>2014-09-25T10:32:21Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157174#M41211</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hey &lt;A __default_attr="255172" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you, as always, for your help.&amp;nbsp; For some reason, the code that you wrote is "hanging," meaning that I submit it and then it just sits there, without giving me an error.&amp;nbsp; I don't really know what is going on, but I really like the idea behind your code, as it seems very intuitive to me.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Do you have any idea why this may be?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;John&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 00:04:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157174#M41211</guid>
      <dc:creator>mahler_ji</dc:creator>
      <dc:date>2014-09-28T00:04:27Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157175#M41212</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Try this slight modification:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;proc sql;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;create table want as&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;select &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; a.firm, &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; a.date, &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; sum(b.ret) as sum_ret, &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; exp(sum(log(1+b.ret)))-1 as compo_ret ,&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; count(b.ret) as n&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;from have as a&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;left join have as b&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;on a.firm=b.firm and b.date-a.date between 0 and 30&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;group by a.firm, a.date;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;quit;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You could also add the clause &lt;STRONG&gt;having n &amp;gt; 30&lt;/STRONG&gt; at the end of the query to keep conplete periods only.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PG&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 00:21:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157175#M41212</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2014-09-28T00:21:45Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157176#M41213</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hey &lt;A __default_attr="2746" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks for your help, I am going to to run this code right now. I thought that the issue might have had something to do with the fact that I had to "firm" requirement in the on statement.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Just checking, should there be two "bys" in the group by clause?&amp;nbsp; I have never seen that before!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;John&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 00:37:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157176#M41213</guid>
      <dc:creator>mahler_ji</dc:creator>
      <dc:date>2014-09-28T00:37:57Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157177#M41214</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;No! that was a typo. I corrected it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PG&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 01:40:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157177#M41214</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2014-09-28T01:40:45Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157178#M41215</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hey &lt;A __default_attr="2746" __jive_macro_name="user" class="jive_macro jive_macro_user" href="https://communities.sas.com/"&gt;&lt;/A&gt; and &lt;A __default_attr="255172" __jive_macro_name="user" class="jive_macro jive_macro_user" href="https://communities.sas.com/"&gt;&lt;/A&gt;,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have been playing with the code that you each posted and have still not been able to make it work.&amp;nbsp; I have gone back and attached an exerpt of the dataset that I am working with.&amp;nbsp; The entire dataset is large, something like 700MB and has 11mm observations.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When I run the following code (obviously calling my own libraries, etc) the code just sort of sits there and does nothing.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;&amp;nbsp; create table mylib.twt2_2 as&lt;/P&gt;&lt;P&gt;&amp;nbsp; select t1.CUSIP,&lt;/P&gt;&lt;P&gt;&amp;nbsp; t1.DATE,&lt;/P&gt;&lt;P&gt;&amp;nbsp; sum(t2.RET) as cum_ret,&lt;/P&gt;&lt;P&gt;&amp;nbsp; exp(sum(log(1+t2.RET)))-1 as compo_ret,&lt;/P&gt;&lt;P&gt;&amp;nbsp; count(t2.RET) as n&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; from mylib.twt2_1 as t1&lt;/P&gt;&lt;P&gt;&amp;nbsp; left join mylib.twt2_1 as t2&lt;/P&gt;&lt;P&gt;&amp;nbsp; on t2.date-t1.date between 0 and 30 &amp;amp; (t1.CUSIP = t2.CUSIP)&lt;/P&gt;&lt;P&gt;&amp;nbsp; group by t1.CUSIP, t1.date;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Could you guys have a look at the dataset that I have attached and see what may be going wrong?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks!!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 12:50:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157178#M41215</guid>
      <dc:creator>mahler_ji</dc:creator>
      <dc:date>2014-09-28T12:50:19Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157179#M41216</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I do not see your data.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;By the way did you try the ARRAY approach I posted. If you have problems to understand/use the ARRAY approach, I can help you as much as I can.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 14:11:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157179#M41216</guid>
      <dc:creator>KachiM</dc:creator>
      <dc:date>2014-09-28T14:11:43Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157180#M41217</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;What version of SAS are you using?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 16:30:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157180#M41217</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2014-09-28T16:30:07Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157181#M41218</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am not sure what is your BYVar in TEST1. I am assuming it is STOCK_SYMBOL. If it is not you may replace it by your choice. Here is the Array way. There are 2265 rows with 'A' which is more than the next symbol 'ABI'.&lt;/P&gt;&lt;P&gt;I have not checked for the gaps in the dates. It is better you pre-process the data set and fill the gaps with suitable value for RET before running this program.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let days = 30;&lt;/P&gt;&lt;P&gt;%let maxdates = 2265;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data need;&lt;/P&gt;&lt;P&gt;array k[&amp;amp;maxdates] _temporary_;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do ind = 1 by 1 until(last.stock_symbol);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set test1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by stock_symbol;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k[ind] = Ret;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; sum_Ret = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; * Find first sum for &amp;amp;days ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do ind = 1 to &amp;amp;days;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum_Ret + k[ind];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do ind = 1 by 1 until(last.stock_symbol);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set test1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by stock_symbol;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ind = 1 then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; * Find subsequent sums by adjusting SUM_RET (removing and adding RET);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum_Ret +- k[ind - 1];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ind &amp;lt;= (dim(k) - &amp;amp;days + 1) then sum_Ret ++ k[ind + &amp;amp;days - 1];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; call missing(of k&lt;LI&gt;);&lt;/LI&gt;&lt;/P&gt;&lt;P&gt;drop ind;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc print data = need;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope this works for you.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 17:24:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157181#M41218</guid>
      <dc:creator>KachiM</dc:creator>
      <dc:date>2014-09-28T17:24:36Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157182#M41219</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I notice that your dataset only includes weekdays. So a 30 day interval will include less than 30 datapoints. It is not clear how you want to handle that.&amp;nbsp; &lt;/P&gt;&lt;P&gt;Otherwise, the only thing being &lt;EM&gt;wrong&lt;/EM&gt; is your dataset is its size!&amp;nbsp; &lt;/P&gt;&lt;P&gt;If you have access to SAS/ETS, you should try &lt;STRONG&gt;proc expand&lt;/STRONG&gt; to get what you want: &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;/* Simple sum of returns */&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;proc expand data=sasforum.test1 out=test1;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;by permno notsorted;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;id date;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;convert ret=ret_30 / transformout=(reverse movsum 30 reverse);&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;/* Compounded product of returns */&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;proc expand data=sasforum.test1 out=test2;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;by permno notsorted;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;id date;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;convert ret=compo_ret_30 / transformout=(+1 log reverse movsum 30 reverse exp -1);&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;it should be a lot faster than SQL.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;(Tested with your example dataset)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PG&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 28 Sep 2014 21:49:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157182#M41219</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2014-09-28T21:49:37Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157183#M41220</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;In this code there are 2 pointers on the data: the current and the 30 day-ahead. This way you can maintain a moving sum, and output when you read from the current pointer.&lt;/P&gt;&lt;P&gt;Probably you want to delete obs where moving_cnt is too small (&amp;lt;=20). No problem if a day is missing.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=have;&lt;/P&gt;&lt;P&gt;by Firm Date;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let timeWindow=30;/*day*/&lt;/P&gt;&lt;P&gt;%let timePeriod=day;&lt;/P&gt;&lt;P&gt;data have_exp / view=have_exp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; date=intnx("&amp;amp;timePeriod.",Date,-&amp;amp;timeWindow.,'s');&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set have(in=inT) have_exp ;/*interleaving original and expiry datasets*/&lt;/P&gt;&lt;P&gt;&amp;nbsp; by Firm Date;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if first.Firm then do;/*initializing counters and sums at beginning of a group*/&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_cnt=0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_sum=.;&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_Ret=1;retain moving_Ret;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if inT then do;/*if transaction, then first output than calculate*/&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_cnt+(-1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_sum+(-Ret);&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_Ret=moving_Ret/(1+Ret);&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; else do;/*if expiry, then calculate*/&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_cnt+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_sum+Ret;&lt;/P&gt;&lt;P&gt;&amp;nbsp; moving_Ret=moving_Ret*(1+Ret);&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 29 Sep 2014 07:55:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157183#M41220</guid>
      <dc:creator>gergely_batho</dc:creator>
      <dc:date>2014-09-29T07:55:10Z</dc:date>
    </item>
    <item>
      <title>Re: Creating rolling 30-day returns variable</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157184#M41221</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello all, Thank you very much for all of your help.&amp;nbsp; I was able to get this to work, finally!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A __default_attr="2746" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt; and &lt;A __default_attr="255172" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;, thank you very much, and I was able to use a combination of what you gave to me to make this work.&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;By the way, I am using SAS 9.2.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;@muthia, I am going to email you privately about understanding arrays, as that is something that I really need to understand better!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks so much!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;John&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 29 Sep 2014 13:53:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Creating-rolling-30-day-returns-variable/m-p/157184#M41221</guid>
      <dc:creator>mahler_ji</dc:creator>
      <dc:date>2014-09-29T13:53:03Z</dc:date>
    </item>
  </channel>
</rss>

