<?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: calculate stock cost based on FIFO in New SAS User</title>
    <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787515#M32303</link>
    <description>&lt;P&gt;you don't need to input one by ont, because the macro will do that.&lt;/P&gt;</description>
    <pubDate>Tue, 28 Dec 2021 11:49:20 GMT</pubDate>
    <dc:creator>kelxxx</dc:creator>
    <dc:date>2021-12-28T11:49:20Z</dc:date>
    <item>
      <title>calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787412#M32281</link>
      <description>&lt;P&gt;Hi all , here's the problem:&lt;/P&gt;&lt;P&gt;I want to calculate the purchase cost of stock in my account following FIFO (first in first out), actually this can be a large panel dataset because I can have many stocks and adjust their position persistently.&amp;nbsp; The figure below is an example with only 1 stock:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;date 1: I buy 100 shares, so holding 100 shares, the price is 20, so the cost is 20, too&lt;/P&gt;&lt;P&gt;date 2: I continue to buy 100 shares, so holding 200 shares, the price is 23.3, cost is the average&lt;/P&gt;&lt;P&gt;date 3: I sell 120 shares, 100 of 120 sold is bought on date1, 20 of 120 sold is bought on date2, so the remaining 80 also belongs to date2, the cost is 23.3&lt;/P&gt;&lt;P&gt;date 4: I buy 20 shares, now i hold 100, 20 of 100 is newly bought with price 23, 80 of 100 is remained on date3 and bought on date2 with price 23.3, so the cost is weighted average 23.16&lt;/P&gt;&lt;P&gt;date 5: I sell 90, the remaining 10 is bought on date4, so cost is 24, the same with price on date4&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;P&gt;It seems a little wordy, but I also want to say that the actual time range is longer and there are more stocks. I hope there is a general solution. thank you! happy Christmas!&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;Date&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Trade&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Holding&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Price&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Cost&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;0&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;+100&lt;/P&gt;&lt;P&gt;(initial buy)&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;100&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;20&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;(100∗20)/100=20&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;+100&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;200&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;23.2&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;(100∗20+100∗23.2)/200=21.6&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;2&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;-120&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;80&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;22&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;(80∗23.2)/80=23.2&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;3&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;+20&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;100&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;23&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;(20∗23+80∗23.2)/100=23.16&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;4&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;-90&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;10&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;24&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;(10∗23)/10=23&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 26 Dec 2021 14:46:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787412#M32281</guid>
      <dc:creator>Xiyuan</dc:creator>
      <dc:date>2021-12-26T14:46:59Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787422#M32284</link>
      <description>&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif" size="2"&gt;&lt;SPAN style="font-family: arial, helvetica, sans-serif; font-size: small;"&gt;I hope this can help you.&amp;nbsp;&lt;/SPAN&gt;My idea is create a new table and insert line by line.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif" size="2"&gt;Sorry, i dont know how to explain all in english. and &lt;SPAN&gt;I hope I understand your question correctly&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;*-------------------------------;
* - 1 - Préparation				;
*-------------------------------;
data have						;
input date trade holding price	;
cards							;
0 100 100 20
1 100 200 23.2
2 120 -80 22
3 20 100 23
4 -90 10 24
;
run								;

*---------------------------------------------------------------;
* - 2 - Macro 													;
*---------------------------------------------------------------;
%macro stock(date,trade,price)									;
%if &amp;amp;trade &amp;gt; 0 %then %do										; 	/* si c'est l'achat*/
	data tem_last_transaction									; 
	set stock end=eof; if eof then do							;	/* récupérer la dernière ligne de la table stock pour les infos suivantes*/	
	call symputx('lhold',holding); call symputx('lcost',cost)	;	/* &amp;amp;lhold: quantité dans le stock, &amp;amp;lcost: prix moyen */
	output; end; run											;	
	%let holding=%sysevalf(&amp;amp;lhold+&amp;amp;trade)						;	/* calculer holding*/
	%let cost=%sysevalf((&amp;amp;lcost*&amp;amp;lhold+&amp;amp;trade*&amp;amp;price)/&amp;amp;holding)	;	/* calculer cost*/
	%put &amp;amp;holding &amp;amp;cost											;
	proc sql;
	insert into suivi values(&amp;amp;date,&amp;amp;trade,&amp;amp;holding,&amp;amp;price,&amp;amp;cost);	/* insérer les résultats dans la table suivi*/
	insert into stock values(&amp;amp;date,&amp;amp;trade,&amp;amp;holding,&amp;amp;price,&amp;amp;cost);	/* et stock*/
	quit														;
%end															;

%else %do														;	/* si c'est vente */	
	data stock													;
	set stock(where=(holding&amp;gt;abs(&amp;amp;trade)))						;	/* récuperer seulement les lignes ou holding &amp;gt; quantité vente(abs(trade)), parceque si holding &amp;lt; trade &amp;gt;&amp;gt;&amp;gt; il sera soldé*/
	holding=holding+&amp;amp;trade										;	/* màj holding*/	
	cost1=lag(cost)												;	/* cost de la ligne n-1*/
	holding1=lag(holding)										;	/* holding de la ligne n-1*/
	if _n_=1 then do											;	/* si c'est la première ligne _n_=1*/
	trade=holding												;	/* &amp;gt;&amp;gt;&amp;gt; trade= holding*/
	cost=price													;	/* &amp;gt;&amp;gt;&amp;gt; code= price*/
	end															;	
	else do														;	/* si _n_ &amp;gt; 1, les autres lignes */
	cost=(cost1*holding1+trade*price)/holding; end				;	/* &amp;gt;&amp;gt;&amp;gt; cost=(cost1*holding1+trade*price)/holding */
	drop cost1 holding1											;	/* supprimer les varibles intermédiaires*/
	run															;
	data tem_last_transaction									;	
	set stock end=eof											;	/* comme achat, récuperer les infos nécessaires pour calculer holding et cost*/
	if eof then do												;
	call symputx('lhold',holding)								;
	call symputx('lcost',cost)									;
	output														;
	end															;
	run															;
	%let holding=&amp;amp;lhold											;	/* cette fois ci, holding = &amp;amp;lhosd */
	%let cost=&amp;amp;lcost											;	/* cost = &amp;amp;lcost */
	proc sql													;
	insert into suivi values(&amp;amp;date,&amp;amp;trade,&amp;amp;holding,&amp;amp;price,&amp;amp;cost);	/* inserer valeur dans la table suivi, pas dans stock, car c'est fait au dessus et c'est une vente*/
	quit														;
%end															;
proc datasets nolist lib=work; delete tem: ; quit				;   /* supprimer les tables temporaires */
%mend;

%macro fifo(table=have)					;
data suivi stock;	set &amp;amp;table(obs=1)	;
cost=price								;	/* préparation des tables intermédiaires*/
run										;
data _null_; set have					;
key=compress(catx(",",date,trade,price));
call symputx(compress("key"||_N_),key)	;	/* récuperer des valeurs pour utiliser %stock*/
run										;
%let nbobs= &amp;amp;sysnobs.					;
%do i=2 %to &amp;amp;nbobs.						;
%stock(&amp;amp;&amp;amp;key&amp;amp;i)							;	/* %stock(&amp;amp;key2)=%stock(1,100,23.2)	;*/
%end									;
data want; set suivi; run				;	/* Table resultat: WANT*/
%mend									;

*-------------------;
* - 3 - RUN			;
*-------------------;
%fifo(table=have)	;
*%stock(1,100,23.2)	;	/* exemple d'utilisation macro %stock*/
*%stock(2,-120,22)	;
*%stock(3,20,23)	;
*%stock(4,-90,24)	;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV class="ns4p8fja j83agx80 cbu4d94t a6sixzi8 bkfpd7mw a1xu1aao" role="none"&gt;
&lt;DIV class="j83agx80 cbu4d94t d2edcug0 l9j0dhe7 aovydwv3"&gt;
&lt;DIV class="j83agx80 k4urcfbm" role="none"&gt;
&lt;DIV class="cxgpxx05 d1544ag0 sj5x9vvc tw6a2znq l9j0dhe7 ni8dbmo4 stjgntxs e72ty7fz qmr60zad jm1wdb64 qv66sw1b ljqsnud1 odn2s2vf tkr6xdv7 kdgqqoy6 ihh4hy1g" role="none"&gt;
&lt;DIV class="rq0escxv l9j0dhe7 du4w35lb __fb-light-mode" role="none"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="ns4p8fja j83agx80 cbu4d94t a6sixzi8 bkfpd7mw d2edcug0 buofh1pr nred35xi" role="none"&gt;&lt;FONT size="1 2 3 4 5 6 7"&gt;&lt;EM&gt;Please give me a like if you find it useful.&lt;/EM&gt;&lt;/FONT&gt;&lt;/DIV&gt;</description>
      <pubDate>Sun, 26 Dec 2021 21:07:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787422#M32284</guid>
      <dc:creator>kelxxx</dc:creator>
      <dc:date>2021-12-26T21:07:15Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787423#M32285</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;*-------------------------------;
* - 1 - Préparation				;
*-------------------------------;
data have						;
input date trade holding price	;
cards							;
0 100 100 20
1 100 200 23.2
2 -120 80 22 
3 20 100 23
4 -90 10 24
;
run								;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;SORRY, ERROR IN TABLE HAVE,&lt;/P&gt;
&lt;P&gt;This is corrected version&lt;/P&gt;</description>
      <pubDate>Sun, 26 Dec 2021 21:18:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787423#M32285</guid>
      <dc:creator>kelxxx</dc:creator>
      <dc:date>2021-12-26T21:18:28Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787424#M32286</link>
      <description>&lt;P&gt;Another solution if you don't have table have before&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;*---------------------------------------;
* - 1 - Préparation						;
*---------------------------------------;
data suivi;
input date trade holding price cost		;
cards									;
0 100 100 20 20
;
run										;
data stock; set suivi;	run				;

*---------------------------------------------------------------;
* - 2 - Macro 													;
*---------------------------------------------------------------;
%macro stock(date,trade,price)									;
%if &amp;amp;trade &amp;gt; 0 %then %do										; 	/* si c'est l'achat*/
	data tem_last_transaction									; 
	set stock end=eof; if eof then do							;	/* récupérer la dernière ligne de la table stock pour les infos suivantes*/	
	call symputx('lhold',holding); call symputx('lcost',cost)	;	/* &amp;amp;lhold: quantité dans le stock, &amp;amp;lcost: prix moyen */
	output; end; run											;	
	%let holding=%sysevalf(&amp;amp;lhold+&amp;amp;trade)						;	/* calculer holding*/
	%let cost=%sysevalf((&amp;amp;lcost*&amp;amp;lhold+&amp;amp;trade*&amp;amp;price)/&amp;amp;holding)	;	/* calculer cost*/
	%put &amp;amp;holding &amp;amp;cost											;
	proc sql;
	insert into suivi values(&amp;amp;date,&amp;amp;trade,&amp;amp;holding,&amp;amp;price,&amp;amp;cost);	/* insérer les résultats dans la table suivi*/
	insert into stock values(&amp;amp;date,&amp;amp;trade,&amp;amp;holding,&amp;amp;price,&amp;amp;cost);	/* et stock*/
	quit														;
%end															;

%else %do														;	/* si c'est vente */	
	data stock													;
	set stock(where=(holding&amp;gt;abs(&amp;amp;trade)))						;	/* récuperer seulement les lignes ou holding &amp;gt; quantité vente(abs(trade)), parceque si holding &amp;lt; trade &amp;gt;&amp;gt;&amp;gt; il sera soldé*/
	holding=holding+&amp;amp;trade										;	/* màj holding*/	
	cost1=lag(cost)												;	/* cost de la ligne n-1*/
	holding1=lag(holding)										;	/* holding de la ligne n-1*/
	if _n_=1 then do											;	/* si c'est la première ligne _n_=1*/
	trade=holding												;	/* &amp;gt;&amp;gt;&amp;gt; trade= holding*/
	cost=price													;	/* &amp;gt;&amp;gt;&amp;gt; code= price*/
	end															;	
	else do														;	/* si _n_ &amp;gt; 1, les autres lignes */
	cost=(cost1*holding1+trade*price)/holding; end				;	/* &amp;gt;&amp;gt;&amp;gt; cost=(cost1*holding1+trade*price)/holding */
	drop cost1 holding1											;	/* supprimer les varibles intermédiaires*/
	run															;
	data tem_last_transaction									;	
	set stock end=eof											;	/* comme achat, récuperer les infos nécessaires pour calculer holding et cost*/
	if eof then do												;
	call symputx('lhold',holding)								;
	call symputx('lcost',cost)									;
	output														;
	end															;
	run															;
	%let holding=&amp;amp;lhold											;	/* cette fois ci, holding = &amp;amp;lhosd */
	%let cost=&amp;amp;lcost											;	/* cost = &amp;amp;lcost */
	proc sql													;
	insert into suivi values(&amp;amp;date,&amp;amp;trade,&amp;amp;holding,&amp;amp;price,&amp;amp;cost);	/* inserer valeur dans la table suivi, pas dans stock, car c'est fait au dessus et c'est une vente*/
	quit														;
%end															;
proc datasets nolist lib=work; delete tem: ; quit				;   /* supprimer les tables temporaires */
%mend;

*-------------------;
* - 3 - RUN			;
*-------------------;
%stock(1,100,23.2)	;
%stock(2,-120,22)	;
%stock(3,20,23)		;
%stock(4,-90,24)	;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV class="forum-topic-flex-article"&gt;
&lt;DIV class="forum-article"&gt;
&lt;DIV class="forum-post"&gt;
&lt;DIV id="bodyDisplay_1fae796feccf15" class="lia-message-body lia-component-message-view-widget-body lia-component-body-signature-highlight-escalation lia-component-message-view-widget-body-signature-highlight-escalation"&gt;
&lt;DIV class="lia-message-body-content"&gt;
&lt;DIV class="ns4p8fja j83agx80 cbu4d94t a6sixzi8 bkfpd7mw d2edcug0 buofh1pr nred35xi" role="none"&gt;&lt;FONT size="1 2 3 4 5 6 7"&gt;&lt;EM&gt;Please give me a like if you find it useful.Thanks!&lt;/EM&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Sun, 26 Dec 2021 21:22:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787424#M32286</guid>
      <dc:creator>kelxxx</dc:creator>
      <dc:date>2021-12-26T21:22:12Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787430#M32288</link>
      <description>&lt;P&gt;thanks kel ! That works well, but i still need your help because i don't know how to identify each stock, each transaction in this context, just like this, if i have more than 1 stock and the initial day on which i hold them can be different, btw, the data is so large that i can't input one by one actually&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;Date&lt;/TD&gt;&lt;TD&gt;Stock&lt;/TD&gt;&lt;TD&gt;Trade&lt;/TD&gt;&lt;TD&gt;Holding&lt;/TD&gt;&lt;TD&gt;Price&lt;/TD&gt;&lt;TD&gt;Reference Price&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-01-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;(100∗20)/100=20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-02-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;200&lt;/TD&gt;&lt;TD&gt;23.2&lt;/TD&gt;&lt;TD&gt;(100∗20+100∗23.2)/200=21.6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-03-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;-120&lt;/TD&gt;&lt;TD&gt;80&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;(80∗23.2)/80=23.2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-04-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;23&lt;/TD&gt;&lt;TD&gt;(20∗23+80∗23.2)/100=23.16&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-05-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;-90&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;TD&gt;(10∗23)/10=23&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-03-01&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;200&lt;/TD&gt;&lt;TD&gt;200&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;(200∗10)/200=10&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-04-01&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;-100&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;(100∗10)/100=10&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-05-01&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;50&lt;/TD&gt;&lt;TD&gt;150&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;(100∗10+50∗12)/150=10.67&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Mon, 27 Dec 2021 04:55:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787430#M32288</guid>
      <dc:creator>Xiyuan</dc:creator>
      <dc:date>2021-12-27T04:55:53Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787433#M32289</link>
      <description>&lt;P&gt;also, i'm still thinking how to write your third step into a circular format. First, i want to traverse all dates, next i want to traverse both all stocks and all dates&lt;/P&gt;&lt;P&gt;i'm not clear how to run this: %macro stock(date,trade,price) if i want to loop every observation&lt;/P&gt;</description>
      <pubDate>Mon, 27 Dec 2021 07:33:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787433#M32289</guid>
      <dc:creator>Xiyuan</dc:creator>
      <dc:date>2021-12-27T07:33:21Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787434#M32290</link>
      <description>&lt;P&gt;let me give you a better version, we cannot input the observations one by one because there are so much time. thanks !&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;Date&lt;/TD&gt;&lt;TD&gt;Stock&lt;/TD&gt;&lt;TD&gt;Trade&lt;/TD&gt;&lt;TD&gt;Holding&lt;/TD&gt;&lt;TD&gt;Price&lt;/TD&gt;&lt;TD&gt;Reference Price&lt;/TD&gt;&lt;TD&gt;BS&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-01-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;(100*20)/100=20&lt;/TD&gt;&lt;TD&gt;Buy&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-02-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;200&lt;/TD&gt;&lt;TD&gt;23.2&lt;/TD&gt;&lt;TD&gt;(100*20+100*23.2)/200=21.6&lt;/TD&gt;&lt;TD&gt;Buy&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-03-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;-120&lt;/TD&gt;&lt;TD&gt;80&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;(80*23.2)/80=23.2&lt;/TD&gt;&lt;TD&gt;Sell&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-04-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;23&lt;/TD&gt;&lt;TD&gt;(20*23+80*23.2)/100=23.16&lt;/TD&gt;&lt;TD&gt;Buy&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-05-01&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;-90&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;TD&gt;(10*23)/10=23&lt;/TD&gt;&lt;TD&gt;Sell&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-05-02&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;(20*20+10*23)/30=21&lt;/TD&gt;&lt;TD&gt;Buy&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-03-01&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;200&lt;/TD&gt;&lt;TD&gt;200&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;(200∗10)/200=10&lt;/TD&gt;&lt;TD&gt;Buy&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-04-01&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;-100&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;(100∗10)/100=10&lt;/TD&gt;&lt;TD&gt;Sell&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2020-05-01&lt;/TD&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;50&lt;/TD&gt;&lt;TD&gt;150&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;(100∗10+50∗12)/150=10.67&lt;/TD&gt;&lt;TD&gt;Buy&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 27 Dec 2021 07:44:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787434#M32290</guid>
      <dc:creator>Xiyuan</dc:creator>
      <dc:date>2021-12-27T07:44:33Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787442#M32292</link>
      <description>&lt;P&gt;I like this question.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input stock date trade holding price;
cards;
1 0 100 100 20
1 1 100 200 23.2
1 2 -120 80 22
1 3 20 100 23
1 4 -90 10 24
2 0 100 100 20
2 1 100 200 23.2
2 2 -120 80 22
2 3 20 100 23
2 4 -90 10 24
;
run ;

data want;
array positive{999999} _temporary_;
i=1;j=1;call missing(of positive{*});

do until(last.stock);
  set have;
  by stock;
/*hold the positive share*/
  if trade&amp;gt;0 then do; 
    do i=i to i+trade-1 ;
      positive{i}= price ; 
 end;
  end;
/*eliminate the sell share - FIFO*/
  if trade&amp;lt;0 then do;
    do j=j to j+abs(trade)-1 ;
      positive{j}= . ;
 end;
  end;    
/*calcualte cost*/
cost=sum(of positive{*})/n(of positive{*});

output;
end;
drop i j;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 27 Dec 2021 11:39:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787442#M32292</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2021-12-27T11:39:09Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787450#M32293</link>
      <description>&lt;P&gt;Please use a data step to post your data, making it so much easier to start helping.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data work.have;
  infile datalines dsd truncover;
  input Date:MMDDYY10. Stock:$1. Trade:BEST. Holding:BEST. Price:BEST.;
  format Date MMDDYY10.;
datalines4;
01/01/2020,A,100,100,20
02/01/2020,A,100,200,23.2
03/01/2020,A,-120,80,22
04/01/2020,A,20,100,23
05/01/2020,A,-90,10,24
05/02/2020,A,20,30,20
03/01/2020,B,200,200,10
04/01/2020,B,-100,100,15
05/01/2020,B,50,150,12
;;;;

/* if you are not 100% sure, that have is properly sorted by "stock", add proc sort here */

data want;
   set have;
   by stock;
   
   length RefPrice 8;
   
   retain _holding _price;
   
   if first.stock then do;
      _holding = 0;
      _price = 0;
   end;
   
   if trade &amp;gt; 0 then do;
      RefPrice = round((trade * price + _holding * _price) / holding, 0.01);
      _price = price;
   end;
   else do;
      RefPrice = _price;
   end;
   
   _holding = holding;
   
   drop _:;
run;

&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;I am not sure whether the result match your expectation if Trade is negative several times in a row.&lt;/P&gt;</description>
      <pubDate>Mon, 27 Dec 2021 13:05:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787450#M32293</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2021-12-27T13:05:48Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787467#M32294</link>
      <description>&lt;P&gt;It's awesome!!!!!!!&lt;/P&gt;</description>
      <pubDate>Mon, 27 Dec 2021 16:08:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787467#M32294</guid>
      <dc:creator>kelxxx</dc:creator>
      <dc:date>2021-12-27T16:08:41Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787469#M32295</link>
      <description>&lt;P&gt;&lt;SPAN&gt;It's awesome!!!!!!!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 27 Dec 2021 16:14:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787469#M32295</guid>
      <dc:creator>kelxxx</dc:creator>
      <dc:date>2021-12-27T16:14:19Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787499#M32297</link>
      <description>Hi andreas, this works well but there is something wrong when i extend more samples, i'm sorry i cannot find out what the specific problem is， for example, when i add 2020/06/01,B,-20,130,14&lt;BR /&gt;i expect the reference price is 10.77, but it is not here</description>
      <pubDate>Tue, 28 Dec 2021 05:20:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787499#M32297</guid>
      <dc:creator>Xiyuan</dc:creator>
      <dc:date>2021-12-28T05:20:43Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787500#M32298</link>
      <description>Thanks Ksharp! this code works well and robust enough even I extend more&lt;BR /&gt;learned a lot, i'm going to try this on my large dateset</description>
      <pubDate>Tue, 28 Dec 2021 05:23:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787500#M32298</guid>
      <dc:creator>Xiyuan</dc:creator>
      <dc:date>2021-12-28T05:23:18Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787502#M32299</link>
      <description>&lt;P&gt;Why 10.77?&lt;/P&gt;
&lt;P&gt;The calculation should be: (holding * last_price) / holding =&amp;gt; (130 * 12) / 130, which can be optimized to 12.&lt;/P&gt;</description>
      <pubDate>Tue, 28 Dec 2021 06:25:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787502#M32299</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2021-12-28T06:25:01Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787503#M32300</link>
      <description>not the last price, if we sell 20 shares, the remaining is 130,&lt;BR /&gt;following FIFO, 80 of 130 should come from the initial buy on 2020-03-01 with price 10,&lt;BR /&gt;while 50 of 130 should come from 2020-05-01 with price 12,&lt;BR /&gt;thus cost should be (80*10+50*12)/130=10.77&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Tue, 28 Dec 2021 06:39:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787503#M32300</guid>
      <dc:creator>Xiyuan</dc:creator>
      <dc:date>2021-12-28T06:39:09Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787504#M32301</link>
      <description>&lt;P&gt;Interesting, so the program i posted returns the expected results only randomly &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;You should extend your examples to contain that case.&lt;/P&gt;</description>
      <pubDate>Tue, 28 Dec 2021 06:42:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787504#M32301</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2021-12-28T06:42:55Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787514#M32302</link>
      <description>&lt;P&gt;my program returns this result&lt;/P&gt;</description>
      <pubDate>Tue, 28 Dec 2021 11:47:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787514#M32302</guid>
      <dc:creator>kelxxx</dc:creator>
      <dc:date>2021-12-28T11:47:57Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787515#M32303</link>
      <description>&lt;P&gt;you don't need to input one by ont, because the macro will do that.&lt;/P&gt;</description>
      <pubDate>Tue, 28 Dec 2021 11:49:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787515#M32303</guid>
      <dc:creator>kelxxx</dc:creator>
      <dc:date>2021-12-28T11:49:20Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787528#M32306</link>
      <description>&lt;P&gt;Another try using a hash-object:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
   set work.have;
   by Stock;
   
   format Date date9.;
   
   length _Amount 8;
   
   if _n_ = 1 then do;
      declare hash fifo(ordered: 'yes');
      fifo.defineKey('Date');
      fifo.defineData('Date', '_Amount', 'Price');
      fifo.defineDone();
      declare hiter fi('fifo');
   end;
   
   if Trade &amp;gt; 0 then do;
      _Amount = Trade;
      fifo.add();
      _Total = 0;
      rc = fi.first();
      
      do while (rc = 0);
         _Total = _Total + (_Amount * Price);
         rc = fi.next();
      end;
   end;
   else do;
      _Remaining = abs(Trade);
      _Date = Date;
      _Price = Price;
      
      rc = fi.first();
      _Total = 0;
      
      do while (rc = 0);
      
         if _Remaining &amp;gt; 0 then do;
            _Taken = min(_Amount, _Remaining);
            _Amount = _Amount - _Taken;
            _Remaining = _Remaining - _Taken;
             
            fifo.replace();
         end;
        
         _Total = _Total + _Amount * price;
                  
         rc = fi.next();
      end;
            
      Date = _Date;
      Price = _Price;
   end;
   
   RefPrice = round(_Total / Holding, 0.01);
  
   if last.Stock then do;
      rc = fifo.clear();
   end;

   drop rc _:;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The paper "From Stocks to Flows: Using SAS® HASH objects for FIFO, LIFO, and other FO’s" by Mark Keintz (&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31461"&gt;@mkeintz&lt;/a&gt; ??) was a very useful inspiration.&lt;/P&gt;</description>
      <pubDate>Tue, 28 Dec 2021 16:53:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787528#M32306</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2021-12-28T16:53:00Z</dc:date>
    </item>
    <item>
      <title>Re: calculate stock cost based on FIFO</title>
      <link>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787593#M32309</link>
      <description>&lt;P&gt;If you have big table, try this one .&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data work.have;
  infile datalines dsd truncover;
  input Date:MMDDYY10. Stock:$1. Trade:BEST. Holding:BEST. Price:BEST.;
  format Date MMDDYY10.;
datalines4;
01/01/2020,A,100,100,20
02/01/2020,A,100,200,23.2
03/01/2020,A,-200,80,22
04/01/2020,A,90,100,23
05/01/2020,A,-60,10,24
05/02/2020,A,20,30,20
03/01/2020,B,200,200,10
04/01/2020,B,-100,100,15
05/01/2020,B,-100,150,12
;;;;


data want2;
array _trade{9999} _temporary_;
array _price{9999} _temporary_;

i=0;j=1;call missing(of _trade{*} _price{*});

do until(last.stock);
  set have;
  by stock;
/*hold the positive share*/
  if trade&amp;gt;0 then do; 
    i+1;
 _trade{i}= trade ;
    _price{i}= price ; 
  end;
/*eliminate the sell share - FIFO*/
  if trade&amp;lt;0 then do;
    balance_trade=trade ;
    do j=j to i ;
      balance_trade=sum(balance_trade,_trade{j}) ;
   if balance_trade&amp;lt;=0 then do;_trade{j}=.;_price{j}=.; end;
    else do;_trade{j}=balance_trade;leave;end;
    end;
  end;    
/*calcualte cost*/ 
a=0;b=0;
do k=j to i;
 a+_trade{k}*_price{k};
 b+_trade{k};
end;
cost=divide(a,b);

output;
end;
drop i j k balance_trade a b;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 29 Dec 2021 11:41:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/calculate-stock-cost-based-on-FIFO/m-p/787593#M32309</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2021-12-29T11:41:40Z</dc:date>
    </item>
  </channel>
</rss>

