<?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: How to compute price difference for 10-second windows in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716793#M221602</link>
    <description>&lt;PRE&gt;data have;
input Time :time8. Volume Price Date :ddmmyy10.;
format Time time8. Date ddmmyy10.;
datetime=dhms(date,0,0,time);
datalines;
10:02:04 100 100.25 10.01.2021 
10:02:07 200 100.35 10.01.2021 
10:02:14 300 100.55 10.01.2021 
10:02:16 100 100.60 10.01.2021 
10:02:16 300 100.70 10.01.2021 
10:02:33 200 100.80 10.01.2021 
10:02:04 100 100.25 11.01.2021 
10:02:07 200 100.35 11.01.2021 
10:02:14 300 100.55 11.01.2021 
10:02:16 100 100.60 11.01.2021 
10:02:16 300 100.70 11.01.2021 
10:02:23 200 100.80 11.01.2021 
;

proc summary data=have nway;
class dateTime ;
var Price/weight=Volume;
output out=x(drop=_:) mean=;
run;proc sql;
create table want as
 select *,
  (price-(select price from x where datetime between a.datetime+1 and a.datetime+10 having datetime=max(datetime)))
  /price   as diff format = 8.4
  from have as a;
quit;&lt;/PRE&gt;</description>
    <pubDate>Thu, 04 Feb 2021 12:17:46 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2021-02-04T12:17:46Z</dc:date>
    <item>
      <title>How to compute price difference for 10-second windows</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716775#M221588</link>
      <description>&lt;P&gt;Dear all,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I hope you are doing well despite the pandemic.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The content of the question is copied from&amp;nbsp;&lt;A href="https://communities.sas.com/t5/SAS-Programming/Computing-10-second-price-difference/td-p/716368" target="_blank"&gt;https://communities.sas.com/t5/SAS-Programming/Computing-10-second-price-difference/td-p/716368 &lt;/A&gt;and then minor adjustments have been made.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have the following dataset:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Time&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; Volume&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Price&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Date&lt;/P&gt;&lt;P&gt;10:02:04&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.25&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10.01.2021&lt;/P&gt;&lt;P&gt;10:02:07&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;200&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.35&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10.01.2021&lt;/P&gt;&lt;P&gt;10:02:14&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;300&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.55&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10.01.2021&lt;/P&gt;&lt;P&gt;10:02:16&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.60&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10.01.2021&lt;/P&gt;&lt;P&gt;10:02:16&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;300&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.70&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10.01.2021&amp;nbsp;&lt;/P&gt;&lt;P&gt;10:02:23&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;200&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.80&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10.01.2021&lt;/P&gt;&lt;P&gt;10:02:04&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.25&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11.01.2021&lt;/P&gt;&lt;P&gt;10:02:07&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;200&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.35&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11.01.2021&lt;/P&gt;&lt;P&gt;10:02:14&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;300&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.55&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11.01.2021&lt;/P&gt;&lt;P&gt;10:02:16&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.60&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11.01.2021&lt;/P&gt;&lt;P&gt;10:02:16 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;300&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 100.70&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11.01.2021&amp;nbsp;&lt;/P&gt;&lt;P&gt;10:02:23&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;200&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.80&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11.01.2021&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And here is what I want:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Time&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Volume&amp;nbsp; &amp;nbsp; &amp;nbsp; Price&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; Diff&lt;/P&gt;&lt;P&gt;10:02:04&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 100.25&amp;nbsp; 10.01.2021&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -0.0029 = (100.25 - 100.55)/100.25 = (price(t)-price(t+10))/price(t)&lt;/P&gt;&lt;P&gt;10:02:07&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;200&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 100.35&amp;nbsp; 10.01.2021&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -0.0032 = (100.35 - 100.675)/100.35&lt;/P&gt;&lt;P&gt;10:02:14&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;300&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 100.55&amp;nbsp; 10.01.2021&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-0.0012 =&amp;nbsp;(100.55 - 100.675)/100.55&lt;/P&gt;&lt;P&gt;10:02:16&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 100.60&amp;nbsp; 10.01.2021&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;. (because there is not observation within 10 seconds window)&lt;/P&gt;&lt;P&gt;10:02:16&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;300&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 100.70&amp;nbsp; 10.01.2021&lt;/P&gt;&lt;P&gt;10:02:33&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;200&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;100.80&amp;nbsp; &amp;nbsp;10.01.2021&lt;/P&gt;&lt;P&gt;The same computations for the next day&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;In short, I need to find price change over 10 seconds windows with some modifications:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;1. .If I do not have p(t+10), then I need to select the price that is closest to p(t+10). If I do not have any value within 10 second windows then, I should get ".".&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;2. If I have two prices in one second, I need to compute the volume-weighted average price for this second and then use it. For example, in my data, I have an interval of 10:02:07. I do not have a price at 10:02:17 and the closest one is the price at 10:02:16. However, in this interval, I have two prices. Therefore, I am computing the volume-weighted average price for this interval (((100/400)*100.60 + (300/400)*100.70) = 100.675) and then use this one.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;3. I need to do same computation for each day. Cross days are not allowed. So, each day will have a new start. I have separate date and time variable. Date format is&amp;nbsp;DDMMYYN8. and time format is&amp;nbsp;TOD.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Thank you!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 04 Feb 2021 09:45:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716775#M221588</guid>
      <dc:creator>AhmetHakan</dc:creator>
      <dc:date>2021-02-04T09:45:19Z</dc:date>
    </item>
    <item>
      <title>Re: How to compute price difference for 10-second windows</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716780#M221593</link>
      <description>&lt;P&gt;A few tweaks to my original program gives you what you want.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input Time :time8. Volume Price Date :ddmmyy10.;
format Time time8. Date ddmmyy10.;
datalines;
10:02:04 100 100.25 10.01.2021 
10:02:07 200 100.35 10.01.2021 
10:02:14 300 100.55 10.01.2021 
10:02:16 100 100.60 10.01.2021 
10:02:16 300 100.70 10.01.2021 
10:02:33 200 100.80 10.01.2021 
10:02:04 100 100.25 11.01.2021 
10:02:07 200 100.35 11.01.2021 
10:02:14 300 100.55 11.01.2021 
10:02:16 100 100.60 11.01.2021 
10:02:16 300 100.70 11.01.2021 
10:02:23 200 100.80 11.01.2021 
;

data want(keep = Time Volume Price dif);
   if _N_ = 1 then do;
      dcl hash h(multidata : "Y", ordered : "Y");
      h.definekey("d", "t");
      h.definedata("d", "t", "v", "p");
      h.definedone();
      dcl hiter hi("h");

      dcl hash hh();
      hh.definekey("d", "t");
      hh.definedata("s");
      hh.definedone();

      do until (z);
         set have end = z;
         h.add(key : date, key : time, data : date, data : time, data : Volume, data : Price);
         if hh.find(key : date, key : Time) ne 0 then s = Volume;
         else                                         s + Volume;
         hh.replace(key : date, key : Time, data : s);
      end;
   end;

   set have;
   d = .; t = .; v = .; p = .; s = .;

   if h.find(key : Date, key : Time + 10) = 0 then mt = t;

   else do;
      rc = hi.setcur(key : Date, key : Time);
      do i = 1 by 1 while(hi.next() = 0 &amp;amp; Date = d);
         if t - time &amp;gt; 10 then do;
            if i = 1 then mt = .;
            leave;
         end;
         if t &amp;gt; time then mt = t;
      end;
   end;

   rc = hh.find(key: date, key : mt);
   rc = h.reset_dup();

   do while (h.do_over(key : date, key : mt) = 0);
      pp = sum(pp, divide(v, s) * p);
   end;

   dif = (Price - pp) / Price;

   format dif 8.4;

run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Result:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;Time      Volume  Price    dif 
10:02:04  100     100.25  -0.0030 
10:02:07  200     100.35  -0.0032 
10:02:14  300     100.55  -0.0012 
10:02:16  100     100.60   . 
10:02:16  300     100.70   . 
10:02:33  200     100.80   . 
10:02:04  100     100.25  -0.0030 
10:02:07  200     100.35  -0.0032 
10:02:14  300     100.55  -0.0025 
10:02:16  100     100.60  -0.0020 
10:02:16  300     100.70  -0.0010 
10:02:23  200     100.80   . &lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Feb 2021 10:13:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716780#M221593</guid>
      <dc:creator>PeterClemmensen</dc:creator>
      <dc:date>2021-02-04T10:13:24Z</dc:date>
    </item>
    <item>
      <title>Re: How to compute price difference for 10-second windows</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716781#M221594</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31304"&gt;@PeterClemmensen&lt;/a&gt;&amp;nbsp;,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Many thanks. You saved my day! I will try to fully understand all steps.&lt;/P&gt;</description>
      <pubDate>Thu, 04 Feb 2021 10:18:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716781#M221594</guid>
      <dc:creator>AhmetHakan</dc:creator>
      <dc:date>2021-02-04T10:18:00Z</dc:date>
    </item>
    <item>
      <title>Re: How to compute price difference for 10-second windows</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716793#M221602</link>
      <description>&lt;PRE&gt;data have;
input Time :time8. Volume Price Date :ddmmyy10.;
format Time time8. Date ddmmyy10.;
datetime=dhms(date,0,0,time);
datalines;
10:02:04 100 100.25 10.01.2021 
10:02:07 200 100.35 10.01.2021 
10:02:14 300 100.55 10.01.2021 
10:02:16 100 100.60 10.01.2021 
10:02:16 300 100.70 10.01.2021 
10:02:33 200 100.80 10.01.2021 
10:02:04 100 100.25 11.01.2021 
10:02:07 200 100.35 11.01.2021 
10:02:14 300 100.55 11.01.2021 
10:02:16 100 100.60 11.01.2021 
10:02:16 300 100.70 11.01.2021 
10:02:23 200 100.80 11.01.2021 
;

proc summary data=have nway;
class dateTime ;
var Price/weight=Volume;
output out=x(drop=_:) mean=;
run;proc sql;
create table want as
 select *,
  (price-(select price from x where datetime between a.datetime+1 and a.datetime+10 having datetime=max(datetime)))
  /price   as diff format = 8.4
  from have as a;
quit;&lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Feb 2021 12:17:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-compute-price-difference-for-10-second-windows/m-p/716793#M221602</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2021-02-04T12:17:46Z</dc:date>
    </item>
  </channel>
</rss>

