/**********************************************************************/
filename tradein '\ob generic-sequential-filename\obe ';
libname tradelib '\ob generic-directory-name\obe ';
data tradelib.pfb;
infile tradein;
format tdate YYMMDD6.;
input @1 tdate YYMMDD6.
@7 carry $char1.
@8 broker $char1.
@9 matcher $char1.
@10 buysell $char4.
@14 qty
@20 descr $char14.
@35 price
@42 prin
@52 netprice;
/* Compute commission from principal and net amount */
comm=netprice-prin;
if comm<0 then comm=-comm;
run;
/**********************************************************************/
proc sort data=tradelib.pfb;
by broker descr matcher tdate buysell;
/**********************************************************************/
data tradelib.match;
set tradelib.pfb;
by broker descr matcher;
retain netgain 0 /* net profit or loss */
/* on the trade */
grandnet 0 /* grand total net profit */
/* or loss */
brokenet 0 /* net profit or loss at broker */
totcomm 0 /* total brokerage commissions */
/* paid */
tvol 0 /* total volume for security */
grandcom 0 /* grand total commissions paid */
buyprice 0 /* purchase price for the */
/* security */
sellpric 0; /* sale price for the security */
/* BUYDATE and SELLDATE values are zeroed out each */
/* time a new description is seen. The first date */
/* on which a buy is encountered and the last date */
/* on which a sell is encountered are saved for */
/* the output report. */
retain buydate selldate;
/* Accumulate the net profit or loss for all */
/* trades at each brokerage house in the variable */
/* BROKENET. */
if first.broker then
brokenet=0;
/* Reset accumulators to zero for */
/* each new security seen. */
if first.matcher then do;
netgain=0;
totcomm=0;
tvol=0;
buydate=0;
selldate=0;
buyprice=0;
sellpric=0;
end;
/**********************************************************************/
if upcase(buysell)='BUY' then do;
/* Add trade quantity to total volume for */
/* the security. */
tvol=tvol+qty;
/* Subtract buys from net. */
netgain=netgain-netprice;
/* Sum total paid for all purchases in buyprice. */
buyprice=buyprice+netprice;
/* If the first purchase of the security, */
/* remember the date. */
if buydate=0
then buydate=tdate;
end;
/**********************************************************************/
else if upcase(buysell)='SELL' then do;
/* Add proceeds to net profit. */
netgain=netgain+netprice;
/* Remember latest sale date. */
selldate=tdate;
/* Add this sale to total. */
sellpric=sellpric+netprice;
/* Show negative volume on short sale. */
/* No purchases seen because they would */
/* have come first in the sort order. */
if tvol=0
and last.descr
then tvol=tvol-qty;
end;
/* Accumulate the commissions paid on every trade. */
totcomm=totcomm+comm;
/**********************************************************************/
if last.descr then do;
/* If the position is not carried forward, */
/* it is closed. Accumulate net profit and */
/* commission by broker. */
if carry=' ' then do;
grandnet=grandnet+netgain;
brokenet=brokenet+netgain;
grandcom=grandcom+totcomm;
end;
/* The output data set gets a single */
/* observation for every security traded at */
/* brokerage house. */
output;
end;
/* For each broker, report the net profit or loss */
/* for the year. These figures do not need to be */
/* in the output report (the IRS does not care */
/* what broker you use) so they are just written */
/* to the SAS log. */
if last.broker then do;
put 'broker net=' broker brokenet;
end;
/**********************************************************************/
broker net=M 341.16
broker net=W 310
/**********************************************************************/
/* These data set variables are no longer needed. */
drop buysell price prin netprice qty;
run;
/* Sort the match data set by trade date. */
proc sort data=tradelib.match;
by tdate;
/**********************************************************************/
data tradelib.open;
set tradelib.match(where=(carry='c'));
proc print;
title 'Open Positions Carried Forward';
var tdate broker tvol descr comm buyprice sellpric;
format tdate MMDDYY8.;
/* Create the closed position data set. */
data tradelib.closed;
/* Read the matched trades. After the last one has */
/* been seen, make the variable EOF have a value */
/* of 1. */
set tradelib.match end=eof;
/* Create date variables bdate and sdate */
/* for printing. */
length bdate $ 8 sdate $ 8;
if carry=' ' /* Omit positions carried forward. */
then do;
retain gnet 0 /* grand total net profit or loss */
tprof 0 /* grand total of all profitable */
/* trades */
tloss 0 /* grand total of all losing trades */
gcom 0; /* grand total commissions paid */
/* Accumulate grand totals for */
/* net profit and commissions */
gnet=gnet+netgain;
gcom=gcom+totcomm;
/* The close date is either the buy date or the */
/* sell date, whichever came later. This date is */
/* used to order the output report lines */
/* chronologically. */
if buydate>selldate
then clodate=buydate;
else clodate=selldate;
/* Create date variables for the report */
/* in format MM/DD/YY. */
if buydate>0
then bdate=put(buydate, MMDDYY8.);
else bdate=' ';
if selldate>0
then sdate=put(selldate, MMDDYY8.);
else sdate=' ';
/**********************************************************************/
if netgain>0 then do;
netloss=0;
tprof=tprof+netgain; /* accumulate net profit */
end;
else do;
netloss=-netgain;
tloss=tloss+netgain; /* accumulate net loss */
netgain=0;
end;
output;
end;
/**********************************************************************/
if eof then do;
put tprof= tloss= gnet=;
end;
/* these variables no longer needed */
drop grandcom grandnet;
run;
/**********************************************************************/
TPROF=1454.79 TLOSS=-803.63 GNET=651.16
/**********************************************************************/
proc print;
title 'Trader Performance Summary';
var tvol descr bdate sdate sellpric
buyprice netloss netgain gnet;
/**********************************************************************/
proc sort data=tradelib.closed;
by clodate;
proc print;
title 'Schedule D Supplemental Capital Gains and Losses';
var tvol descr bdate sdate sellpric
buyprice netloss netgain;
run;
/**********************************************************************/