@adaptic/utils 0.0.1030 → 0.0.1032

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/index.cjs +74286 -68970
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.mjs +74265 -68973
  4. package/dist/index.mjs.map +1 -1
  5. package/dist/test.js +5087 -25
  6. package/dist/test.js.map +1 -1
  7. package/dist/types/__tests__/indicator-parity/generate.d.ts +64 -0
  8. package/dist/types/__tests__/indicator-parity/generate.d.ts.map +1 -0
  9. package/dist/types/__tests__/indicator-parity/record.d.ts +144 -0
  10. package/dist/types/__tests__/indicator-parity/record.d.ts.map +1 -0
  11. package/dist/types/__tests__/indicator-parity/reference.d.ts +92 -0
  12. package/dist/types/__tests__/indicator-parity/reference.d.ts.map +1 -0
  13. package/dist/types/__tests__/indicator-parity/series.d.ts +64 -0
  14. package/dist/types/__tests__/indicator-parity/series.d.ts.map +1 -0
  15. package/dist/types/__tests__/indicator-parity/subjects.d.ts +55 -0
  16. package/dist/types/__tests__/indicator-parity/subjects.d.ts.map +1 -0
  17. package/dist/types/__tests__/support/statistic.d.ts +18 -0
  18. package/dist/types/__tests__/support/statistic.d.ts.map +1 -0
  19. package/dist/types/alpaca/streams/trading-stream.d.ts +7 -3
  20. package/dist/types/alpaca/streams/trading-stream.d.ts.map +1 -1
  21. package/dist/types/display-manager.d.ts.map +1 -1
  22. package/dist/types/index.d.ts +1 -0
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/dist/types/massive-indices.d.ts.map +1 -1
  25. package/dist/types/massive.d.ts.map +1 -1
  26. package/dist/types/metrics-calcs.d.ts +25 -0
  27. package/dist/types/metrics-calcs.d.ts.map +1 -1
  28. package/dist/types/performance-metrics.d.ts +16 -4
  29. package/dist/types/performance-metrics.d.ts.map +1 -1
  30. package/dist/types/sample-statistic.d.ts +123 -0
  31. package/dist/types/sample-statistic.d.ts.map +1 -0
  32. package/dist/types/schemas/alpaca-schemas.d.ts +4 -4
  33. package/dist/types/schemas/massive-schemas.d.ts +97 -79
  34. package/dist/types/schemas/massive-schemas.d.ts.map +1 -1
  35. package/dist/types/strategy-metrics.d.ts +38 -16
  36. package/dist/types/strategy-metrics.d.ts.map +1 -1
  37. package/dist/types/types/alpaca-types.d.ts +38 -3
  38. package/dist/types/types/alpaca-types.d.ts.map +1 -1
  39. package/dist/types/types/massive-types.d.ts +9 -2
  40. package/dist/types/types/massive-types.d.ts.map +1 -1
  41. package/package.json +4 -1
@@ -3,37 +3,46 @@
3
3
  * Validates API responses against expected shapes to catch breaking API changes early.
4
4
  */
5
5
  import { z } from "zod";
6
- /** Schema for raw Massive price data (as returned from aggregates endpoint) */
6
+ /**
7
+ * Raw bar as the aggregates endpoints return it.
8
+ *
9
+ * Only OHLC, volume and timestamp are guaranteed. `T` names the ticker and is
10
+ * carried by the grouped-daily endpoint, which returns many symbols in one
11
+ * payload, but not by single-ticker aggregates, where the symbol is on the
12
+ * envelope instead. `vw` and `n` are derived statistics the vendor omits for
13
+ * bars with too little activity to compute them. Requiring any of the three
14
+ * would reject payloads that are entirely valid.
15
+ */
7
16
  export declare const RawMassivePriceDataSchema: z.ZodObject<{
8
- T: z.ZodString;
17
+ T: z.ZodOptional<z.ZodString>;
9
18
  c: z.ZodNumber;
10
19
  h: z.ZodNumber;
11
20
  l: z.ZodNumber;
12
- n: z.ZodNumber;
21
+ n: z.ZodOptional<z.ZodNumber>;
13
22
  o: z.ZodNumber;
14
23
  t: z.ZodNumber;
15
24
  v: z.ZodNumber;
16
- vw: z.ZodNumber;
25
+ vw: z.ZodOptional<z.ZodNumber>;
17
26
  }, "strip", z.ZodTypeAny, {
18
27
  t: number;
19
- T: string;
20
28
  o: number;
21
29
  h: number;
22
30
  l: number;
23
31
  c: number;
24
32
  v: number;
25
- vw: number;
26
- n: number;
33
+ T?: string | undefined;
34
+ vw?: number | undefined;
35
+ n?: number | undefined;
27
36
  }, {
28
37
  t: number;
29
- T: string;
30
38
  o: number;
31
39
  h: number;
32
40
  l: number;
33
41
  c: number;
34
42
  v: number;
35
- vw: number;
36
- n: number;
43
+ T?: string | undefined;
44
+ vw?: number | undefined;
45
+ n?: number | undefined;
37
46
  }>;
38
47
  /** Schema for Massive ticker info response */
39
48
  export declare const MassiveTickerInfoSchema: z.ZodObject<{
@@ -43,7 +52,7 @@ export declare const MassiveTickerInfoSchema: z.ZodObject<{
43
52
  description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
44
53
  locale: z.ZodString;
45
54
  market: z.ZodEnum<["stocks", "crypto", "indices", "fx", "otc"]>;
46
- market_cap: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
55
+ market_cap: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
47
56
  name: z.ZodString;
48
57
  primary_exchange: z.ZodString;
49
58
  share_class_shares_outstanding: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -57,10 +66,10 @@ export declare const MassiveTickerInfoSchema: z.ZodObject<{
57
66
  description: string;
58
67
  currency_name: string;
59
68
  locale: string;
60
- market_cap: number;
61
69
  primary_exchange: string;
62
70
  ticker: string;
63
71
  delisted_utc?: string | undefined;
72
+ market_cap?: number | null | undefined;
64
73
  share_class_shares_outstanding?: number | null | undefined;
65
74
  }, {
66
75
  type: string;
@@ -73,7 +82,7 @@ export declare const MassiveTickerInfoSchema: z.ZodObject<{
73
82
  ticker: string;
74
83
  description?: string | undefined;
75
84
  delisted_utc?: string | undefined;
76
- market_cap?: number | undefined;
85
+ market_cap?: number | null | undefined;
77
86
  share_class_shares_outstanding?: number | null | undefined;
78
87
  }>;
79
88
  /** Schema for the wrapper around ticker details API response */
@@ -85,7 +94,7 @@ export declare const MassiveTickerDetailsResponseSchema: z.ZodObject<{
85
94
  description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
86
95
  locale: z.ZodString;
87
96
  market: z.ZodEnum<["stocks", "crypto", "indices", "fx", "otc"]>;
88
- market_cap: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
97
+ market_cap: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
89
98
  name: z.ZodString;
90
99
  primary_exchange: z.ZodString;
91
100
  share_class_shares_outstanding: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -99,10 +108,10 @@ export declare const MassiveTickerDetailsResponseSchema: z.ZodObject<{
99
108
  description: string;
100
109
  currency_name: string;
101
110
  locale: string;
102
- market_cap: number;
103
111
  primary_exchange: string;
104
112
  ticker: string;
105
113
  delisted_utc?: string | undefined;
114
+ market_cap?: number | null | undefined;
106
115
  share_class_shares_outstanding?: number | null | undefined;
107
116
  }, {
108
117
  type: string;
@@ -115,7 +124,7 @@ export declare const MassiveTickerDetailsResponseSchema: z.ZodObject<{
115
124
  ticker: string;
116
125
  description?: string | undefined;
117
126
  delisted_utc?: string | undefined;
118
- market_cap?: number | undefined;
127
+ market_cap?: number | null | undefined;
119
128
  share_class_shares_outstanding?: number | null | undefined;
120
129
  }>;
121
130
  status: z.ZodString;
@@ -130,10 +139,10 @@ export declare const MassiveTickerDetailsResponseSchema: z.ZodObject<{
130
139
  description: string;
131
140
  currency_name: string;
132
141
  locale: string;
133
- market_cap: number;
134
142
  primary_exchange: string;
135
143
  ticker: string;
136
144
  delisted_utc?: string | undefined;
145
+ market_cap?: number | null | undefined;
137
146
  share_class_shares_outstanding?: number | null | undefined;
138
147
  };
139
148
  request_id: string;
@@ -150,7 +159,7 @@ export declare const MassiveTickerDetailsResponseSchema: z.ZodObject<{
150
159
  ticker: string;
151
160
  description?: string | undefined;
152
161
  delisted_utc?: string | undefined;
153
- market_cap?: number | undefined;
162
+ market_cap?: number | null | undefined;
154
163
  share_class_shares_outstanding?: number | null | undefined;
155
164
  };
156
165
  request_id: string;
@@ -163,68 +172,68 @@ export declare const MassiveGroupedDailyResponseSchema: z.ZodObject<{
163
172
  resultsCount: z.ZodNumber;
164
173
  status: z.ZodString;
165
174
  results: z.ZodArray<z.ZodObject<{
166
- T: z.ZodString;
175
+ T: z.ZodOptional<z.ZodString>;
167
176
  c: z.ZodNumber;
168
177
  h: z.ZodNumber;
169
178
  l: z.ZodNumber;
170
- n: z.ZodNumber;
179
+ n: z.ZodOptional<z.ZodNumber>;
171
180
  o: z.ZodNumber;
172
181
  t: z.ZodNumber;
173
182
  v: z.ZodNumber;
174
- vw: z.ZodNumber;
183
+ vw: z.ZodOptional<z.ZodNumber>;
175
184
  }, "strip", z.ZodTypeAny, {
176
185
  t: number;
177
- T: string;
178
186
  o: number;
179
187
  h: number;
180
188
  l: number;
181
189
  c: number;
182
190
  v: number;
183
- vw: number;
184
- n: number;
191
+ T?: string | undefined;
192
+ vw?: number | undefined;
193
+ n?: number | undefined;
185
194
  }, {
186
195
  t: number;
187
- T: string;
188
196
  o: number;
189
197
  h: number;
190
198
  l: number;
191
199
  c: number;
192
200
  v: number;
193
- vw: number;
194
- n: number;
201
+ T?: string | undefined;
202
+ vw?: number | undefined;
203
+ n?: number | undefined;
195
204
  }>, "many">;
196
205
  }, "strip", z.ZodTypeAny, {
197
206
  status: string;
198
207
  results: {
199
208
  t: number;
200
- T: string;
201
209
  o: number;
202
210
  h: number;
203
211
  l: number;
204
212
  c: number;
205
213
  v: number;
206
- vw: number;
207
- n: number;
214
+ T?: string | undefined;
215
+ vw?: number | undefined;
216
+ n?: number | undefined;
208
217
  }[];
209
- adjusted: boolean;
210
218
  request_id: string;
219
+ adjusted: boolean;
211
220
  queryCount: number;
212
221
  resultsCount: number;
213
222
  }, {
214
223
  status: string;
215
224
  results: {
216
225
  t: number;
217
- T: string;
218
226
  o: number;
219
227
  h: number;
220
228
  l: number;
221
229
  c: number;
222
230
  v: number;
223
- vw: number;
224
- n: number;
231
+ T?: string | undefined;
232
+ vw?: number | undefined;
233
+ n?: number | undefined;
225
234
  }[];
226
- adjusted: boolean;
227
235
  request_id: string;
236
+ adjusted: boolean;
228
237
  queryCount: number;
229
238
  resultsCount: number;
230
239
  }>;
@@ -279,26 +288,26 @@ export declare const MassiveTradeSchema: z.ZodObject<{
279
288
  trf_timestamp: z.ZodOptional<z.ZodNumber>;
280
289
  }, "strip", z.ZodTypeAny, {
281
290
  id: string;
282
- size: number;
283
- price: number;
284
- exchange: number;
285
291
  conditions: number[];
292
+ exchange: number;
286
293
  participant_timestamp: number;
294
+ price: number;
287
295
  sequence_number: number;
288
296
  sip_timestamp: number;
297
+ size: number;
289
298
  correction?: number | undefined;
290
299
  tape?: number | undefined;
291
300
  trf_id?: number | undefined;
292
301
  trf_timestamp?: number | undefined;
293
302
  }, {
294
303
  id: string;
295
- size: number;
296
- price: number;
297
- exchange: number;
298
304
  conditions: number[];
305
+ exchange: number;
299
306
  participant_timestamp: number;
307
+ price: number;
300
308
  sequence_number: number;
301
309
  sip_timestamp: number;
310
+ size: number;
302
311
  correction?: number | undefined;
303
312
  tape?: number | undefined;
304
313
  trf_id?: number | undefined;
@@ -324,26 +333,26 @@ export declare const MassiveTradesResponseSchema: z.ZodObject<{
324
333
  trf_timestamp: z.ZodOptional<z.ZodNumber>;
325
334
  }, "strip", z.ZodTypeAny, {
326
335
  id: string;
327
- size: number;
328
- price: number;
329
- exchange: number;
330
336
  conditions: number[];
337
+ exchange: number;
331
338
  participant_timestamp: number;
339
+ price: number;
332
340
  sequence_number: number;
333
341
  sip_timestamp: number;
342
+ size: number;
334
343
  correction?: number | undefined;
335
344
  tape?: number | undefined;
336
345
  trf_id?: number | undefined;
337
346
  trf_timestamp?: number | undefined;
338
347
  }, {
339
348
  id: string;
340
- size: number;
341
- price: number;
342
- exchange: number;
343
349
  conditions: number[];
350
+ exchange: number;
344
351
  participant_timestamp: number;
352
+ price: number;
345
353
  sequence_number: number;
346
354
  sip_timestamp: number;
355
+ size: number;
347
356
  correction?: number | undefined;
348
357
  tape?: number | undefined;
349
358
  trf_id?: number | undefined;
@@ -353,13 +362,13 @@ export declare const MassiveTradesResponseSchema: z.ZodObject<{
353
362
  status: "OK";
354
363
  results: {
355
364
  id: string;
356
- size: number;
357
- price: number;
358
- exchange: number;
359
365
  conditions: number[];
366
+ exchange: number;
360
367
  participant_timestamp: number;
368
+ price: number;
361
369
  sequence_number: number;
362
370
  sip_timestamp: number;
371
+ size: number;
363
372
  correction?: number | undefined;
364
373
  tape?: number | undefined;
365
374
  trf_id?: number | undefined;
@@ -371,13 +380,13 @@ export declare const MassiveTradesResponseSchema: z.ZodObject<{
371
380
  status: "OK";
372
381
  results: {
373
382
  id: string;
374
- size: number;
375
- price: number;
376
- exchange: number;
377
383
  conditions: number[];
384
+ exchange: number;
378
385
  participant_timestamp: number;
386
+ price: number;
379
387
  sequence_number: number;
380
388
  sip_timestamp: number;
389
+ size: number;
381
390
  correction?: number | undefined;
382
391
  tape?: number | undefined;
383
392
  trf_id?: number | undefined;
@@ -405,12 +414,12 @@ export declare const MassiveLastTradeResponseSchema: z.ZodObject<{
405
414
  trf_timestamp: z.ZodOptional<z.ZodNumber>;
406
415
  }, "strip", z.ZodTypeAny, {
407
416
  id: string;
408
- size: number;
409
- price: number;
410
417
  exchange: number;
411
418
  participant_timestamp: number;
419
+ price: number;
412
420
  sequence_number: number;
413
421
  sip_timestamp: number;
422
+ size: number;
414
423
  conditions?: number[] | undefined;
415
424
  correction?: number | undefined;
416
425
  tape?: number | undefined;
@@ -418,12 +427,12 @@ export declare const MassiveLastTradeResponseSchema: z.ZodObject<{
418
427
  trf_timestamp?: number | undefined;
419
428
  }, {
420
429
  id: string;
421
- size: number;
422
- price: number;
423
430
  exchange: number;
424
431
  participant_timestamp: number;
432
+ price: number;
425
433
  sequence_number: number;
426
434
  sip_timestamp: number;
435
+ size: number;
427
436
  conditions?: number[] | undefined;
428
437
  correction?: number | undefined;
429
438
  tape?: number | undefined;
@@ -434,12 +443,12 @@ export declare const MassiveLastTradeResponseSchema: z.ZodObject<{
434
443
  status: string;
435
444
  results: {
436
445
  id: string;
437
- size: number;
438
- price: number;
439
446
  exchange: number;
440
447
  participant_timestamp: number;
448
+ price: number;
441
449
  sequence_number: number;
442
450
  sip_timestamp: number;
451
+ size: number;
443
452
  conditions?: number[] | undefined;
444
453
  correction?: number | undefined;
445
454
  tape?: number | undefined;
@@ -451,12 +460,12 @@ export declare const MassiveLastTradeResponseSchema: z.ZodObject<{
451
460
  status: string;
452
461
  results: {
453
462
  id: string;
454
- size: number;
455
- price: number;
456
463
  exchange: number;
457
464
  participant_timestamp: number;
465
+ price: number;
458
466
  sequence_number: number;
459
467
  sip_timestamp: number;
468
+ size: number;
460
469
  conditions?: number[] | undefined;
461
470
  correction?: number | undefined;
462
471
  tape?: number | undefined;
@@ -466,79 +475,88 @@ export declare const MassiveLastTradeResponseSchema: z.ZodObject<{
466
475
  request_id: string;
467
476
  }>;
468
477
  /** Schema for Massive aggregates (bars) response */
478
+ /**
479
+ * Single-ticker aggregates envelope.
480
+ *
481
+ * Only `status` and the bars are load-bearing: the aggregates path reads
482
+ * neither `request_id` nor the counts, and requiring a field no consumer
483
+ * depends on would report drift that cannot affect anything — noise that
484
+ * teaches an operator to ignore the signal. The grouped-daily schema does
485
+ * require `request_id`, because that path copies it into its own result.
486
+ */
469
487
  export declare const MassiveAggregatesResponseSchema: z.ZodObject<{
470
488
  adjusted: z.ZodOptional<z.ZodBoolean>;
471
489
  next_url: z.ZodOptional<z.ZodString>;
472
490
  queryCount: z.ZodOptional<z.ZodNumber>;
473
- request_id: z.ZodString;
491
+ request_id: z.ZodOptional<z.ZodString>;
474
492
  results: z.ZodOptional<z.ZodArray<z.ZodObject<{
475
- T: z.ZodString;
493
+ T: z.ZodOptional<z.ZodString>;
476
494
  c: z.ZodNumber;
477
495
  h: z.ZodNumber;
478
496
  l: z.ZodNumber;
479
- n: z.ZodNumber;
497
+ n: z.ZodOptional<z.ZodNumber>;
480
498
  o: z.ZodNumber;
481
499
  t: z.ZodNumber;
482
500
  v: z.ZodNumber;
483
- vw: z.ZodNumber;
501
+ vw: z.ZodOptional<z.ZodNumber>;
484
502
  }, "strip", z.ZodTypeAny, {
485
503
  t: number;
486
- T: string;
487
504
  o: number;
488
505
  h: number;
489
506
  l: number;
490
507
  c: number;
491
508
  v: number;
492
- vw: number;
493
- n: number;
509
+ T?: string | undefined;
510
+ vw?: number | undefined;
511
+ n?: number | undefined;
494
512
  }, {
495
513
  t: number;
496
- T: string;
497
514
  o: number;
498
515
  h: number;
499
516
  l: number;
500
517
  c: number;
501
518
  v: number;
502
- vw: number;
503
- n: number;
519
+ T?: string | undefined;
520
+ vw?: number | undefined;
521
+ n?: number | undefined;
504
522
  }>, "many">>;
505
523
  resultsCount: z.ZodOptional<z.ZodNumber>;
506
524
  status: z.ZodString;
507
525
  ticker: z.ZodOptional<z.ZodString>;
508
526
  }, "strip", z.ZodTypeAny, {
509
527
  status: string;
510
- request_id: string;
511
528
  ticker?: string | undefined;
512
529
  results?: {
513
530
  t: number;
514
- T: string;
515
531
  o: number;
516
532
  h: number;
517
533
  l: number;
518
534
  c: number;
519
535
  v: number;
520
- vw: number;
521
- n: number;
536
+ T?: string | undefined;
537
+ vw?: number | undefined;
538
+ n?: number | undefined;
522
539
  }[] | undefined;
540
+ request_id?: string | undefined;
523
541
  adjusted?: boolean | undefined;
524
542
  queryCount?: number | undefined;
525
543
  resultsCount?: number | undefined;
526
544
  next_url?: string | undefined;
527
545
  }, {
528
546
  status: string;
529
- request_id: string;
530
547
  ticker?: string | undefined;
531
548
  results?: {
532
549
  t: number;
533
- T: string;
534
550
  o: number;
535
551
  h: number;
536
552
  l: number;
537
553
  c: number;
538
554
  v: number;
539
- vw: number;
540
- n: number;
555
+ T?: string | undefined;
556
+ vw?: number | undefined;
557
+ n?: number | undefined;
541
558
  }[] | undefined;
559
+ request_id?: string | undefined;
542
560
  adjusted?: boolean | undefined;
543
561
  queryCount?: number | undefined;
544
562
  resultsCount?: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"massive-schemas.d.ts","sourceRoot":"","sources":["../../../src/schemas/massive-schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpC,CAAC;AAIH,8CAA8C;AAC9C,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAalC,CAAC;AAEH,gEAAgE;AAChE,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI7C,CAAC;AAIH,gDAAgD;AAChD,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO5C,CAAC;AAIH,mDAAmD;AACnD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWtC,CAAC;AAIH,wCAAwC;AACxC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa7B,CAAC;AAEH,yCAAyC;AACzC,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKtC,CAAC;AAIH,mFAAmF;AACnF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBzC,CAAC;AAIH,oDAAoD;AACpD,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS1C,CAAC;AAIH,wCAAwC;AACxC,eAAO,MAAM,0BAA0B;;;;;;;;;;;;EAIrC,CAAC"}
1
+ {"version":3,"file":"massive-schemas.d.ts","sourceRoot":"","sources":["../../../src/schemas/massive-schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpC,CAAC;AAIH,8CAA8C;AAC9C,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAelC,CAAC;AAEH,gEAAgE;AAChE,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI7C,CAAC;AAIH,gDAAgD;AAChD,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO5C,CAAC;AAIH,mDAAmD;AACnD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWtC,CAAC;AAIH,wCAAwC;AACxC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa7B,CAAC;AAEH,yCAAyC;AACzC,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKtC,CAAC;AAIH,mFAAmF;AACnF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBzC,CAAC;AAIH,oDAAoD;AACpD;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS1C,CAAC;AAIH,wCAAwC;AACxC,eAAO,MAAM,0BAA0B;;;;;;;;;;;;EAIrC,CAAC"}
@@ -4,62 +4,84 @@
4
4
  * Conventions:
5
5
  * - tradePnls / tradeReturns is an array of per-trade realised P&L or return
6
6
  * (positive = win, negative = loss, zero = breakeven).
7
- * - All "rolling*" functions return null when fewer than `windowSize` trades exist.
7
+ * - Every statistic here is a ratio or a mean over a WINDOW, so every one is
8
+ * returned as a {@link SampleStatistic}: the value cannot be read without the
9
+ * `sampleCount` it was taken over and the `coverage` of the window that was
10
+ * asked for. A hit-rate is a different claim on 5 trades than on 500, and a
11
+ * window that could only be half-filled is a different cohort from a full
12
+ * one — a caller holding a bare number can tell neither apart.
13
+ * - A window that cannot support the statistic returns the unavailable branch
14
+ * with a reason, never a numeric stand-in. Zero is a measurement.
8
15
  * - All public functions reject non-finite inputs (NaN, Infinity) by throwing.
9
16
  * Callers must pre-validate or filter their inputs.
10
17
  */
18
+ import { type SampleStatistic } from "./sample-statistic";
11
19
  /**
12
20
  * Rolling expectancy: mean P&L over the most-recent `windowSize` trades.
13
21
  *
14
22
  * @param tradePnls - Array of per-trade realised P&L values.
15
23
  * @param windowSize - Number of most-recent trades to include. Must be a positive integer.
16
- * @returns Mean P&L of the last `windowSize` trades, or null when fewer than `windowSize` exist.
24
+ * @returns Mean P&L of the last `windowSize` trades with its cohort, or a typed
25
+ * unavailable result when fewer than `windowSize` trades exist.
17
26
  * @throws When `windowSize` is not a positive integer or any input is non-finite.
18
27
  */
19
- export declare function calculateRollingExpectancy(tradePnls: number[], windowSize: number): number | null;
28
+ export declare function calculateRollingExpectancy(tradePnls: number[], windowSize: number): SampleStatistic<number>;
20
29
  /**
21
30
  * Rolling hit-rate: fraction of strictly-positive P&L trades in the most-recent
22
31
  * `windowSize` trades. Zero P&L counts as non-win.
23
32
  *
24
33
  * @param tradePnls - Array of per-trade realised P&L values.
25
34
  * @param windowSize - Number of most-recent trades to include. Must be a positive integer.
26
- * @returns Fraction of winning trades in the window, or null when fewer than `windowSize` exist.
35
+ * @returns Fraction of winning trades in the window with its cohort, or a typed
36
+ * unavailable result when fewer than `windowSize` trades exist.
27
37
  * @throws When `windowSize` is not a positive integer or any input is non-finite.
28
38
  */
29
- export declare function calculateRollingHitRate(tradePnls: number[], windowSize: number): number | null;
39
+ export declare function calculateRollingHitRate(tradePnls: number[], windowSize: number): SampleStatistic<number>;
30
40
  /**
31
41
  * Rolling profit factor: sum(wins) / |sum(losses)| over the most-recent `windowSize` trades.
32
42
  *
33
43
  * Edge cases:
34
- * - no losses and at least one win → +Infinity
35
- * - no wins and no losses (all zeros) → 0
36
- * - fewer than windowSize trades → null
44
+ * - no losses and at least one win → +Infinity (an unbounded but real ratio)
45
+ * - no wins and no losses (all zeros) → unavailable: `0 / 0` is undefined, and a
46
+ * window of breakeven trades has no profit factor rather than a profit factor
47
+ * of zero
48
+ * - fewer than windowSize trades → unavailable
37
49
  *
38
50
  * @param tradePnls - Array of per-trade realised P&L values.
39
51
  * @param windowSize - Number of most-recent trades to include. Must be a positive integer.
40
- * @returns Profit factor for the rolling window, or null when fewer than `windowSize` exist.
52
+ * @returns Profit factor for the rolling window with its cohort, or a typed
53
+ * unavailable result.
41
54
  * @throws When `windowSize` is not a positive integer or any input is non-finite.
42
55
  */
43
- export declare function calculateRollingProfitFactor(tradePnls: number[], windowSize: number): number | null;
56
+ export declare function calculateRollingProfitFactor(tradePnls: number[], windowSize: number): SampleStatistic<number>;
44
57
  /**
45
58
  * Rolling Sortino: delegate to `calculateSortino` over the most-recent `windowSize` returns.
46
59
  *
47
60
  * @param tradeReturns - Array of per-trade return values.
48
61
  * @param windowSize - Number of most-recent trades to include. Must be a positive integer.
49
62
  * @param riskFreeRate - Risk-free rate to subtract from returns (default 0).
50
- * @returns Sortino ratio for the rolling window, or null when fewer than `windowSize` exist.
63
+ * @returns Sortino ratio for the rolling window with its cohort, or a typed
64
+ * unavailable result.
51
65
  * @throws When `windowSize` is not a positive integer or any input is non-finite.
52
66
  */
53
- export declare function calculateRollingSortino(tradeReturns: number[], windowSize: number, riskFreeRate?: number): number | null;
67
+ export declare function calculateRollingSortino(tradeReturns: number[], windowSize: number, riskFreeRate?: number): SampleStatistic<number>;
54
68
  /**
55
69
  * Z-score of live-expectancy vs backtest-expectancy, scaled by the backtest stddev.
56
70
  * Positive Z = live outperforming; negative Z = live underperforming.
57
71
  *
58
- * @param liveExpectancy - Mean P&L per trade in the live window.
72
+ * The live expectancy is taken as a {@link SampleStatistic} rather than a bare
73
+ * number so the z-score inherits the cohort it was actually derived from. A
74
+ * z-score is a statement about how surprising a sample mean is, and how
75
+ * surprising it is depends entirely on how many trades produced it — quoting
76
+ * the z alone is the exact substitution this type exists to block. An
77
+ * unavailable live expectancy yields an unavailable z, because there is no
78
+ * mean to compare.
79
+ *
80
+ * @param liveExpectancy - Mean P&L per trade in the live window, with its cohort.
59
81
  * @param backtestExpectancy - Mean P&L per trade from the calibration backtest.
60
82
  * @param backtestStddev - Stddev of per-trade P&L in the backtest. Must be > 0.
61
- * @returns Z-score measuring divergence between live and backtest performance.
62
- * @throws When any input is non-finite or `backtestStddev` is not positive.
83
+ * @returns Z-score measuring live-vs-backtest divergence, carrying the live cohort.
84
+ * @throws When the backtest inputs are non-finite or `backtestStddev` is not positive.
63
85
  */
64
- export declare function calculateBacktestDivergenceZ(liveExpectancy: number, backtestExpectancy: number, backtestStddev: number): number;
86
+ export declare function calculateBacktestDivergenceZ(liveExpectancy: SampleStatistic<number>, backtestExpectancy: number, backtestStddev: number): SampleStatistic<number>;
65
87
  //# sourceMappingURL=strategy-metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"strategy-metrics.d.ts","sourceRoot":"","sources":["../../src/strategy-metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkBH;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAMf;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAOf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CASf;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,YAAY,SAAI,GACf,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,MAAM,GACrB,MAAM,CAQR"}
1
+ {"version":3,"file":"strategy-metrics.d.ts","sourceRoot":"","sources":["../../src/strategy-metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAwC5B;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,GACjB,eAAe,CAAC,MAAM,CAAC,CAezB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,GACjB,eAAe,CAAC,MAAM,CAAC,CAgBzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,GACjB,eAAe,CAAC,MAAM,CAAC,CAyBzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,YAAY,SAAI,GACf,eAAe,CAAC,MAAM,CAAC,CAuBzB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,eAAe,CAAC,MAAM,CAAC,EACvC,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,MAAM,GACrB,eAAe,CAAC,MAAM,CAAC,CAqBzB"}
@@ -1,6 +1,7 @@
1
1
  import { ApolloClientType, NormalizedCacheObject } from "@adaptic/backend";
2
2
  import { types } from "@adaptic/backend";
3
3
  import type Alpaca from "@alpacahq/alpaca-trade-api";
4
+ import type { SampleStatistic } from "../sample-statistic";
4
5
  /** Config parameter type for Alpaca SDK market data methods (getLatestQuote, etc.) */
5
6
  export type AlpacaSDKConfig = NonNullable<Parameters<Alpaca["getLatestQuote"]>[1]>;
6
7
  /** Parameter type for Alpaca SDK getOrders method */
@@ -101,15 +102,38 @@ export interface BenchmarkBar {
101
102
  c: number;
102
103
  }
103
104
  /**
104
- * Result of the beta calculation.
105
+ * The components of a beta measurement, all derived from the same paired
106
+ * observations.
107
+ *
108
+ * They travel together because they are one measurement, not five: a
109
+ * `covariance` reported next to a `variance` taken over a different set of
110
+ * rows is not a beta, it is two numbers that look like one.
105
111
  */
106
- export interface CalculateBetaResult {
112
+ export interface BetaComponents {
113
+ /** Slope of portfolio returns on benchmark returns: `covariance / variance`. */
107
114
  beta: number;
115
+ /** Sample covariance of the paired returns (Bessel-corrected). */
108
116
  covariance: number;
117
+ /** Sample variance of the benchmark returns (Bessel-corrected). */
109
118
  variance: number;
119
+ /** Mean portfolio return over the surviving pairs. */
110
120
  averagePortfolioReturn: number;
121
+ /** Mean benchmark return over the surviving pairs. */
111
122
  averageBenchmarkReturn: number;
112
123
  }
124
+ /**
125
+ * Result of the beta calculation, inseparable from the cohort it was measured
126
+ * on.
127
+ *
128
+ * Beta is a ratio of two second moments, so it is meaningless without the
129
+ * number of paired observations behind it and the fraction of the offered rows
130
+ * that survived pairing and finiteness filtering. Returning the components
131
+ * alone lets a caller read a beta computed from two usable rows out of nine
132
+ * hundred as though it were the whole series, and lets an uncomputable beta
133
+ * arrive as a `0` that reads as "no market exposure" — which is a measurement,
134
+ * and a consequential one, rather than the absence it actually is.
135
+ */
136
+ export type CalculateBetaResult = SampleStatistic<BetaComponents>;
113
137
  /**
114
138
  * Represents a position in the portfolio.
115
139
  */
@@ -820,8 +844,19 @@ export interface OptionAccountActivity {
820
844
  price?: string;
821
845
  status: "executed";
822
846
  }
847
+ /**
848
+ * Every order-lifecycle event the Alpaca trade-updates stream emits.
849
+ *
850
+ * Declared once here because two partial copies drift: the stream emits all of
851
+ * these names, and a union that omits some of them forces a cast at the point
852
+ * of receipt, which silently accepts any string and defeats the union's purpose.
853
+ * Terminal-rejection events (`rejected`, `order_cancel_rejected`,
854
+ * `order_replace_rejected`) matter most — a consumer that cannot name them
855
+ * cannot distinguish a refused order from one still working.
856
+ */
857
+ export type AlpacaTradeUpdateEvent = "new" | "fill" | "partial_fill" | "canceled" | "expired" | "done_for_day" | "replaced" | "rejected" | "pending_new" | "pending_cancel" | "pending_replace" | "calculated" | "suspended" | "order_cancel_rejected" | "order_replace_rejected" | "stopped" | "accepted" | "accepted_for_bidding";
823
858
  export interface TradeUpdate {
824
- event: "new" | "fill" | "partial_fill" | "canceled" | "expired" | "pending_new" | "pending_cancel" | "pending_replace" | "replaced" | "done_for_day";
859
+ event: AlpacaTradeUpdateEvent;
825
860
  price?: string;
826
861
  timestamp: string;
827
862
  qty?: string;