diff --git a/di/mockDataGen/init.q b/di/mockDataGen/init.q new file mode 100644 index 0000000..4cdb055 --- /dev/null +++ b/di/mockDataGen/init.q @@ -0,0 +1,3 @@ +\l ::mockDataGen.q + +export:([initschema;mockDataOne;mockData;mockHdb;mockDataR;clearTables]) diff --git a/di/mockDataGen/mockDataGen.q b/di/mockDataGen/mockDataGen.q new file mode 100644 index 0000000..2967dd1 --- /dev/null +++ b/di/mockDataGen/mockDataGen.q @@ -0,0 +1,86 @@ +initschema:{[] + .z.m.trades:([] time:`timestamp$(); sym:`g#`$(); src:`g#`$(); price:`float$(); size:`int$()); + .z.m.quotes:([] time:`timestamp$(); sym:`g#`$(); src:`g#`$(); bid:`float$(); ask:`float$(); bsize:`int$(); asize:`int$()); + .z.m.depth:([] time:`timestamp$(); sym:`g#`$(); bid1:`float$(); bsize1:`int$(); bid2:`float$(); bsize2:`int$(); bid3:`float$(); bsize3:`int$(); bid4:`float$(); bsize4:`int$(); bid5:`float$(); bsize5:`int$(); ask1:`float$(); asize1:`int$(); ask2:`float$(); asize2:`int$(); ask3:`float$(); asize3:`int$(); ask4:`float$(); asize4:`int$(); ask5:`float$(); asize5:`int$()); + }; + +// Utility Functions +rnd:{0.01*floor 100*x}; + +clearTables:{[] + initschema[]; + }; + +// funtion to generate mock data for a single symbol/instrument +mockDataOne:{[sym;date;startTime;endTime;tradeCnts;startPxs;level] + tradeCnt:$[99h=type tradeCnts; tradeCnts[sym]; tradeCnts]; + startPx:$[99h=type startPxs; startPxs[sym]; startPxs]; + quoteCnt:5*tradeCnt; + depthCnt:25*tradeCnt; + hoursinday:endTime-startTime; + t0:date+startTime; + t1:date+endTime; + ttimes:date+ `#asc startTime+tradeCnt?hoursinday; + qtimes:date+ `#asc startTime+quoteCnt?hoursinday; + dtimes:date+ `#asc startTime+depthCnt?hoursinday; + mids:startPx* exp sums 0.0005*-1+quoteCnt?2f; + mids:0.01*floor 100*mids; + spread:0.02+0.01*quoteCnt?1f; + half:spread%2; + bid:rnd mids-quoteCnt?0.03; + ask:rnd mids+quoteCnt?0.03; + bsize:`int$(600*1+quoteCnt?20); + asize:`int$(600*1+quoteCnt?20); + tradeIdx:til tradeCnt; + quoteIdx:5*tradeIdx; + side:tradeCnt?`buy`sell; + price:0.01*floor 100*?[side=`buy; ask[quoteIdx]; bid[quoteIdx]]; + tsize:`int$((tradeCnt?1f)*?[side=`buy; asize[quoteIdx]; bsize[quoteIdx]]); + .z.m.trades,:flip `time`sym`src`price`size!(ttimes;tradeCnt#sym;tradeCnt?`N`O`L;price;tsize); + .z.m.quotes,:flip `time`sym`src`bid`ask`bsize`asize!(qtimes;quoteCnt#sym;quoteCnt?`N`O`L;bid;ask;bsize;asize); + if[level=2; + dIdx:(til depthCnt) mod quoteCnt; + dBid:bid[dIdx];dAsk:ask[dIdx]; + b1:`int$(600*1+depthCnt?20);b2:b1+`int$(600*1+depthCnt?5);b3:b1+`int$(600*1+depthCnt?10);b4:b1+`int$(600*1+depthCnt?15);b5:b1+`int$(600*1+depthCnt?20); + a1:`int$(600*1+depthCnt?20);a2:a1+`int$(600*1+depthCnt?5);a3:a1+`int$(600*1+depthCnt?5);a4:a1+`int$(600*1+depthCnt?5);a5:a1+`int$(600*1+depthCnt?5); + .z.m.depth,:flip `time`sym`bid1`bsize1`bid2`bsize2`bid3`bsize3`bid4`bsize4`bid5`bsize5`ask1`asize1`ask2`asize2`ask3`asize3`ask4`asize4`ask5`asize5!(dtimes;depthCnt#sym;dBid;b1;dBid-0.01;b2;dBid-0.02;b3;dBid-0.03;b4;dBid-0.04;b5;dAsk;a1;dAsk+0.01;a2;dAsk+0.02;a3;dAsk+0.03;a4;dAsk+0.04;a5); + ]; + }; + +// function to generate the mock data for multiple syms on a given date +mockData:{[syms;date;startTime;endTime;rowCnts;startPxs;level] + syms:$[11h=type syms; syms; enlist syms]; + rc:$[99h=type rowCnts; rowCnts; (enlist syms)!enlist rowCnts]; + spx:$[99h=type startPxs; startPxs; (enlist syms)!enlist startPxs]; + {[s;rc;spx;date;startTime;endTime;level] + sp:$[`sp in key .z.m; $[null .z.m.sp[s]; spx[s]; .z.m.sp[s]]; spx[s]]; + mockDataOne[s;date;startTime;endTime;rc[s];sp;level]}[;rc;spx;date;startTime;endTime;level] each syms; + }; + +clearTables:{[] + initschema[]; + }; + +// function to generate mock data for multiple syms for the given date list +mockDataR:{[syms;datelist;startTime;endTime;rowCnts;startPxs;level] + mockData[syms;datelist[0];startTime;endTime;rowCnts;startPxs;level]; + .z.m.sp::exec last price by sym from .z.m.trades; + {[syms;x;startTime;endTime;rowCnts;sp;level] + .z.m.sp::exec last price by sym from .z.m.trades; + mockData[syms;x;startTime;endTime;rowCnts;sp;2]}[syms;;startTime;endTime;rowCnts;sp;2]each 1_datelist; + }; + +// function to write the data down to HDB for the given date list +mockHdb:{[dir;syms;dates;startTime;endTime;rowCnts;startPxs;level] + .z.m.sp:syms!(count syms)#0nf; + {[dir;syms;d;startTime;endTime;rowCnts;startPxs;level] + mockData[syms;d;startTime;endTime;rowCnts;startPxs;level]; + .z.m.sp:syms!{last exec price from .z.m.trades where sym = x} each syms; + `trades set .z.m.trades; + `quotes set .z.m.quotes; + `depth set .z.m.depth; + .Q.hdpf[`:;dir;d;`sym]; clearTables[] }[dir;syms;;startTime;endTime;rowCnts;startPxs;level] each dates; + }; + + +-1"USAGE: mockDataOne[sym;date;startTime;endTime;tradeCnts;startPxs;level] eg mockDataOne[`AAPL;2025.01.10;09:30;16:00;300;22.35;2] / tradeCnts is equal to rowCounts\n\nmockData[syms;date;startTime;endTime;rowCnts;startPxs;level] eg mockData[`AAPL`MSFT`META;2025.01.10;09:30:00;16:00:00;`AAPL`MSFT`META!300 500 200;`AAPL`MSFT`META!22.33 38.34 29.43;2];\n\nmakeDataR[syms;datelist;startTime;endTime;rowCnts;startPxs;level] eg mockDataR[`AAPL`MSFT`META;2025.01.10 2025.01.11 2025.01.12;09:30:00;16:00:00;`AAPL`MSFT`META!7000 5000 9000;`AAPL`MSFT`META!27.33 38.34 29.43;2];\n\nmockHdb[dir;syms;dates;startTime;endTime;rowCnts;startPxs;level] eg mockHdb[`:hdb;`AAPL`MSFT;2014.12.15 2014.12.16 2014.12.17 2014.12.18 2025.12.19; 09:30:00;17:30:00;`AAPL`MSFT!20000 300000;`AAPL`MSFT!23.45 45.89;2]\n";