@livefolio/sdk 0.2.13 → 0.3.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 +277 -84
- package/dist/index.d.ts +397 -23
- package/dist/index.js +1375 -51
- package/dist/index.js.map +1 -1
- package/package.json +36 -35
- package/dist/auth/client.d.ts +0 -4
- package/dist/auth/client.d.ts.map +0 -1
- package/dist/auth/client.js +0 -37
- package/dist/auth/client.js.map +0 -1
- package/dist/auth/index.d.ts +0 -3
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -6
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/types.d.ts +0 -9
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js +0 -3
- package/dist/auth/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/market/client.d.ts +0 -4
- package/dist/market/client.d.ts.map +0 -1
- package/dist/market/client.js +0 -137
- package/dist/market/client.js.map +0 -1
- package/dist/market/index.d.ts +0 -5
- package/dist/market/index.d.ts.map +0 -1
- package/dist/market/index.js +0 -9
- package/dist/market/index.js.map +0 -1
- package/dist/market/trackedTickers.d.ts +0 -4
- package/dist/market/trackedTickers.d.ts.map +0 -1
- package/dist/market/trackedTickers.js +0 -256
- package/dist/market/trackedTickers.js.map +0 -1
- package/dist/market/types.d.ts +0 -29
- package/dist/market/types.d.ts.map +0 -1
- package/dist/market/types.js +0 -3
- package/dist/market/types.js.map +0 -1
- package/dist/portfolio/client.d.ts +0 -4
- package/dist/portfolio/client.d.ts.map +0 -1
- package/dist/portfolio/client.js +0 -13
- package/dist/portfolio/client.js.map +0 -1
- package/dist/portfolio/index.d.ts +0 -5
- package/dist/portfolio/index.d.ts.map +0 -1
- package/dist/portfolio/index.js +0 -26
- package/dist/portfolio/index.js.map +0 -1
- package/dist/portfolio/rebalance.d.ts +0 -62
- package/dist/portfolio/rebalance.d.ts.map +0 -1
- package/dist/portfolio/rebalance.js +0 -205
- package/dist/portfolio/rebalance.js.map +0 -1
- package/dist/portfolio/symbols.d.ts +0 -13
- package/dist/portfolio/symbols.d.ts.map +0 -1
- package/dist/portfolio/symbols.js +0 -112
- package/dist/portfolio/symbols.js.map +0 -1
- package/dist/portfolio/types.d.ts +0 -13
- package/dist/portfolio/types.d.ts.map +0 -1
- package/dist/portfolio/types.js +0 -3
- package/dist/portfolio/types.js.map +0 -1
- package/dist/strategy/backtest.d.ts +0 -6
- package/dist/strategy/backtest.d.ts.map +0 -1
- package/dist/strategy/backtest.js +0 -698
- package/dist/strategy/backtest.js.map +0 -1
- package/dist/strategy/cache.d.ts +0 -8
- package/dist/strategy/cache.d.ts.map +0 -1
- package/dist/strategy/cache.js +0 -336
- package/dist/strategy/cache.js.map +0 -1
- package/dist/strategy/client.d.ts +0 -4
- package/dist/strategy/client.d.ts.map +0 -1
- package/dist/strategy/client.js +0 -29
- package/dist/strategy/client.js.map +0 -1
- package/dist/strategy/evaluate.d.ts +0 -12
- package/dist/strategy/evaluate.d.ts.map +0 -1
- package/dist/strategy/evaluate.js +0 -562
- package/dist/strategy/evaluate.js.map +0 -1
- package/dist/strategy/get.d.ts +0 -5
- package/dist/strategy/get.d.ts.map +0 -1
- package/dist/strategy/get.js +0 -25
- package/dist/strategy/get.js.map +0 -1
- package/dist/strategy/index.d.ts +0 -14
- package/dist/strategy/index.d.ts.map +0 -1
- package/dist/strategy/index.js +0 -44
- package/dist/strategy/index.js.map +0 -1
- package/dist/strategy/livefolio.d.ts +0 -25
- package/dist/strategy/livefolio.d.ts.map +0 -1
- package/dist/strategy/livefolio.js +0 -67
- package/dist/strategy/livefolio.js.map +0 -1
- package/dist/strategy/performance.d.ts +0 -17
- package/dist/strategy/performance.d.ts.map +0 -1
- package/dist/strategy/performance.js +0 -57
- package/dist/strategy/performance.js.map +0 -1
- package/dist/strategy/rules.d.ts +0 -3
- package/dist/strategy/rules.d.ts.map +0 -1
- package/dist/strategy/rules.js +0 -95
- package/dist/strategy/rules.js.map +0 -1
- package/dist/strategy/stream.d.ts +0 -5
- package/dist/strategy/stream.d.ts.map +0 -1
- package/dist/strategy/stream.js +0 -58
- package/dist/strategy/stream.js.map +0 -1
- package/dist/strategy/symbols.d.ts +0 -4
- package/dist/strategy/symbols.d.ts.map +0 -1
- package/dist/strategy/symbols.js +0 -41
- package/dist/strategy/symbols.js.map +0 -1
- package/dist/strategy/time.d.ts +0 -10
- package/dist/strategy/time.d.ts.map +0 -1
- package/dist/strategy/time.js +0 -33
- package/dist/strategy/time.js.map +0 -1
- package/dist/strategy/types.d.ts +0 -200
- package/dist/strategy/types.d.ts.map +0 -1
- package/dist/strategy/types.js +0 -3
- package/dist/strategy/types.js.map +0 -1
- package/dist/types.d.ts +0 -4
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.REBALANCE_CASH_SOURCE_SYMBOL = exports.REBALANCE_CASH_SYMBOL = exports.REBALANCE_PER_ORDER_FEE = exports.REBALANCE_SELL_SLIPPAGE_BPS = exports.REBALANCE_BUY_SLIPPAGE_BPS = exports.REBALANCE_MIN_CASH_RESERVE_VALUE = exports.REBALANCE_CASH_RESERVE_PERCENT = exports.REBALANCE_EPSILON = exports.REBALANCE_WHOLE_SHARE_QUANTITY_PRECISION = exports.REBALANCE_QUANTITY_PRECISION = exports.REBALANCE_MIN_TRADE_VALUE = exports.PORTFOLIO_DRIFT_THRESHOLD_PERCENT_POINTS = void 0;
|
|
4
|
-
exports.computePortfolioDriftPercentPoints = computePortfolioDriftPercentPoints;
|
|
5
|
-
exports.buildRebalancePlan = buildRebalancePlan;
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
// Constants (exported so consumers can import defaults)
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
/** Minimum portfolio drift (in percentage points) required before rebalancing is triggered. */
|
|
10
|
-
exports.PORTFOLIO_DRIFT_THRESHOLD_PERCENT_POINTS = 25;
|
|
11
|
-
/** Ignore tiny deltas below this notional value to avoid dust trades. */
|
|
12
|
-
exports.REBALANCE_MIN_TRADE_VALUE = 1;
|
|
13
|
-
/** Default quantity precision for fractionable symbols (100 = 2 decimal places). */
|
|
14
|
-
exports.REBALANCE_QUANTITY_PRECISION = 100;
|
|
15
|
-
/** Quantity precision for whole-share-only symbols (1 = integer shares only). */
|
|
16
|
-
exports.REBALANCE_WHOLE_SHARE_QUANTITY_PRECISION = 1;
|
|
17
|
-
/** Numeric tolerance for floating-point comparisons. */
|
|
18
|
-
exports.REBALANCE_EPSILON = 1e-9;
|
|
19
|
-
/** Keep this % of cash unallocated as a safety reserve. */
|
|
20
|
-
exports.REBALANCE_CASH_RESERVE_PERCENT = 1;
|
|
21
|
-
/** Absolute minimum dollar reserve kept as cash. */
|
|
22
|
-
exports.REBALANCE_MIN_CASH_RESERVE_VALUE = 10;
|
|
23
|
-
/** Inflate buy pricing by this many basis points when sizing orders. */
|
|
24
|
-
exports.REBALANCE_BUY_SLIPPAGE_BPS = 30;
|
|
25
|
-
/** Haircut expected sell proceeds by this many basis points when funding buys. */
|
|
26
|
-
exports.REBALANCE_SELL_SLIPPAGE_BPS = 20;
|
|
27
|
-
/** Flat per-order fee assumption used in funding math. */
|
|
28
|
-
exports.REBALANCE_PER_ORDER_FEE = 0;
|
|
29
|
-
/** Canonical symbol used in targetWeights when strategy holds cash. */
|
|
30
|
-
exports.REBALANCE_CASH_SYMBOL = 'CASH';
|
|
31
|
-
/** Strategy ticker that means "hold as cash". */
|
|
32
|
-
exports.REBALANCE_CASH_SOURCE_SYMBOL = 'DTB3';
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
// Helpers
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
function assertFiniteNumber(name, value) {
|
|
37
|
-
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
38
|
-
throw new Error(`Invalid numeric value for ${name}`);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
function assertNonNegative(name, value) {
|
|
42
|
-
assertFiniteNumber(name, value);
|
|
43
|
-
if (value < 0) {
|
|
44
|
-
throw new Error(`Invalid negative value for ${name}`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
function assertPositive(name, value) {
|
|
48
|
-
assertFiniteNumber(name, value);
|
|
49
|
-
if (value <= 0) {
|
|
50
|
-
throw new Error(`Invalid non-positive value for ${name}`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function quantityFromNotional(notional, price, quantityPrecision) {
|
|
54
|
-
return Math.floor((notional / price) * quantityPrecision) / quantityPrecision;
|
|
55
|
-
}
|
|
56
|
-
function bpsToFraction(bps) {
|
|
57
|
-
return bps / 10_000;
|
|
58
|
-
}
|
|
59
|
-
// ---------------------------------------------------------------------------
|
|
60
|
-
// Public functions
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
62
|
-
function computePortfolioDriftPercentPoints(input) {
|
|
63
|
-
const { targetWeights, currentValues, cashValue, totalValue } = input;
|
|
64
|
-
assertPositive('totalValue', totalValue);
|
|
65
|
-
assertNonNegative('cashValue', cashValue);
|
|
66
|
-
let targetWeightSum = 0;
|
|
67
|
-
for (const [symbol, weight] of Object.entries(targetWeights)) {
|
|
68
|
-
assertNonNegative(`targetWeight(${symbol})`, weight);
|
|
69
|
-
targetWeightSum += weight;
|
|
70
|
-
}
|
|
71
|
-
if (targetWeightSum > 100 + exports.REBALANCE_EPSILON) {
|
|
72
|
-
throw new Error(`Invalid target weights: sum exceeds 100 (${targetWeightSum.toFixed(4)})`);
|
|
73
|
-
}
|
|
74
|
-
const symbols = new Set([...Object.keys(targetWeights), ...Object.keys(currentValues)]);
|
|
75
|
-
let absSum = 0;
|
|
76
|
-
for (const symbol of symbols) {
|
|
77
|
-
const currentValue = currentValues[symbol] ?? 0;
|
|
78
|
-
assertNonNegative(`currentValue(${symbol})`, currentValue);
|
|
79
|
-
const currentWeight = (currentValue / totalValue) * 100;
|
|
80
|
-
const targetWeight = targetWeights[symbol] ?? 0;
|
|
81
|
-
absSum += Math.abs(targetWeight - currentWeight);
|
|
82
|
-
}
|
|
83
|
-
// Only add implicit cash when target weights don't sum to 100 (no explicit cash ticker).
|
|
84
|
-
if (targetWeightSum < 100) {
|
|
85
|
-
const targetCashWeight = 100 - targetWeightSum;
|
|
86
|
-
const currentCashWeight = (cashValue / totalValue) * 100;
|
|
87
|
-
absSum += Math.abs(targetCashWeight - currentCashWeight);
|
|
88
|
-
}
|
|
89
|
-
return absSum / 2;
|
|
90
|
-
}
|
|
91
|
-
function buildRebalancePlan(input) {
|
|
92
|
-
const { targetWeights, currentValues, prices, quantityPrecisionBySymbol, cashValue, totalValue, portfolioDriftThresholdPercentPoints = exports.PORTFOLIO_DRIFT_THRESHOLD_PERCENT_POINTS, minTradeValue = exports.REBALANCE_MIN_TRADE_VALUE, cashReservePercent = exports.REBALANCE_CASH_RESERVE_PERCENT, minCashReserveValue = exports.REBALANCE_MIN_CASH_RESERVE_VALUE, buySlippageBps = exports.REBALANCE_BUY_SLIPPAGE_BPS, sellSlippageBps = exports.REBALANCE_SELL_SLIPPAGE_BPS, perOrderFee = exports.REBALANCE_PER_ORDER_FEE, cashSymbol, } = input;
|
|
93
|
-
assertPositive('totalValue', totalValue);
|
|
94
|
-
assertNonNegative('cashValue', cashValue);
|
|
95
|
-
assertNonNegative('portfolioDriftThresholdPercentPoints', portfolioDriftThresholdPercentPoints);
|
|
96
|
-
assertNonNegative('minTradeValue', minTradeValue);
|
|
97
|
-
assertNonNegative('cashReservePercent', cashReservePercent);
|
|
98
|
-
assertNonNegative('minCashReserveValue', minCashReserveValue);
|
|
99
|
-
assertNonNegative('buySlippageBps', buySlippageBps);
|
|
100
|
-
assertNonNegative('sellSlippageBps', sellSlippageBps);
|
|
101
|
-
assertNonNegative('perOrderFee', perOrderFee);
|
|
102
|
-
for (const [symbol, precision] of Object.entries(quantityPrecisionBySymbol ?? {})) {
|
|
103
|
-
assertPositive(`quantityPrecisionBySymbol(${symbol})`, precision);
|
|
104
|
-
}
|
|
105
|
-
const portfolioDriftPercentPoints = computePortfolioDriftPercentPoints({
|
|
106
|
-
targetWeights,
|
|
107
|
-
currentValues,
|
|
108
|
-
cashValue,
|
|
109
|
-
totalValue,
|
|
110
|
-
});
|
|
111
|
-
if (portfolioDriftPercentPoints < portfolioDriftThresholdPercentPoints) {
|
|
112
|
-
return {
|
|
113
|
-
triggered: false,
|
|
114
|
-
portfolioDriftPercentPoints,
|
|
115
|
-
reason: 'below_threshold',
|
|
116
|
-
orders: [],
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
const symbols = new Set([...Object.keys(targetWeights), ...Object.keys(currentValues)]);
|
|
120
|
-
const sellCandidates = [];
|
|
121
|
-
const buyCandidates = [];
|
|
122
|
-
for (const symbol of symbols) {
|
|
123
|
-
if (cashSymbol != null && symbol === cashSymbol)
|
|
124
|
-
continue;
|
|
125
|
-
const currentValue = currentValues[symbol] ?? 0;
|
|
126
|
-
assertNonNegative(`currentValue(${symbol})`, currentValue);
|
|
127
|
-
const targetWeight = targetWeights[symbol] ?? 0;
|
|
128
|
-
const targetValue = (targetWeight / 100) * totalValue;
|
|
129
|
-
const delta = targetValue - currentValue;
|
|
130
|
-
if (Math.abs(delta) <= minTradeValue)
|
|
131
|
-
continue;
|
|
132
|
-
const price = prices[symbol];
|
|
133
|
-
assertPositive(`price(${symbol})`, price);
|
|
134
|
-
if (delta < 0) {
|
|
135
|
-
sellCandidates.push({ symbol, notional: Math.abs(delta), price });
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
buyCandidates.push({ symbol, notional: delta, price });
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
sellCandidates.sort((a, b) => b.notional - a.notional);
|
|
142
|
-
buyCandidates.sort((a, b) => b.notional - a.notional);
|
|
143
|
-
const orders = [];
|
|
144
|
-
const reserveValue = Math.max(minCashReserveValue, cashValue * (cashReservePercent / 100));
|
|
145
|
-
let availableFunds = Math.max(0, cashValue - reserveValue);
|
|
146
|
-
const buySlippageMultiplier = 1 + bpsToFraction(buySlippageBps);
|
|
147
|
-
const sellSlippageMultiplier = 1 - bpsToFraction(sellSlippageBps);
|
|
148
|
-
for (const candidate of sellCandidates) {
|
|
149
|
-
const quantityPrecision = quantityPrecisionBySymbol?.[candidate.symbol] ?? exports.REBALANCE_QUANTITY_PRECISION;
|
|
150
|
-
const quantity = quantityFromNotional(candidate.notional, candidate.price, quantityPrecision);
|
|
151
|
-
if (quantity <= 0)
|
|
152
|
-
continue;
|
|
153
|
-
const estimatedValue = quantity * candidate.price;
|
|
154
|
-
if (estimatedValue <= minTradeValue)
|
|
155
|
-
continue;
|
|
156
|
-
orders.push({
|
|
157
|
-
action: 'SELL',
|
|
158
|
-
symbol: candidate.symbol,
|
|
159
|
-
quantity,
|
|
160
|
-
estimatedPrice: candidate.price,
|
|
161
|
-
estimatedValue,
|
|
162
|
-
});
|
|
163
|
-
const netProceeds = Math.max(0, estimatedValue * sellSlippageMultiplier - perOrderFee);
|
|
164
|
-
availableFunds += netProceeds;
|
|
165
|
-
}
|
|
166
|
-
for (const candidate of buyCandidates) {
|
|
167
|
-
if (availableFunds <= minTradeValue)
|
|
168
|
-
break;
|
|
169
|
-
const maxAffordableNotional = Math.max(0, availableFunds - perOrderFee);
|
|
170
|
-
const cappedNotional = Math.min(candidate.notional, maxAffordableNotional);
|
|
171
|
-
const effectiveBuyPrice = candidate.price * buySlippageMultiplier;
|
|
172
|
-
const quantityPrecision = quantityPrecisionBySymbol?.[candidate.symbol] ?? exports.REBALANCE_QUANTITY_PRECISION;
|
|
173
|
-
const quantity = quantityFromNotional(cappedNotional, effectiveBuyPrice, quantityPrecision);
|
|
174
|
-
if (quantity <= 0)
|
|
175
|
-
continue;
|
|
176
|
-
const estimatedValue = quantity * candidate.price;
|
|
177
|
-
if (estimatedValue <= minTradeValue)
|
|
178
|
-
continue;
|
|
179
|
-
const reservedCost = quantity * effectiveBuyPrice + perOrderFee;
|
|
180
|
-
if (reservedCost > availableFunds + exports.REBALANCE_EPSILON)
|
|
181
|
-
continue;
|
|
182
|
-
orders.push({
|
|
183
|
-
action: 'BUY',
|
|
184
|
-
symbol: candidate.symbol,
|
|
185
|
-
quantity,
|
|
186
|
-
estimatedPrice: candidate.price,
|
|
187
|
-
estimatedValue,
|
|
188
|
-
});
|
|
189
|
-
availableFunds = Math.max(0, availableFunds - reservedCost);
|
|
190
|
-
}
|
|
191
|
-
orders.sort((a, b) => {
|
|
192
|
-
if (a.action === 'SELL' && b.action === 'BUY')
|
|
193
|
-
return -1;
|
|
194
|
-
if (a.action === 'BUY' && b.action === 'SELL')
|
|
195
|
-
return 1;
|
|
196
|
-
return 0;
|
|
197
|
-
});
|
|
198
|
-
return {
|
|
199
|
-
triggered: true,
|
|
200
|
-
portfolioDriftPercentPoints,
|
|
201
|
-
reason: orders.length > 0 ? 'ok' : 'no_orders',
|
|
202
|
-
orders,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
//# sourceMappingURL=rebalance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rebalance.js","sourceRoot":"","sources":["../../src/portfolio/rebalance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Ticker } from '../strategy/types';
|
|
2
|
-
/** Maps FRED rate symbols to tradable equivalents. `null` = hold as cash. */
|
|
3
|
-
export declare const FRED_TRADABLE_MAP: Record<string, string | null>;
|
|
4
|
-
/** Normalizes equivalent base tickers to a canonical symbol for leverage lookups. */
|
|
5
|
-
export declare const BASE_TICKER_ALIASES: Record<string, string>;
|
|
6
|
-
/** Maps "SYMBOL:LEVERAGE" to the actual leveraged/inverse ETF ticker. Covers bull (2x/3x) and inverse (-1x/-2x/-3x). */
|
|
7
|
-
export declare const ETF_LEVERAGE_MAP: Record<string, string>;
|
|
8
|
-
/**
|
|
9
|
-
* Maps a strategy ticker to its tradable symbol.
|
|
10
|
-
* Pipeline: FRED mapping -> leveraged/inverse ETF lookup (with alias normalization) -> passthrough.
|
|
11
|
-
*/
|
|
12
|
-
export declare function mapTickerToTradable(ticker: Ticker): string | null;
|
|
13
|
-
//# sourceMappingURL=symbols.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../src/portfolio/symbols.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG3D,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGtD,CAAC;AAEF,wHAAwH;AACxH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoFnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBjE"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ETF_LEVERAGE_MAP = exports.BASE_TICKER_ALIASES = exports.FRED_TRADABLE_MAP = void 0;
|
|
4
|
-
exports.mapTickerToTradable = mapTickerToTradable;
|
|
5
|
-
/** Maps FRED rate symbols to tradable equivalents. `null` = hold as cash. */
|
|
6
|
-
exports.FRED_TRADABLE_MAP = {
|
|
7
|
-
DTB3: null,
|
|
8
|
-
DFF: 'USFR',
|
|
9
|
-
};
|
|
10
|
-
/** Normalizes equivalent base tickers to a canonical symbol for leverage lookups. */
|
|
11
|
-
exports.BASE_TICKER_ALIASES = {
|
|
12
|
-
VOO: 'SPY',
|
|
13
|
-
IVV: 'SPY',
|
|
14
|
-
};
|
|
15
|
-
/** Maps "SYMBOL:LEVERAGE" to the actual leveraged/inverse ETF ticker. Covers bull (2x/3x) and inverse (-1x/-2x/-3x). */
|
|
16
|
-
exports.ETF_LEVERAGE_MAP = {
|
|
17
|
-
// Bull — Broad market
|
|
18
|
-
'SPY:2': 'SSO',
|
|
19
|
-
'SPY:3': 'UPRO',
|
|
20
|
-
'QQQ:2': 'QLD',
|
|
21
|
-
'QQQ:3': 'TQQQ',
|
|
22
|
-
'IWM:2': 'UWM',
|
|
23
|
-
'IWM:3': 'TNA',
|
|
24
|
-
'DIA:2': 'DDM',
|
|
25
|
-
'DIA:3': 'UDOW',
|
|
26
|
-
'MDY:2': 'MVV',
|
|
27
|
-
'MDY:3': 'UMDD',
|
|
28
|
-
// Bull — Bonds
|
|
29
|
-
'TLT:2': 'UBT',
|
|
30
|
-
'TLT:3': 'TMF',
|
|
31
|
-
// Bull — Sectors
|
|
32
|
-
'XLF:2': 'UYG',
|
|
33
|
-
'XLF:3': 'FAS',
|
|
34
|
-
'XLE:2': 'DIG',
|
|
35
|
-
'XLK:2': 'ROM',
|
|
36
|
-
'XLK:3': 'TECL',
|
|
37
|
-
'XLV:2': 'RXL',
|
|
38
|
-
'XLV:3': 'CURE',
|
|
39
|
-
'XLU:2': 'UPW',
|
|
40
|
-
'XLB:2': 'UYM',
|
|
41
|
-
'XLP:2': 'UGE',
|
|
42
|
-
'XLY:2': 'UCC',
|
|
43
|
-
'XLI:2': 'UXI',
|
|
44
|
-
'XLI:3': 'DUSL',
|
|
45
|
-
'XLRE:2': 'URE',
|
|
46
|
-
'XLRE:3': 'DRN',
|
|
47
|
-
'SOXX:2': 'USD',
|
|
48
|
-
'SOXX:3': 'SOXL',
|
|
49
|
-
// Bull — International
|
|
50
|
-
'EEM:2': 'EET',
|
|
51
|
-
'EEM:3': 'EDC',
|
|
52
|
-
'EFA:2': 'EFO',
|
|
53
|
-
'FXI:3': 'YINN',
|
|
54
|
-
// Bull — Commodities
|
|
55
|
-
'GLD:2': 'UGL',
|
|
56
|
-
'SLV:2': 'AGQ',
|
|
57
|
-
'USO:2': 'UCO',
|
|
58
|
-
'GDX:2': 'NUGT',
|
|
59
|
-
// Bull — Crypto
|
|
60
|
-
'BTC-USD:2': 'BITU',
|
|
61
|
-
// Inverse — Broad market
|
|
62
|
-
'SPY:-1': 'SH',
|
|
63
|
-
'SPY:-2': 'SDS',
|
|
64
|
-
'SPY:-3': 'SPXU',
|
|
65
|
-
'QQQ:-1': 'PSQ',
|
|
66
|
-
'QQQ:-2': 'QID',
|
|
67
|
-
'QQQ:-3': 'SQQQ',
|
|
68
|
-
'IWM:-1': 'RWM',
|
|
69
|
-
'IWM:-2': 'TWM',
|
|
70
|
-
'IWM:-3': 'TZA',
|
|
71
|
-
'DIA:-1': 'DOG',
|
|
72
|
-
'DIA:-2': 'DXD',
|
|
73
|
-
'DIA:-3': 'SDOW',
|
|
74
|
-
'MDY:-3': 'SMDD',
|
|
75
|
-
// Inverse — Bonds
|
|
76
|
-
'TLT:-1': 'TBF',
|
|
77
|
-
'TLT:-2': 'TBT',
|
|
78
|
-
'TLT:-3': 'TMV',
|
|
79
|
-
// Inverse — Sectors
|
|
80
|
-
'XLF:-2': 'SKF',
|
|
81
|
-
'XLF:-3': 'FAZ',
|
|
82
|
-
'XLE:-2': 'DUG',
|
|
83
|
-
'XLK:-3': 'TECS',
|
|
84
|
-
'SOXX:-3': 'SOXS',
|
|
85
|
-
// Inverse — International
|
|
86
|
-
'EEM:-2': 'EEV',
|
|
87
|
-
'EEM:-3': 'EDZ',
|
|
88
|
-
// Inverse — Commodities
|
|
89
|
-
'GLD:-2': 'GLL',
|
|
90
|
-
};
|
|
91
|
-
/**
|
|
92
|
-
* Maps a strategy ticker to its tradable symbol.
|
|
93
|
-
* Pipeline: FRED mapping -> leveraged/inverse ETF lookup (with alias normalization) -> passthrough.
|
|
94
|
-
*/
|
|
95
|
-
function mapTickerToTradable(ticker) {
|
|
96
|
-
const { symbol, leverage } = ticker;
|
|
97
|
-
// FRED mapping takes priority
|
|
98
|
-
if (symbol in exports.FRED_TRADABLE_MAP)
|
|
99
|
-
return exports.FRED_TRADABLE_MAP[symbol];
|
|
100
|
-
// Leveraged/inverse ETF lookup
|
|
101
|
-
if (leverage !== 1) {
|
|
102
|
-
const canonical = exports.BASE_TICKER_ALIASES[symbol] ?? symbol;
|
|
103
|
-
const key = `${canonical}:${leverage}`;
|
|
104
|
-
const mapped = exports.ETF_LEVERAGE_MAP[key];
|
|
105
|
-
if (!mapped) {
|
|
106
|
-
throw new Error(`No leveraged ETF mapping for ${symbol} at ${leverage}x`);
|
|
107
|
-
}
|
|
108
|
-
return mapped;
|
|
109
|
-
}
|
|
110
|
-
return symbol;
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=symbols.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/portfolio/symbols.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Ticker } from '../strategy/types';
|
|
2
|
-
import type { RebalancePlanInput, RebalancePlan } from './rebalance';
|
|
3
|
-
export interface PortfolioModule {
|
|
4
|
-
buildRebalancePlan(input: RebalancePlanInput): RebalancePlan;
|
|
5
|
-
computePortfolioDriftPercentPoints(input: {
|
|
6
|
-
targetWeights: Record<string, number>;
|
|
7
|
-
currentValues: Record<string, number>;
|
|
8
|
-
cashValue: number;
|
|
9
|
-
totalValue: number;
|
|
10
|
-
}): number;
|
|
11
|
-
mapTickerToTradable(ticker: Ticker): string | null;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/portfolio/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAAC;IAC7D,kCAAkC,CAAC,KAAK,EAAE;QACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,MAAM,CAAC;IACX,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACpD"}
|
package/dist/portfolio/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/portfolio/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { BacktestOptions, BacktestResult, Strategy, StrategyDraft } from './types';
|
|
2
|
-
import type { MarketModule } from '../market/types';
|
|
3
|
-
export declare function backtestWithMarketData(market: Pick<MarketModule, 'getBatchSeriesFromDb' | 'getTradingDays'>, strategy: Strategy, options: BacktestOptions): Promise<BacktestResult>;
|
|
4
|
-
export declare function backtestRulesWithMarketData(market: Pick<MarketModule, 'getBatchSeriesFromDb' | 'getTradingDays'>, strategyDraft: StrategyDraft, options: BacktestOptions): Promise<BacktestResult>;
|
|
5
|
-
export declare function backtest(strategy: Strategy, options: BacktestOptions): Promise<BacktestResult>;
|
|
6
|
-
//# sourceMappingURL=backtest.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backtest.d.ts","sourceRoot":"","sources":["../../src/strategy/backtest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAEf,cAAc,EAGd,QAAQ,EACR,aAAa,EACd,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,iBAAiB,CAAC;AA0f7E,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,sBAAsB,GAAG,gBAAgB,CAAC,EACrE,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAEzB;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,sBAAsB,GAAG,gBAAgB,CAAC,EACrE,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAGzB;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA4VpG"}
|