@ebowwa/quant-rust 0.1.0

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 (60) hide show
  1. package/README.md +161 -0
  2. package/bun-ffi.d.ts +54 -0
  3. package/dist/index.js +576 -0
  4. package/dist/src/index.d.ts +324 -0
  5. package/dist/src/index.d.ts.map +1 -0
  6. package/dist/types/index.d.ts +403 -0
  7. package/dist/types/index.d.ts.map +1 -0
  8. package/native/README.md +62 -0
  9. package/native/darwin-arm64/libquant_rust.dylib +0 -0
  10. package/package.json +70 -0
  11. package/scripts/postinstall.cjs +85 -0
  12. package/src/ffi.rs +496 -0
  13. package/src/index.ts +1073 -0
  14. package/src/indicators/ma.rs +222 -0
  15. package/src/indicators/mod.rs +18 -0
  16. package/src/indicators/momentum.rs +353 -0
  17. package/src/indicators/sr.rs +195 -0
  18. package/src/indicators/trend.rs +351 -0
  19. package/src/indicators/volatility.rs +270 -0
  20. package/src/indicators/volume.rs +213 -0
  21. package/src/lib.rs +130 -0
  22. package/src/patterns/breakout.rs +431 -0
  23. package/src/patterns/chart.rs +772 -0
  24. package/src/patterns/mod.rs +394 -0
  25. package/src/patterns/sr.rs +423 -0
  26. package/src/prediction/amm.rs +338 -0
  27. package/src/prediction/arbitrage.rs +230 -0
  28. package/src/prediction/calibration.rs +317 -0
  29. package/src/prediction/kelly.rs +232 -0
  30. package/src/prediction/lmsr.rs +194 -0
  31. package/src/prediction/mod.rs +59 -0
  32. package/src/prediction/odds.rs +229 -0
  33. package/src/prediction/pnl.rs +254 -0
  34. package/src/prediction/risk.rs +228 -0
  35. package/src/risk/beta.rs +257 -0
  36. package/src/risk/drawdown.rs +256 -0
  37. package/src/risk/leverage.rs +201 -0
  38. package/src/risk/mod.rs +388 -0
  39. package/src/risk/portfolio.rs +287 -0
  40. package/src/risk/ratios.rs +290 -0
  41. package/src/risk/sizing.rs +194 -0
  42. package/src/risk/var.rs +222 -0
  43. package/src/stats/cdf.rs +257 -0
  44. package/src/stats/correlation.rs +225 -0
  45. package/src/stats/distribution.rs +194 -0
  46. package/src/stats/hypothesis.rs +177 -0
  47. package/src/stats/matrix.rs +346 -0
  48. package/src/stats/mod.rs +257 -0
  49. package/src/stats/regression.rs +239 -0
  50. package/src/stats/rolling.rs +193 -0
  51. package/src/stats/timeseries.rs +263 -0
  52. package/src/types.rs +224 -0
  53. package/src/utils/mod.rs +215 -0
  54. package/src/utils/normalize.rs +192 -0
  55. package/src/utils/price.rs +167 -0
  56. package/src/utils/quantiles.rs +177 -0
  57. package/src/utils/returns.rs +158 -0
  58. package/src/utils/rolling.rs +97 -0
  59. package/src/utils/stats.rs +154 -0
  60. package/types/index.ts +513 -0
package/types/index.ts ADDED
@@ -0,0 +1,513 @@
1
+ /**
2
+ * TypeScript type definitions for quant-rust
3
+ *
4
+ * These types mirror the Rust types in src/types.rs
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+
9
+ // ============================================================================
10
+ // OHLCV Types
11
+ // ============================================================================
12
+
13
+ /**
14
+ * OHLCV candlestick data
15
+ */
16
+ export interface OHLCV {
17
+ /** Unix timestamp in milliseconds */
18
+ timestamp: number;
19
+ /** Opening price */
20
+ open: number;
21
+ /** High price */
22
+ high: number;
23
+ /** Low price */
24
+ low: number;
25
+ /** Closing price */
26
+ close: number;
27
+ /** Volume */
28
+ volume: number;
29
+ }
30
+
31
+ // ============================================================================
32
+ // AMM Types
33
+ // ============================================================================
34
+
35
+ /**
36
+ * AMM (Automated Market Maker) state for constant-product AMMs
37
+ */
38
+ export interface AMMState {
39
+ /** YES pool reserves */
40
+ pool_yes: number;
41
+ /** NO pool reserves */
42
+ pool_no: number;
43
+ /** Constant product k = pool_yes * pool_no */
44
+ k: number;
45
+ /** LP token total supply */
46
+ lp_token_supply: number;
47
+ /** Fee as decimal (e.g., 0.003 for 0.3%) */
48
+ fee: number;
49
+ }
50
+
51
+ /**
52
+ * AMM cost calculation result
53
+ */
54
+ export interface AMMCostResult {
55
+ /** Total cost to buy the shares */
56
+ cost: number;
57
+ /** Average price per share */
58
+ avg_price: number;
59
+ }
60
+
61
+ /**
62
+ * AMM price impact result
63
+ */
64
+ export interface AMMPriceImpactResult {
65
+ /** Price before the trade */
66
+ initial_price: number;
67
+ /** Price after the trade */
68
+ final_price: number;
69
+ /** Price impact as decimal (e.g., 0.01 = 1%) */
70
+ price_impact: number;
71
+ /** Price impact in basis points (1 bp = 0.01%) */
72
+ impact_bps: number;
73
+ }
74
+
75
+ // ============================================================================
76
+ // LMSR Types
77
+ // ============================================================================
78
+
79
+ /**
80
+ * LMSR (Logarithmic Market Scoring Rule) state
81
+ */
82
+ export interface LMSRState {
83
+ /** YES shares outstanding */
84
+ yes_shares: number;
85
+ /** NO shares outstanding */
86
+ no_shares: number;
87
+ /** Liquidity parameter (controls price sensitivity) */
88
+ b: number;
89
+ }
90
+
91
+ /**
92
+ * LMSR price result
93
+ */
94
+ export interface LMSRPriceResult {
95
+ /** Current YES price (0-1) */
96
+ yes_price: number;
97
+ /** Current NO price (0-1) */
98
+ no_price: number;
99
+ }
100
+
101
+ // ============================================================================
102
+ // Kelly Criterion Types
103
+ // ============================================================================
104
+
105
+ /**
106
+ * Result of Kelly criterion calculation
107
+ */
108
+ export interface KellyResult {
109
+ /** Full Kelly fraction (0-1) */
110
+ kelly_fraction: number;
111
+ /** Half Kelly fraction (more conservative) */
112
+ half_kelly: number;
113
+ /** Quarter Kelly fraction (most conservative) */
114
+ quarter_kelly: number;
115
+ /** Full bet size in currency units */
116
+ full_bet_size: number;
117
+ /** Half bet size in currency units */
118
+ half_bet_size: number;
119
+ /** Quarter bet size in currency units */
120
+ quarter_bet_size: number;
121
+ /** Expected edge (your_prob - market_price) */
122
+ edge: number;
123
+ /** Decimal odds */
124
+ odds: number;
125
+ }
126
+
127
+ /**
128
+ * A betting opportunity for multi-bet Kelly
129
+ */
130
+ export interface BetOpportunity {
131
+ /** Your estimated probability of winning */
132
+ your_prob: number;
133
+ /** Current market price */
134
+ market_price: number;
135
+ }
136
+
137
+ // ============================================================================
138
+ // Risk Types
139
+ // ============================================================================
140
+
141
+ /**
142
+ * Value at Risk (VaR) and Expected Shortfall (CVaR) result
143
+ */
144
+ export interface VaRResult {
145
+ /** Value at Risk at the given confidence level */
146
+ var: number;
147
+ /** Conditional VaR (Expected Shortfall) */
148
+ cvar: number;
149
+ /** Confidence level used */
150
+ confidence_level: number;
151
+ }
152
+
153
+ /**
154
+ * Drawdown analysis result
155
+ */
156
+ export interface DrawdownResult {
157
+ /** Maximum drawdown (as decimal, e.g., 0.25 = 25%) */
158
+ max_drawdown: number;
159
+ /** Maximum drawdown duration in periods */
160
+ max_duration: number;
161
+ /** Current drawdown */
162
+ current_drawdown: number;
163
+ /** Recovery factor (total return / max drawdown) */
164
+ recovery_factor: number;
165
+ }
166
+
167
+ /**
168
+ * Sharpe ratio result
169
+ */
170
+ export interface SharpeResult {
171
+ /** Sharpe ratio */
172
+ sharpe_ratio: number;
173
+ /** Annualized Sharpe ratio */
174
+ annualized_sharpe: number;
175
+ /** Risk-free rate used */
176
+ risk_free_rate: number;
177
+ /** Average return */
178
+ avg_return: number;
179
+ /** Standard deviation of returns */
180
+ std_dev: number;
181
+ }
182
+
183
+ // ============================================================================
184
+ // Statistical Types
185
+ // ============================================================================
186
+
187
+ /**
188
+ * Linear regression result
189
+ */
190
+ export interface RegressionResult {
191
+ /** Slope (beta coefficient) */
192
+ slope: number;
193
+ /** Intercept (alpha) */
194
+ intercept: number;
195
+ /** R-squared (coefficient of determination) */
196
+ r_squared: number;
197
+ /** Standard error of the slope */
198
+ std_error: number;
199
+ /** Number of observations */
200
+ n: number;
201
+ }
202
+
203
+ /**
204
+ * Distribution statistics
205
+ */
206
+ export interface DistributionStats {
207
+ /** Mean */
208
+ mean: number;
209
+ /** Median */
210
+ median: number;
211
+ /** Standard deviation */
212
+ std_dev: number;
213
+ /** Variance */
214
+ variance: number;
215
+ /** Skewness (asymmetry measure) */
216
+ skewness: number;
217
+ /** Kurtosis (tail heaviness, excess over normal) */
218
+ kurtosis: number;
219
+ /** Minimum value */
220
+ min: number;
221
+ /** Maximum value */
222
+ max: number;
223
+ /** Sample size */
224
+ count: number;
225
+ }
226
+
227
+ /**
228
+ * Autocorrelation result
229
+ */
230
+ export interface AutocorrelationResult {
231
+ /** Lag values */
232
+ lags: number[];
233
+ /** Autocorrelation coefficients */
234
+ autocorrelations: number[];
235
+ /** Confidence level (typically 1.96 / sqrt(n) for 95%) */
236
+ confidence_bound: number;
237
+ }
238
+
239
+ // ============================================================================
240
+ // Signal Types
241
+ // ============================================================================
242
+
243
+ /**
244
+ * Trading signal
245
+ */
246
+ export const enum Signal {
247
+ /** Strong buy signal */
248
+ StrongBuy = 2,
249
+ /** Buy signal */
250
+ Buy = 1,
251
+ /** Neutral / hold */
252
+ Neutral = 0,
253
+ /** Sell signal */
254
+ Sell = -1,
255
+ /** Strong sell signal */
256
+ StrongSell = -2,
257
+ }
258
+
259
+ /**
260
+ * Indicator result with value and signal
261
+ */
262
+ export interface IndicatorResult {
263
+ /** The indicator value */
264
+ value: number;
265
+ /** Trading signal derived from the indicator */
266
+ signal: Signal;
267
+ /** Optional upper band (for Bollinger, etc.) */
268
+ upper_band?: number;
269
+ /** Optional lower band */
270
+ lower_band?: number;
271
+ }
272
+
273
+ // ============================================================================
274
+ // Pattern Types
275
+ // ============================================================================
276
+
277
+ /**
278
+ * Candlestick pattern type
279
+ */
280
+ export const enum CandlePattern {
281
+ /** Doji - indecision */
282
+ Doji = 'Doji',
283
+ /** Hammer - bullish reversal */
284
+ Hammer = 'Hammer',
285
+ /** Inverted hammer - bullish reversal */
286
+ InvertedHammer = 'InvertedHammer',
287
+ /** Bullish engulfing - strong bullish reversal */
288
+ BullishEngulfing = 'BullishEngulfing',
289
+ /** Bearish engulfing - strong bearish reversal */
290
+ BearishEngulfing = 'BearishEngulfing',
291
+ /** Morning star - bullish reversal */
292
+ MorningStar = 'MorningStar',
293
+ /** Evening star - bearish reversal */
294
+ EveningStar = 'EveningStar',
295
+ /** Three white soldiers - strong bullish */
296
+ ThreeWhiteSoldiers = 'ThreeWhiteSoldiers',
297
+ /** Three black crows - strong bearish */
298
+ ThreeBlackCrows = 'ThreeBlackCrows',
299
+ /** Shooting star - bearish reversal */
300
+ ShootingStar = 'ShootingStar',
301
+ /** Hanging man - bearish reversal */
302
+ HangingMan = 'HangingMan',
303
+ }
304
+
305
+ /**
306
+ * Pattern recognition result
307
+ */
308
+ export interface PatternResult {
309
+ /** The detected pattern */
310
+ pattern: CandlePattern;
311
+ /** Confidence level (0-1) */
312
+ confidence: number;
313
+ /** Index in the data where pattern was found */
314
+ index: number;
315
+ /** Whether the pattern is bullish */
316
+ is_bullish: boolean;
317
+ }
318
+
319
+ // ============================================================================
320
+ // Odds Types
321
+ // ============================================================================
322
+
323
+ /**
324
+ * Odds conversion result
325
+ */
326
+ export interface OddsConversion {
327
+ /** Probability (0-1) */
328
+ probability: number;
329
+ /** Decimal odds (e.g., 2.0 for even money) */
330
+ decimal_odds: number;
331
+ /** American odds (e.g., -110, +200) */
332
+ american_odds: number;
333
+ }
334
+
335
+ /**
336
+ * Arbitrage detection result
337
+ */
338
+ export interface ArbitrageResult {
339
+ /** Whether an arbitrage opportunity exists */
340
+ has_arbitrage: boolean;
341
+ /** YES share price */
342
+ yes_price: number;
343
+ /** NO share price */
344
+ no_price: number;
345
+ /** Sum of prices (if < 1, arbitrage exists) */
346
+ total_price: number;
347
+ /** Profit per share if arbitrage exists */
348
+ profit_per_share: number;
349
+ /** Profit in basis points */
350
+ profit_bps: number;
351
+ }
352
+
353
+ // ============================================================================
354
+ // Brier Score Types
355
+ // ============================================================================
356
+
357
+ /**
358
+ * Brier score result
359
+ */
360
+ export interface BrierScore {
361
+ /** The Brier score (lower is better, 0 = perfect) */
362
+ score: number;
363
+ /** Number of predictions evaluated */
364
+ count: number;
365
+ }
366
+
367
+ /**
368
+ * Prediction for Brier score calculation
369
+ */
370
+ export interface Prediction {
371
+ /** Predicted probability (0-1) */
372
+ predicted: number;
373
+ /** Actual outcome (0 or 1) */
374
+ actual: number;
375
+ }
376
+
377
+ // ============================================================================
378
+ // Indicator Result Types
379
+ // ============================================================================
380
+
381
+ /**
382
+ * MACD (Moving Average Convergence Divergence) result
383
+ */
384
+ export interface MACDResult {
385
+ /** MACD line (fast EMA - slow EMA) */
386
+ macd: number[];
387
+ /** Signal line (EMA of MACD) */
388
+ signal: number[];
389
+ /** Histogram (MACD - Signal) */
390
+ histogram: number[];
391
+ }
392
+
393
+ /**
394
+ * Stochastic Oscillator result
395
+ */
396
+ export interface StochasticResult {
397
+ /** %K line (fast stochastic) */
398
+ k: number[];
399
+ /** %D line (SMA of %K) */
400
+ d: number[];
401
+ }
402
+
403
+ /**
404
+ * Bollinger Bands result
405
+ */
406
+ export interface BollingerBandsResult {
407
+ /** Upper band */
408
+ upper: number[];
409
+ /** Middle band (SMA) */
410
+ middle: number[];
411
+ /** Lower band */
412
+ lower: number[];
413
+ /** Bandwidth ((upper - lower) / middle * 100) */
414
+ bandwidth: number[];
415
+ /** %B (position within bands) */
416
+ percent_b: number[];
417
+ }
418
+
419
+ /**
420
+ * ATR (Average True Range) result
421
+ */
422
+ export interface ATRResult {
423
+ /** ATR values */
424
+ atr: number[];
425
+ /** True Range values */
426
+ tr: number[];
427
+ }
428
+
429
+ /**
430
+ * Keltner Channels result
431
+ */
432
+ export interface KeltnerChannelsResult {
433
+ /** Upper channel */
434
+ upper: number[];
435
+ /** Middle channel (EMA) */
436
+ middle: number[];
437
+ /** Lower channel */
438
+ lower: number[];
439
+ }
440
+
441
+ // ============================================================================
442
+ // Edge Calculation
443
+ // ============================================================================
444
+
445
+ /**
446
+ * Edge calculation result
447
+ */
448
+ export interface EdgeResult {
449
+ /** Your edge (your_probability - market_price) */
450
+ edge: number;
451
+ /** Whether you have a positive edge */
452
+ has_edge: boolean;
453
+ /** Edge as percentage */
454
+ edge_percent: number;
455
+ }
456
+
457
+ /**
458
+ * Calculate your edge in a prediction market bet
459
+ */
460
+ export function calculateEdge(
461
+ yourProbability: number,
462
+ marketPrice: number
463
+ ): EdgeResult {
464
+ const edge = yourProbability - marketPrice;
465
+ return {
466
+ edge,
467
+ has_edge: edge > 0,
468
+ edge_percent: edge * 100,
469
+ };
470
+ }
471
+
472
+ // ============================================================================
473
+ // Position Sizing Types
474
+ // ============================================================================
475
+
476
+ /**
477
+ * Fixed fractional position sizing result
478
+ */
479
+ export interface PositionSizeResult {
480
+ /** Position size in currency units */
481
+ position_size: number;
482
+ /** Number of shares/contracts */
483
+ shares: number;
484
+ /** Risk amount in currency units */
485
+ risk_amount: number;
486
+ /** Entry price */
487
+ entry_price: number;
488
+ /** Stop loss price */
489
+ stop_loss: number;
490
+ }
491
+
492
+ /**
493
+ * Calculate position size using fixed fractional risk management
494
+ */
495
+ export function positionSizeFixedFractional(
496
+ capital: number,
497
+ riskPercent: number,
498
+ entryPrice: number,
499
+ stopLoss: number
500
+ ): PositionSizeResult {
501
+ const riskAmount = capital * riskPercent;
502
+ const riskPerShare = Math.abs(entryPrice - stopLoss);
503
+ const shares = riskPerShare > 0 ? Math.floor(riskAmount / riskPerShare) : 0;
504
+ const positionSize = shares * entryPrice;
505
+
506
+ return {
507
+ position_size: positionSize,
508
+ shares,
509
+ risk_amount: riskAmount,
510
+ entry_price: entryPrice,
511
+ stop_loss: stopLoss,
512
+ };
513
+ }