@livefolio/sdk 0.2.1 → 0.2.4

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 (47) hide show
  1. package/README.md +23 -146
  2. package/dist/market/client.d.ts.map +1 -1
  3. package/dist/market/client.js +28 -0
  4. package/dist/market/client.js.map +1 -1
  5. package/dist/market/index.d.ts +2 -0
  6. package/dist/market/index.d.ts.map +1 -1
  7. package/dist/market/index.js +4 -1
  8. package/dist/market/index.js.map +1 -1
  9. package/dist/market/trackedTickers.d.ts +4 -0
  10. package/dist/market/trackedTickers.d.ts.map +1 -0
  11. package/dist/market/trackedTickers.js +256 -0
  12. package/dist/market/trackedTickers.js.map +1 -0
  13. package/dist/market/types.d.ts +2 -0
  14. package/dist/market/types.d.ts.map +1 -1
  15. package/dist/strategy/backtest.d.ts +6 -0
  16. package/dist/strategy/backtest.d.ts.map +1 -0
  17. package/dist/strategy/backtest.js +662 -0
  18. package/dist/strategy/backtest.js.map +1 -0
  19. package/dist/strategy/cache.d.ts +7 -0
  20. package/dist/strategy/cache.d.ts.map +1 -0
  21. package/dist/strategy/cache.js +312 -0
  22. package/dist/strategy/cache.js.map +1 -0
  23. package/dist/strategy/client.d.ts.map +1 -1
  24. package/dist/strategy/client.js +12 -333
  25. package/dist/strategy/client.js.map +1 -1
  26. package/dist/strategy/evaluate.d.ts.map +1 -1
  27. package/dist/strategy/evaluate.js +35 -8
  28. package/dist/strategy/evaluate.js.map +1 -1
  29. package/dist/strategy/get.d.ts +5 -0
  30. package/dist/strategy/get.d.ts.map +1 -0
  31. package/dist/strategy/get.js +25 -0
  32. package/dist/strategy/get.js.map +1 -0
  33. package/dist/strategy/index.d.ts +6 -1
  34. package/dist/strategy/index.d.ts.map +1 -1
  35. package/dist/strategy/index.js +14 -1
  36. package/dist/strategy/index.js.map +1 -1
  37. package/dist/strategy/rules.d.ts +3 -0
  38. package/dist/strategy/rules.d.ts.map +1 -0
  39. package/dist/strategy/rules.js +100 -0
  40. package/dist/strategy/rules.js.map +1 -0
  41. package/dist/strategy/stream.d.ts +5 -0
  42. package/dist/strategy/stream.d.ts.map +1 -0
  43. package/dist/strategy/stream.js +58 -0
  44. package/dist/strategy/stream.js.map +1 -0
  45. package/dist/strategy/types.d.ts +92 -1
  46. package/dist/strategy/types.d.ts.map +1 -1
  47. package/package.json +6 -2
@@ -1,5 +1,10 @@
1
- export type { StrategyModule, Strategy, NamedSignal, AllocationEvaluation, Signal, Allocation, Indicator, Ticker, Holding, Trading, Condition, SignalExpr, NotExpr, UnaryExpr, AndExpr, OrExpr, Comparison, IndicatorType, Frequency, Unit, EvaluationOptions, IndicatorEvaluation, StrategyEvaluation, BacktestOptions, BacktestResult, } from './types';
1
+ export type { StrategyModule, Strategy, NamedSignal, AllocationEvaluation, Signal, Allocation, Indicator, Ticker, Holding, Trading, Condition, SignalExpr, NotExpr, UnaryExpr, AndExpr, OrExpr, Comparison, IndicatorType, Frequency, Unit, EvaluationOptions, IndicatorEvaluation, StrategyEvaluation, StreamObservation, StrategyDraft, StrategyAllocationDraft, SignalNameExpr, NotSignalNameExpr, SignalNameUnaryExpr, SignalNameAndExpr, SignalNameOrExpr, SignalNameCondition, BacktestOptions, BacktestDebugOptions, BacktestRebalanceConfig, BacktestResult, BacktestTrade, BacktestTimeseries, BacktestSummary, BacktestAnnualTax, } from './types';
2
2
  export { createStrategy } from './client';
3
+ export { get, getMany } from './get';
4
+ export { evaluateCached } from './cache';
5
+ export { stream } from './stream';
6
+ export { backtest, backtestWithMarketData, backtestRulesWithMarketData } from './backtest';
7
+ export { compileRules } from './rules';
3
8
  export { evaluateIndicator, evaluateSignal, evaluateAllocation, evaluate, getEvaluationDate, indicatorKey, signalKey } from './evaluate';
4
9
  export { extractSymbols, INDICATOR_SYMBOL_MAP } from './symbols';
5
10
  export { utcToET, isAtMarketClose } from './time';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,QAAQ,EACR,WAAW,EACX,oBAAoB,EACpB,MAAM,EACN,UAAU,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,UAAU,EACV,OAAO,EACP,SAAS,EACT,OAAO,EACP,MAAM,EACN,UAAU,EACV,aAAa,EACb,SAAS,EACT,IAAI,EACJ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACzI,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,QAAQ,EACR,WAAW,EACX,oBAAoB,EACpB,MAAM,EACN,UAAU,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,UAAU,EACV,OAAO,EACP,SAAS,EACT,OAAO,EACP,MAAM,EACN,UAAU,EACV,aAAa,EACb,SAAS,EACT,IAAI,EACJ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACzI,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC"}
@@ -1,8 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isAtMarketClose = exports.utcToET = exports.INDICATOR_SYMBOL_MAP = exports.extractSymbols = exports.signalKey = exports.indicatorKey = exports.getEvaluationDate = exports.evaluate = exports.evaluateAllocation = exports.evaluateSignal = exports.evaluateIndicator = exports.createStrategy = void 0;
3
+ exports.isAtMarketClose = exports.utcToET = exports.INDICATOR_SYMBOL_MAP = exports.extractSymbols = exports.signalKey = exports.indicatorKey = exports.getEvaluationDate = exports.evaluate = exports.evaluateAllocation = exports.evaluateSignal = exports.evaluateIndicator = exports.compileRules = exports.backtestRulesWithMarketData = exports.backtestWithMarketData = exports.backtest = exports.stream = exports.evaluateCached = exports.getMany = exports.get = exports.createStrategy = void 0;
4
4
  var client_1 = require("./client");
5
5
  Object.defineProperty(exports, "createStrategy", { enumerable: true, get: function () { return client_1.createStrategy; } });
6
+ var get_1 = require("./get");
7
+ Object.defineProperty(exports, "get", { enumerable: true, get: function () { return get_1.get; } });
8
+ Object.defineProperty(exports, "getMany", { enumerable: true, get: function () { return get_1.getMany; } });
9
+ var cache_1 = require("./cache");
10
+ Object.defineProperty(exports, "evaluateCached", { enumerable: true, get: function () { return cache_1.evaluateCached; } });
11
+ var stream_1 = require("./stream");
12
+ Object.defineProperty(exports, "stream", { enumerable: true, get: function () { return stream_1.stream; } });
13
+ var backtest_1 = require("./backtest");
14
+ Object.defineProperty(exports, "backtest", { enumerable: true, get: function () { return backtest_1.backtest; } });
15
+ Object.defineProperty(exports, "backtestWithMarketData", { enumerable: true, get: function () { return backtest_1.backtestWithMarketData; } });
16
+ Object.defineProperty(exports, "backtestRulesWithMarketData", { enumerable: true, get: function () { return backtest_1.backtestRulesWithMarketData; } });
17
+ var rules_1 = require("./rules");
18
+ Object.defineProperty(exports, "compileRules", { enumerable: true, get: function () { return rules_1.compileRules; } });
6
19
  var evaluate_1 = require("./evaluate");
7
20
  Object.defineProperty(exports, "evaluateIndicator", { enumerable: true, get: function () { return evaluate_1.evaluateIndicator; } });
8
21
  Object.defineProperty(exports, "evaluateSignal", { enumerable: true, get: function () { return evaluate_1.evaluateSignal; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":";;;AA4BA,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AACvB,uCAAyI;AAAhI,6GAAA,iBAAiB,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,qGAAA,SAAS,OAAA;AACpH,qCAAiE;AAAxD,yGAAA,cAAc,OAAA;AAAE,+GAAA,oBAAoB,OAAA;AAC7C,+BAAkD;AAAzC,+FAAA,OAAO,OAAA;AAAE,uGAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":";;;AA2CA,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AACvB,6BAAqC;AAA5B,0FAAA,GAAG,OAAA;AAAE,8FAAA,OAAO,OAAA;AACrB,iCAAyC;AAAhC,uGAAA,cAAc,OAAA;AACvB,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,uCAA2F;AAAlF,oGAAA,QAAQ,OAAA;AAAE,kHAAA,sBAAsB,OAAA;AAAE,uHAAA,2BAA2B,OAAA;AACtE,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,uCAAyI;AAAhI,6GAAA,iBAAiB,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,qGAAA,SAAS,OAAA;AACpH,qCAAiE;AAAxD,yGAAA,cAAc,OAAA;AAAE,+GAAA,oBAAoB,OAAA;AAC7C,+BAAkD;AAAzC,+FAAA,OAAO,OAAA;AAAE,uGAAA,eAAe,OAAA"}
@@ -0,0 +1,3 @@
1
+ import type { StrategyDraft, Strategy } from './types';
2
+ export declare function compileRules(strategyDraft: StrategyDraft): Strategy;
3
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/strategy/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,aAAa,EAEb,QAAQ,EACT,MAAM,SAAS,CAAC;AAmDjB,wBAAgB,YAAY,CAAC,aAAa,EAAE,aAAa,GAAG,QAAQ,CAwDnE"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileRules = compileRules;
4
+ function isDefaultName(name) {
5
+ return name.trim().toLowerCase() === 'default';
6
+ }
7
+ function validateHoldingsWeights(strategyDraft) {
8
+ for (const allocation of strategyDraft.allocations) {
9
+ if (!allocation.holdings.length) {
10
+ throw new Error(`Allocation "${allocation.name}" must include at least one holding.`);
11
+ }
12
+ for (const holding of allocation.holdings) {
13
+ if (!Number.isFinite(holding.weight)) {
14
+ throw new Error(`Allocation "${allocation.name}" has a non-finite holding weight.`);
15
+ }
16
+ }
17
+ const total = allocation.holdings.reduce((sum, holding) => sum + holding.weight, 0);
18
+ if (!Number.isFinite(total) || Math.abs(total - 100) > 1e-6) {
19
+ throw new Error(`Allocation "${allocation.name}" weights must sum to 100.`);
20
+ }
21
+ }
22
+ }
23
+ function compileRuleCondition(condition, signalByName) {
24
+ switch (condition.kind) {
25
+ case 'signal': {
26
+ const signal = signalByName.get(condition.signalName);
27
+ if (!signal)
28
+ throw new Error(`Unknown signal reference: "${condition.signalName}".`);
29
+ return { kind: 'signal', signal };
30
+ }
31
+ case 'not': {
32
+ const signal = signalByName.get(condition.signalName);
33
+ if (!signal)
34
+ throw new Error(`Unknown signal reference: "${condition.signalName}".`);
35
+ return { kind: 'not', signal };
36
+ }
37
+ case 'and':
38
+ return {
39
+ kind: 'and',
40
+ args: condition.args.map((arg) => compileRuleCondition(arg, signalByName)),
41
+ };
42
+ case 'or':
43
+ return {
44
+ kind: 'or',
45
+ args: condition.args.map((arg) => compileRuleCondition(arg, signalByName)),
46
+ };
47
+ }
48
+ }
49
+ function compileRules(strategyDraft) {
50
+ if (strategyDraft.signals.length === 0) {
51
+ throw new Error('Rule strategy must define at least one signal.');
52
+ }
53
+ if (strategyDraft.allocations.length === 0) {
54
+ throw new Error('Rule strategy must define at least one allocation.');
55
+ }
56
+ const signalByName = new Map();
57
+ for (const signal of strategyDraft.signals) {
58
+ if (!signal.name.trim()) {
59
+ throw new Error('Signal names must be non-empty.');
60
+ }
61
+ if (signalByName.has(signal.name)) {
62
+ throw new Error(`Duplicate signal name: "${signal.name}".`);
63
+ }
64
+ signalByName.set(signal.name, signal.signal);
65
+ }
66
+ const allocationNames = new Set();
67
+ for (const allocation of strategyDraft.allocations) {
68
+ const normalized = allocation.name.trim().toLowerCase();
69
+ if (!normalized) {
70
+ throw new Error('Allocation names must be non-empty.');
71
+ }
72
+ if (allocationNames.has(normalized)) {
73
+ throw new Error(`Duplicate allocation name: "${allocation.name}".`);
74
+ }
75
+ allocationNames.add(normalized);
76
+ }
77
+ const defaultAllocations = strategyDraft.allocations.filter((allocation) => isDefaultName(allocation.name));
78
+ if (defaultAllocations.length !== 1) {
79
+ throw new Error('Rule strategy must include exactly one allocation named "Default".');
80
+ }
81
+ const defaultIndex = strategyDraft.allocations.findIndex((allocation) => isDefaultName(allocation.name));
82
+ if (defaultIndex !== strategyDraft.allocations.length - 1) {
83
+ throw new Error('Allocation "Default" must be the final fallback allocation.');
84
+ }
85
+ validateHoldingsWeights(strategyDraft);
86
+ return {
87
+ linkId: strategyDraft.linkId,
88
+ name: strategyDraft.name,
89
+ trading: strategyDraft.trading,
90
+ signals: strategyDraft.signals.map((signal) => ({ ...signal })),
91
+ allocations: strategyDraft.allocations.map((allocation) => ({
92
+ name: allocation.name,
93
+ allocation: {
94
+ condition: compileRuleCondition(allocation.condition, signalByName),
95
+ holdings: allocation.holdings.map((holding) => ({ ...holding })),
96
+ },
97
+ })),
98
+ };
99
+ }
100
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/strategy/rules.ts"],"names":[],"mappings":";;AA2DA,oCAwDC;AAzGD,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC;AACjD,CAAC;AAED,SAAS,uBAAuB,CAAC,aAA4B;IAC3D,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,CAAC,IAAI,sCAAsC,CAAC,CAAC;QACxF,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,CAAC,IAAI,oCAAoC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,CAAC,IAAI,4BAA4B,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,SAA8B,EAC9B,YAAiC;IAEjC,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC;YACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC;YACrF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACjC,CAAC;QACD,KAAK,KAAK;YACR,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAA4B,CAAC;aACtG,CAAC;QACJ,KAAK,IAAI;YACP,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAsB,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAY,CAAC;aACzG,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,aAA4B;IACvD,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,aAAa,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9D,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,kBAAkB,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5G,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzG,IAAI,YAAY,KAAK,aAAa,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAEvC,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC/D,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,UAAU,EAAE;gBACV,SAAS,EAAE,oBAAoB,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC;gBACnE,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;aACjE;SACF,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { TypedSupabaseClient } from '../types';
2
+ import type { MarketModule } from '../market/types';
3
+ import type { Strategy, StrategyEvaluation, StreamObservation } from './types';
4
+ export declare function stream(client: TypedSupabaseClient, market: MarketModule, strategy: Strategy, observation: StreamObservation | StreamObservation[]): Promise<StrategyEvaluation>;
5
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/strategy/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAsB/E,wBAAsB,MAAM,CAC1B,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,GACnD,OAAO,CAAC,kBAAkB,CAAC,CAyC7B"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stream = stream;
4
+ const evaluate_1 = require("./evaluate");
5
+ const symbols_1 = require("./symbols");
6
+ const cache_1 = require("./cache");
7
+ function mergeObservations(batchSeries, observations) {
8
+ let merged = { ...batchSeries };
9
+ for (const obs of observations) {
10
+ const series = [...(merged[obs.symbol] ?? [])];
11
+ const obsDate = obs.timestamp.slice(0, 10); // YYYY-MM-DD
12
+ const idx = series.findIndex(o => o.timestamp.slice(0, 10) === obsDate);
13
+ const entry = { timestamp: obs.timestamp, value: obs.value };
14
+ if (idx >= 0)
15
+ series[idx] = entry; // replace incomplete bar
16
+ else
17
+ series.push(entry); // append new day
18
+ merged = { ...merged, [obs.symbol]: series };
19
+ }
20
+ return merged;
21
+ }
22
+ async function stream(client, market, strategy, observation) {
23
+ const observations = Array.isArray(observation) ? observation : [observation];
24
+ if (observations.length === 0) {
25
+ throw new Error('stream() requires at least one observation');
26
+ }
27
+ // 1. Fetch historical series for all symbols
28
+ const symbols = (0, symbols_1.extractSymbols)(strategy);
29
+ const batchSeries = await market.getBatchSeries(symbols);
30
+ // 2. Merge the incoming observations into the series (replace same-date or append)
31
+ const mergedSeries = mergeObservations(batchSeries, observations);
32
+ // 3. Build evaluation options with latest observation timestamp
33
+ const at = new Date(observations[observations.length - 1].timestamp);
34
+ const options = { at, batchSeries: mergedSeries };
35
+ // 4. Fetch prior signal states for hysteresis (read-only, no cache write)
36
+ const stratRow = await client
37
+ .from('strategies')
38
+ .select('id')
39
+ .eq('link_id', strategy.linkId)
40
+ .limit(1)
41
+ .maybeSingle()
42
+ .then(({ data }) => data);
43
+ let prevSignals = {};
44
+ let prevMeta = {};
45
+ if (stratRow) {
46
+ [prevSignals, prevMeta] = await Promise.all([
47
+ (0, cache_1.fetchSignalStates)(client, stratRow.id),
48
+ (0, cache_1.fetchIndicatorMetadata)(client, stratRow.id),
49
+ ]);
50
+ }
51
+ // 5. Evaluate (skip cache check and result storage — interim data)
52
+ return (0, evaluate_1.evaluate)(strategy, {
53
+ ...options,
54
+ previousSignalStates: prevSignals,
55
+ previousIndicatorMetadata: prevMeta,
56
+ });
57
+ }
58
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/strategy/stream.ts"],"names":[],"mappings":";;AAwBA,wBA8CC;AAnED,yCAAsD;AACtD,uCAAiE;AACjE,mCAAoE;AAEpE,SAAS,iBAAiB,CACxB,WAA0C,EAC1C,YAAiC;IAEjC,IAAI,MAAM,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC;QACxE,MAAM,KAAK,GAAgB,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1E,IAAI,GAAG,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,yBAAyB;;YACvD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAW,iBAAiB;QACpD,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,MAAM,CAC1B,MAA2B,EAC3B,MAAoB,EACpB,QAAkB,EAClB,WAAoD;IAEpD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,6CAA6C;IAC7C,MAAM,OAAO,GAAG,IAAA,wBAAkB,EAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAEzD,mFAAmF;IACnF,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAElE,gEAAgE;IAChE,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IAElD,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,MAAM,MAAM;SAC1B,IAAI,CAAC,YAAY,CAAC;SAClB,MAAM,CAAC,IAAI,CAAC;SACZ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;SAC9B,KAAK,CAAC,CAAC,CAAC;SACR,WAAW,EAAE;SACb,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,WAAW,GAA4B,EAAE,CAAC;IAC9C,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1C,IAAA,yBAAiB,EAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtC,IAAA,8BAAsB,EAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,mEAAmE;IACnE,OAAO,IAAA,mBAAY,EAAC,QAAQ,EAAE;QAC5B,GAAG,OAAO;QACV,oBAAoB,EAAE,WAAW;QACjC,yBAAyB,EAAE,QAAQ;KACpC,CAAC,CAAC;AACL,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Observation } from '../market/types';
1
+ import type { Observation, TradingDay } from '../market/types';
2
2
  export type Comparison = '>' | '<' | '=';
3
3
  export type IndicatorType = 'SMA' | 'EMA' | 'Price' | 'Return' | 'Volatility' | 'Drawdown' | 'RSI' | 'VIX' | 'VIX3M' | 'T3M' | 'T6M' | 'T1Y' | 'T2Y' | 'T3Y' | 'T5Y' | 'T7Y' | 'T10Y' | 'T20Y' | 'T30Y' | 'Month' | 'Day of Week' | 'Day of Month' | 'Day of Year' | 'Threshold';
4
4
  export type Frequency = 'Daily' | 'Weekly' | 'Monthly' | 'Bi-monthly' | 'Quarterly' | 'Every 4 Months' | 'Semiannually' | 'Yearly';
@@ -66,6 +66,36 @@ export interface Strategy {
66
66
  allocations: NamedAllocation[];
67
67
  signals: NamedSignal[];
68
68
  }
69
+ export interface SignalNameExpr {
70
+ kind: 'signal';
71
+ signalName: string;
72
+ }
73
+ export interface NotSignalNameExpr {
74
+ kind: 'not';
75
+ signalName: string;
76
+ }
77
+ export type SignalNameUnaryExpr = SignalNameExpr | NotSignalNameExpr;
78
+ export interface SignalNameAndExpr {
79
+ kind: 'and';
80
+ args: SignalNameUnaryExpr[];
81
+ }
82
+ export interface SignalNameOrExpr {
83
+ kind: 'or';
84
+ args: SignalNameAndExpr[];
85
+ }
86
+ export type SignalNameCondition = SignalNameOrExpr | SignalNameAndExpr | SignalNameUnaryExpr;
87
+ export interface StrategyAllocationDraft {
88
+ name: string;
89
+ condition: SignalNameCondition;
90
+ holdings: Holding[];
91
+ }
92
+ export interface StrategyDraft {
93
+ linkId: string;
94
+ name: string;
95
+ trading: Trading;
96
+ signals: NamedSignal[];
97
+ allocations: StrategyAllocationDraft[];
98
+ }
69
99
  export interface EvaluationOptions {
70
100
  at: Date;
71
101
  batchSeries: Record<string, Observation[]>;
@@ -87,11 +117,69 @@ export interface StrategyEvaluation {
87
117
  signals: Record<string, boolean>;
88
118
  indicators: Record<string, IndicatorEvaluation>;
89
119
  }
120
+ export interface StreamObservation {
121
+ symbol: string;
122
+ timestamp: string;
123
+ value: number;
124
+ }
90
125
  export interface BacktestOptions {
91
126
  startDate: string;
92
127
  endDate: string;
128
+ initialCapital?: number;
129
+ batchSeries?: Record<string, Observation[]>;
130
+ tradingDays?: TradingDay[];
131
+ allocationRebalance?: Record<string, BacktestRebalanceConfig>;
132
+ debug?: boolean | BacktestDebugOptions;
133
+ }
134
+ export interface BacktestDebugOptions {
135
+ logEveryDays?: number;
136
+ }
137
+ export type BacktestRebalanceConfig = {
138
+ mode: 'on_change';
139
+ } | {
140
+ mode: 'drift';
141
+ driftPct: number;
142
+ } | {
143
+ mode: 'calendar';
144
+ frequency: 'Daily' | 'Monthly' | 'Yearly';
145
+ };
146
+ export interface BacktestTrade {
147
+ date: string;
148
+ ticker: string;
149
+ leverage: number;
150
+ shares: number;
151
+ price: number;
152
+ value: number;
153
+ action: 'buy' | 'sell';
154
+ allocation: string;
155
+ }
156
+ export interface BacktestTimeseries {
157
+ dates: string[];
158
+ portfolio: number[];
159
+ cash: number[];
160
+ drawdownPct: number[];
161
+ allocation: string[];
162
+ }
163
+ export interface BacktestSummary {
164
+ initialValue: number;
165
+ finalValue: number;
166
+ totalReturnPct: number;
167
+ cagrPct: number;
168
+ maxDrawdownPct: number;
169
+ annualizedVolatilityPct: number;
170
+ sharpeRatio: number;
171
+ tradeCount: number;
172
+ }
173
+ export interface BacktestAnnualTax {
174
+ year: number;
175
+ shortTermRealizedGains: number;
176
+ longTermRealizedGains: number;
93
177
  }
94
178
  export interface BacktestResult {
179
+ timeseries: BacktestTimeseries;
180
+ summary: BacktestSummary;
181
+ trades: BacktestTrade[];
182
+ annualTax: BacktestAnnualTax[];
95
183
  }
96
184
  export interface StrategyModule {
97
185
  get(linkId: string): Promise<Strategy | null>;
@@ -102,6 +190,9 @@ export interface StrategyModule {
102
190
  evaluateAllocation(allocation: Allocation, options: EvaluationOptions): boolean;
103
191
  getEvaluationDate(trading: Trading, options: EvaluationOptions): Date;
104
192
  extractSymbols(strategy: Strategy): string[];
193
+ compileRules(strategyDraft: StrategyDraft): Strategy;
194
+ backtestRules(strategyDraft: StrategyDraft, options: BacktestOptions): Promise<BacktestResult>;
195
+ stream(strategy: Strategy, observation: StreamObservation | StreamObservation[]): Promise<StrategyEvaluation>;
105
196
  backtest(strategy: Strategy, options: BacktestOptions): Promise<BacktestResult>;
106
197
  }
107
198
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/strategy/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/strategy/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livefolio/sdk",
3
- "version": "0.2.1",
3
+ "version": "0.2.4",
4
4
  "description": "Livefolio SDK — market data, strategy evaluation, and portfolio management",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -33,7 +33,11 @@
33
33
  "build": "tsc",
34
34
  "clean": "rm -rf dist",
35
35
  "test": "vitest run",
36
- "test:watch": "vitest"
36
+ "test:watch": "vitest",
37
+ "ingest:init": "node scripts/ingest-price-observations.cjs --mode init",
38
+ "ingest:daily": "node scripts/ingest-price-observations.cjs --mode daily",
39
+ "backtest:smoke": "node scripts/backtest-smoke.cjs",
40
+ "prepare": "npm run build"
37
41
  },
38
42
  "dependencies": {
39
43
  "@livefolio/db": "*",