@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.
- package/README.md +161 -0
- package/bun-ffi.d.ts +54 -0
- package/dist/index.js +576 -0
- package/dist/src/index.d.ts +324 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +403 -0
- package/dist/types/index.d.ts.map +1 -0
- package/native/README.md +62 -0
- package/native/darwin-arm64/libquant_rust.dylib +0 -0
- package/package.json +70 -0
- package/scripts/postinstall.cjs +85 -0
- package/src/ffi.rs +496 -0
- package/src/index.ts +1073 -0
- package/src/indicators/ma.rs +222 -0
- package/src/indicators/mod.rs +18 -0
- package/src/indicators/momentum.rs +353 -0
- package/src/indicators/sr.rs +195 -0
- package/src/indicators/trend.rs +351 -0
- package/src/indicators/volatility.rs +270 -0
- package/src/indicators/volume.rs +213 -0
- package/src/lib.rs +130 -0
- package/src/patterns/breakout.rs +431 -0
- package/src/patterns/chart.rs +772 -0
- package/src/patterns/mod.rs +394 -0
- package/src/patterns/sr.rs +423 -0
- package/src/prediction/amm.rs +338 -0
- package/src/prediction/arbitrage.rs +230 -0
- package/src/prediction/calibration.rs +317 -0
- package/src/prediction/kelly.rs +232 -0
- package/src/prediction/lmsr.rs +194 -0
- package/src/prediction/mod.rs +59 -0
- package/src/prediction/odds.rs +229 -0
- package/src/prediction/pnl.rs +254 -0
- package/src/prediction/risk.rs +228 -0
- package/src/risk/beta.rs +257 -0
- package/src/risk/drawdown.rs +256 -0
- package/src/risk/leverage.rs +201 -0
- package/src/risk/mod.rs +388 -0
- package/src/risk/portfolio.rs +287 -0
- package/src/risk/ratios.rs +290 -0
- package/src/risk/sizing.rs +194 -0
- package/src/risk/var.rs +222 -0
- package/src/stats/cdf.rs +257 -0
- package/src/stats/correlation.rs +225 -0
- package/src/stats/distribution.rs +194 -0
- package/src/stats/hypothesis.rs +177 -0
- package/src/stats/matrix.rs +346 -0
- package/src/stats/mod.rs +257 -0
- package/src/stats/regression.rs +239 -0
- package/src/stats/rolling.rs +193 -0
- package/src/stats/timeseries.rs +263 -0
- package/src/types.rs +224 -0
- package/src/utils/mod.rs +215 -0
- package/src/utils/normalize.rs +192 -0
- package/src/utils/price.rs +167 -0
- package/src/utils/quantiles.rs +177 -0
- package/src/utils/returns.rs +158 -0
- package/src/utils/rolling.rs +97 -0
- package/src/utils/stats.rs +154 -0
- 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
|
+
}
|